|
OMAPL138双核通信,现在需要DSP核中的UART0接口。- q- i/ L2 {7 R" I' Z- K: Q
我是在DSP初始化这不太明白。
7 ]2 v) d- d/ [8 }) J! e* P# }初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
! h! x+ o8 q# n
5 v/ | ?3 B( }- [) _$ E) ?. V: G3 I( g9 W
首先 PSCInit();//UART0使能% _, j0 X' N9 S
void PSCInit(void)- \3 V, ]) r5 J# O
{: y" ^, Y% \+ F
// 对相应外设模块的使能也可以在 BootLoader 中完成
( s( _+ V3 S' E7 f1 t! \+ |. y // 使能 UART0 模块: M) l1 g+ w# f7 R `$ _ r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);0 M( F3 W( Q5 S, N# P& F
}8 }/ {" c6 O q2 }3 x7 T. Q
( w* ]1 n( Q% K2 y1 N
/ u$ K; z ], R+ T9 ~* x然后是 双核通信的初始化 AppInit();* \# q0 O$ p7 t; S' t( c- _
void AppInit(void)
1 a B2 ^! ]8 j{9 G6 O7 P2 y2 o$ m( e# \; p
/* Structure to initialize IPC (see Ipc.h for definitions) */* J( i4 Y& a! i! D' @' @4 d
struct IPC_cfg ipcCfg = {
0 v3 v( |% p2 l- z IPC_DSP0, /* local processor Id */
- X9 Y# I5 L$ o, t2 Q! t IPC_ARM_HOST, /* remote processor Id */
2 x+ S$ k7 K- [8 A" V% a IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */8 A7 k4 Z2 @6 B k
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
; o4 ^" I/ |0 Y) ^- @2 |# k. {$ S NUM_MAX_EVENT, /* maximum number of events to be created */
/ N2 F2 V9 W3 d. ^* o+ n( z &ipcPvMemDsp, /* local side private IPC memory */+ u D j0 v `+ I
&ipcPvMemArm /* remote side private IPC memory */
4 K4 W$ i% D; ^( g4 V" b };; {0 C4 q4 u& @
IntDSPINTCInit();: z, @2 i% P& C6 G& U1 C9 M
IPC_init(&ipcCfg);
7 @" d; p G/ ] IPC_intRegister(C674X_MASK_INT5);3 r8 S% X* f0 ]( C( F: M) w" s
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
: Y( E4 b, R' m( ~1 V) D4 w5 X4 _8 D
/* Enabling interrupts for DSP C674x CPU */
( `8 A" J" d+ N3 }# B t5 r IntGlobalEnable(); /* Enable C674x global interrupt */
/ z& f7 }3 ]" t" e( q( j8 h8 Z6 y: F iAssert (Notify_start()); /* This will enable IPC interrupt */
* z3 I. f' m4 k$ s}4 W3 I5 M# f% v ^; @; u1 z6 I
% q# g* F( p; w# b" C! E然后是 ) }0 A: U* Q. x( \; l
// UART 初始化& h. i8 h' G9 \# d* {
UARTInit();3 Z2 ?& C* E; B* ^" n0 l
! q- H8 Y% L! j- w3 r // UART 中断初始化0 j" O/ Q* i( F/ p4 p. @0 L# v# V
UARTInterruptInit();! G( h" w8 v. K& \. G. O5 f$ y( e, l
+ P( v. ^, s$ y" }
* p! Y- o# T2 m# {1 \' l( zvoid UARTInit(void)
/ A* p$ C* }- N* C* Y/ D. F# b0 o{
. k$ u7 V' F$ F. a3 U/ Q: ?; A // 配置 UART0 参数: y+ G0 u, O; I4 B
// 波特率 115200 数据位 8 停止位 1 无校验位# F J) R# B9 A( R' q* ]; N
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
5 k1 Z# {3 n! J1 k$ Q* \2 P. K UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ o; \+ m/ E9 i
// 使能 UART0
5 t: F; M6 i3 P7 ] b UARTEnable(SOC_UART_0_REGS);; w8 G5 R% H3 Y' K8 \
8 @! q( r8 c( a* k7 m
// 使能接收 / 发送 FIFO( r2 o% a* h+ g9 ^. ~
// UARTFIFOEnable(SOC_UART_0_REGS);
N# B7 V2 b3 q [5 {! S! w0 F+ F/ m1 L1 A2 G( x* \
UARTFIFODisable(SOC_UART_0_REGS);
. m9 X# ` x1 \1 Q! u1 ~9 d4 o* w! v3 ]
// 设置 FIFO 级别 接收FIFO的级别6 J3 g. G1 j7 [
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);2 | `6 j% v9 e; k G6 y7 x
}
& ^! f: z' G# a+ z( A
& z8 w# i2 t& d9 Y
: j! k) O: K" Svoid UARTInterruptInit(void); U6 I4 H% s% W+ i2 B+ J2 U
{
9 X! b4 R' g6 R2 L" [ v7 |" o IntRegister(C674X_MASK_INT4, UARTIsr);
2 q3 L/ w6 p1 w+ K9 z IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);2 [$ |) P+ {; r* U7 K/ r
IntEnable(C674X_MASK_INT4);
. R/ E* [) _9 G
3 A# k8 ^4 |* N7 e/ q // 使能中断' ]# ^' w. `) G/ W( i; N3 r
unsigned int intFlags = 0;2 X- y* O; d- @. f/ f
intFlags |= (UART_INT_LINE_STAT | \1 `+ G4 f6 T9 j" ^! B
UART_INT_TX_EMPTY | \8 Y# B/ } y; Q0 W
UART_INT_RXDATA_CTI);( c2 d I! h+ g j' \
UARTIntEnable(SOC_UART_0_REGS, intFlags);
7 D2 E9 ]: b5 F2 h2 `# `}
; j6 x. w" G: @) r7 W
7 U, \0 ^6 Z( W. d( s3 s% I
8 p" K3 L! d/ P/ V7 w, V" Ovoid UARTIsr()
9 |, G4 P6 t2 h8 c2 W4 l{
/ y4 F; j. m4 n# Y2 P6 ~$ N static unsigned int length = sizeof(txArray);
1 r( ?8 p% I- S7 J0 u. m static unsigned int count = 0;
5 C/ |6 f' ^1 I/ {* s- P unsigned int int_id = 0;
, L- c; {1 o3 Q8 I$ r
3 g- |2 f G7 q" y
]6 F- R$ R+ u k5 n6 {8 y% c; Z) D# \
" F, @. R% ?& T& @; s! V5 V // 确定中断源/ L- Z3 C7 g7 I1 ~2 p
int_id = UARTIntStatus(SOC_UART_0_REGS);; o( u+ z: j1 [$ k
2 G" v( g! \. `, v$ H$ q1 w# b/ } // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。/ `7 b# `9 l6 c& S7 O& J
7 {! n; ? d, F5 i8 c/ a/ |
8 e z9 |; E8 w- k7 q+ ?5 a
// 清除 UART2 系统中断
2 f: r1 j, S) u8 Z IntEventClear(SYS_INT_UART0_INT);/ t2 e' _' f" H3 c" R) e
7 j1 b9 [ g4 w o, e
// 发送中断
. P: W% v0 c% ^7 a+ i% ] if(UART_INTID_TX_EMPTY == int_id)5 s1 g' c* |/ B* P) b
{, A7 a( C* ~) D2 h; d5 }0 K ~
if(0 < length)
$ l( E2 z& Q) ^ {6 g% t: V( C$ N
// 写一个字节到 THR$ W: ^% @* y# O
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
" s2 a) @" @4 o, S- ^, { length--;
# y/ C8 D, ?0 S S# A count++;
i9 l1 t# B% \' u }
8 y: s2 k8 u$ h, H+ W; S% { if(0 == length)/ {6 u) M! P3 j& o3 V6 P
{; D* d8 {; h1 k8 ^
// 禁用发送中断
- W$ L# o- A) f+ a: x% P UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
1 V. e+ a5 n0 W! L# | }
0 l: Q9 Z9 |, g6 q }0 j2 C& B. J* Y
7 X4 t/ e7 z/ ]" ]7 W // 接收中断" h* \7 J* ~- }# A" f$ s- G
if(UART_INTID_RX_DATA == int_id). l" m; |) P- _! ]$ G) S L2 o' R
{
$ ~ P! ?7 H0 ~ if(status_a0==0)6 u" H; `, ^! {0 q( |. n8 ]
{
3 O4 {! _5 o/ o" i: X4 t C a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 L" ^0 x$ D# v0 j2 n. q
if(a[0]=='#')
; [$ d/ w x3 \ {
' V2 q1 }) f" h1 w status_a0=0x01;& R. }, C! h" c6 g( H2 G8 Q
status_a1=0x01;
2 b, H5 E( u/ t' s; U }
2 ]6 @$ E. C8 p) Z0 p2 D }
! w3 I+ N2 x4 B- V9 z8 B if(status_a1==0x01). ~; p) v, I$ p6 M c/ B
{2 J% L" t9 }" X6 `9 `( |6 e& R9 o
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# c$ W& F* x1 h: b( @
if(a[1]=='R')! N5 n+ a& n/ e2 w" l& X
{
+ z) _: c9 N- ]/ j, s9 M, t status_a1=0;
% ^2 t5 p8 @( X v status_a2=0x01;
$ ~! W _4 [; K+ B }
, K; g8 @+ O4 I# N8 v }- l8 ?8 k7 n4 Z$ U
if(status_a2==0x01) S( U& v5 D" ]. H
{( v0 ^( c! G% K: l% w
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% s% U0 ~1 s5 l: M: i9 [) t) _ if(a[2]=='A')
4 _ k* A, f5 t! Z5 N, k, O' d {8 v7 b- { D1 t' k- T0 C
status_a2=0;3 f1 E" E) f% I2 ~8 w0 K( o# X2 e
status_a3=0x01;
# f% L1 o5 Z1 u8 [" p% z }& { I, X% h' L% b& r2 t; O" c1 [
}) q9 I% S6 a- X" V
if(status_a3==0x01)
8 L2 K X, b9 z. I {/ j; g0 P! o$ ^+ a
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 g6 e% Q( W1 D if(a[3]=='N')
9 a# A; V- Y4 ?+ h {
/ s( F7 b- i: b( m9 d- v status_a3=0;1 u: @8 {, N2 ^2 x
status_a4=0x01;
/ r3 a4 ?9 R0 g% f% b }$ o* h" M( V! S( i- C2 S8 ^
}
/ c5 d& U" e5 A& {+ L if(status_a4==0x01)/ K) P$ s3 {: n- A1 b# a
{
% ^( @5 w/ r( ]. k a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* v/ [. P' N) f M4 o! S if(a[4]=='G')9 `" j+ u# n/ C7 \, l. N
{
" l# L. ^- F' R# C& S status_a4=0;
( E% F" G3 q! u! ? status_a5=0x01;
& o6 N, [! X' Y* |9 _9 I }/ D, A. m9 q, b- ]; o7 M' M
}
7 e D1 o+ W$ j4 i7 w/ p5 g if(status_a5==0x01)
5 d5 f+ `$ y0 p& P {
6 Y4 Y" E6 P+ Y& [; M' ~% H3 r a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 f2 k, f& _% n' P1 \7 l
if(a[5]=='E')
8 @2 [/ o+ f1 P2 v- q {
- @" _) B4 B3 U3 c& A/ I. O status_a5=0;
0 a: r. Y: T7 j6 n4 E status_OK=0x01;* @; F2 Q, p; v/ v* ], ^
}: J' n/ e/ m) z! b9 \6 m- ^* `2 L1 F
}
9 B8 i4 q, E1 J5 | if(status_OK==0x01)6 ^% C7 ?9 O, t9 u$ `2 @
{$ J+ l" S0 {. d" Z. d( h9 \0 _
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS); _5 p G0 e ]! ?9 V
lengthrx++;
1 `5 ` _4 {* P if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
1 \# A7 ~3 B/ Z" s& K {
7 Q0 k" D( X% `/ X7 _. r( p RecState=0x01;
2 H! [( u$ S" { P4 X7 {4 H }
8 @' G; ?& Q2 b9 t' \, Y }9 N+ [6 K; [ X: X: j8 ^, h
- d6 z; h4 Q! o' l- n+ Z& B- v# {
}
2 O( ~& E- k: {+ |9 ?
$ G" X. L2 k [( R0 I% c // 接收错误! w6 H+ D* m+ U: W; C* y
if(UART_INTID_RX_LINE_STAT == int_id)! z6 u) f; ?8 `9 E
{% c/ C. m1 r2 e9 E
while(UARTRxErrorGet(SOC_UART_0_REGS))
8 \+ T" |0 i4 h" U {
& r7 @" k4 Q5 @7 n) }7 Q // 从 RBR 读一个字节
& \6 W% [; H; a. m6 }" _5 j UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 q' ?% a. ^; i1 U A4 n }: r; [/ W1 @) M( S
}
* R$ b% `; U7 K3 r$ F0 C* w# b4 [. H, Z/ F# l
return;
8 E- E4 T2 H! M" `/ i0 t}- I- b1 q7 u( d' Z$ G8 j4 u! b
$ n) [- Y4 j7 U9 `& |- {+ V
& X4 I$ _8 S' P5 K- D
7 b; r, [4 E! ^- W3 c/ b |
|