|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。5 ^3 | T% u: r
我是在DSP初始化这不太明白。
8 |" e3 o8 W* Q初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。! l. \, L. \2 N' a5 S! o. y6 w
( d4 Z7 L T! {4 a* q
% U2 i, {2 R3 T& H' ~2 S5 ~' i* F首先 PSCInit();//UART0使能& r/ B9 X$ i9 A5 G+ S+ h7 m" S
void PSCInit(void)
# p3 Z! Q3 @9 e% }6 U' @+ }8 ?, c{
9 h9 I5 P0 B+ O) O // 对相应外设模块的使能也可以在 BootLoader 中完成
4 L/ ?; H5 H" f/ h) K2 ` // 使能 UART0 模块
! R5 z- F+ ?5 h- x( I- \+ T0 Y PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* s- t- z- |3 j2 _& O6 p6 f; I4 n
}
+ k9 J$ V9 `& E' t4 Z2 c
6 t# r/ N; B) s7 m7 V* i' [
) R1 z ]0 @# X8 i然后是 双核通信的初始化 AppInit();& z+ v. N' D' q/ r6 j% [) p4 S6 a
void AppInit(void)
# ]( N" J4 Q: E; ?% p$ m- Z{, }* V$ S/ |2 N6 {
/* Structure to initialize IPC (see Ipc.h for definitions) */
& L) u3 U4 Y X" f, e" `! c struct IPC_cfg ipcCfg = {2 o" k4 y1 J7 ]9 Q9 R! s
IPC_DSP0, /* local processor Id */
- k2 ?, A' S. ?- |4 Q6 u8 v" _ IPC_ARM_HOST, /* remote processor Id */
d+ v$ L% @+ f IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */, H( I y7 ?: u
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
7 I2 y* j* V$ I( [; P$ u. G4 j5 z NUM_MAX_EVENT, /* maximum number of events to be created */! q- v0 ?2 O, Y1 Z
&ipcPvMemDsp, /* local side private IPC memory */5 b- m) s1 S$ U# U; K8 ?0 ^- A: E
&ipcPvMemArm /* remote side private IPC memory */6 }! \* O0 a N$ \. { c- {* `! U
};! K7 `1 y6 |5 x$ Z X! q0 I4 T
IntDSPINTCInit();
' ~5 _; p/ ^$ N) D, {; O IPC_init(&ipcCfg);$ g8 _# e9 F+ v6 n9 T- q
IPC_intRegister(C674X_MASK_INT5);
& [, \/ V; B2 B8 \9 E iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));8 k' w4 w$ S( p7 ~. R
; O; K1 F/ d9 N, T/ J
/* Enabling interrupts for DSP C674x CPU */( G; \' L& h% \
IntGlobalEnable(); /* Enable C674x global interrupt */* u1 U) o4 M+ X# R- x
iAssert (Notify_start()); /* This will enable IPC interrupt */6 R6 v) u1 z8 a' {4 K
}
& f' F6 q) Q+ n& l( C, ]3 R$ S
4 Q5 x4 x) N1 ]3 J) Y; O0 N然后是 % b; } }5 ^1 Z! \6 B# m/ D6 r/ Z6 C
// UART 初始化
! x3 U" p* A' g1 E' h$ v UARTInit();
, e! d% D6 [) g; _
! g" f. [4 k/ `5 v k3 b% q5 m // UART 中断初始化- B! x5 ]+ S* m' H! \/ i6 x, t
UARTInterruptInit();2 u+ }( U ^* M: Y, D' `
{4 ]! L- {( `. O3 s7 ^/ M5 R7 O3 F1 s" ^# a: ^1 O
void UARTInit(void)
# D5 b( ?7 V! \1 @% Z{& I0 R4 l5 J; u- ^! s. t
// 配置 UART0 参数( B3 A: s# ^" x% K" `: d' F
// 波特率 115200 数据位 8 停止位 1 无校验位 A1 G1 N t* L0 ]4 F5 w
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
# Y& U( e, l9 H( T% s UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
2 m5 c* n9 O5 ~% c" [/ [4 ~% T0 J // 使能 UART0
& E2 n" G! X3 e UARTEnable(SOC_UART_0_REGS);( D0 O8 B7 F: n. b+ d
7 g4 b: m9 f( n& D2 ?" P/ V. W // 使能接收 / 发送 FIFO' x; {! J% @2 `
// UARTFIFOEnable(SOC_UART_0_REGS);
/ M* A' V1 B1 ~% h9 L
: c: q% a/ h3 ?0 x# u& p UARTFIFODisable(SOC_UART_0_REGS);3 Q! W6 S+ m$ d4 K2 I8 W
# v, Q: t/ |" r* A# E // 设置 FIFO 级别 接收FIFO的级别
( X8 E8 x: S- l+ Q; A// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);( H8 p! \" l( i& d, r4 b4 \+ T
}
! E9 p" X# J0 p% E! I$ ~- {. D G4 C& p9 ~$ V9 S% k5 j7 b
6 \( p6 ]) d8 |) v
void UARTInterruptInit(void)
% }: a1 q9 r9 b{
k3 J# I$ D- a4 v* B4 B/ {9 v+ X IntRegister(C674X_MASK_INT4, UARTIsr);
: A. r3 U6 s2 e' H' o7 e IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);! ?$ [# W, ~+ D5 S
IntEnable(C674X_MASK_INT4);* e* o0 d) L& Z( P
' i& a2 R0 h. s5 R( _ // 使能中断# {3 f0 [. c, W
unsigned int intFlags = 0;
3 q; |7 S& h! ] intFlags |= (UART_INT_LINE_STAT | \ D3 x O. M( K" v4 f A: \
UART_INT_TX_EMPTY | \* V! I# J! S/ |1 U
UART_INT_RXDATA_CTI);
+ u5 y+ @9 o& K4 y7 U UARTIntEnable(SOC_UART_0_REGS, intFlags);& K( y0 q9 u5 Q
}% q3 n+ O6 b! T% Q5 T4 q2 Y
$ d5 F4 l" j: d. I9 v+ P( i+ S- ~# Y- w' y
void UARTIsr()
+ i* O2 ^/ C" Q; N e; v, c{
% Y0 N; Y0 t7 @; b5 X! l$ m }6 W static unsigned int length = sizeof(txArray);
5 D0 q8 K1 S; [5 @ static unsigned int count = 0;$ x0 u- k) M6 A0 D* x+ u
unsigned int int_id = 0;6 S+ B1 n6 _8 ~! p5 i
1 I0 ]/ F5 g. k0 I8 j. D9 I6 u; [- W% w/ b6 _) e
5 m. e; J- \) z2 Y$ ^: Z // 确定中断源
* Z! E" ?) Q, [ E/ g int_id = UARTIntStatus(SOC_UART_0_REGS);' C8 c6 ~: `3 ?' V/ w5 x
, l- T% @- K) I4 ?3 Q) ^ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。$ {1 n, S9 v Y. z0 I D& J0 A
& D! Y% n/ l; o) }, P* h+ g3 B7 t7 ?/ w4 R6 F- Z; y
// 清除 UART2 系统中断' h+ {) Z( a0 n! ~( T, o
IntEventClear(SYS_INT_UART0_INT);! z2 U& m$ W0 X+ p
7 p/ s* y0 }: w4 ? // 发送中断1 E5 s) E# _+ Z
if(UART_INTID_TX_EMPTY == int_id)
3 c/ S2 T+ f, L {$ l* l" S" I2 z, \ I
if(0 < length)
# G. s. ~$ |0 {# {' Y) J7 \, X {! q% }) p5 o8 F# M% `% e7 F& \! ?; \
// 写一个字节到 THR
( K. f- C, z( T- ~8 F UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
1 e+ t2 o) F: z! i" \ length--;; l0 A3 \: A- \: a
count++;
8 \( M# x9 z9 ` }
! n+ x$ Q# Z0 F; e6 h* Z if(0 == length)1 ~% t( E( r9 U, U) M4 A0 Y
{( R4 H$ `. n& K1 |4 K }5 ^: D% x
// 禁用发送中断# ] c; F. E! G4 w) X
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);9 }) t( h2 W8 |2 r
}
+ j3 D- e$ ^1 x+ `( b f$ ?% [ }* F3 F8 i" s6 |' P; I, p
9 u4 U/ D" t( T // 接收中断4 `* Y8 o6 h% X0 e4 i
if(UART_INTID_RX_DATA == int_id)
* n5 W, n. i S. d* |! C {2 [3 A$ Q) J- J" `9 {) F
if(status_a0==0)' h/ s4 N. u. E# P6 j( {' i
{0 b: M5 _: V/ V( h Z
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 I W1 L4 W0 G- p% t1 K4 z) v5 e if(a[0]=='#')
* b3 E2 U; x5 X4 Y) ]3 w {
$ A" Z1 i& x2 D) V) |3 Y/ i status_a0=0x01;/ |* ]& o# W# `# e) }: Z0 x0 \
status_a1=0x01;6 x; Q# `# Q' o7 o( R* x/ Z
}; Y% {8 [: C7 r. N
}6 o% B5 Q! u) v& o! u0 n
if(status_a1==0x01)
2 k6 k0 j( I: p9 z! y1 ^% D {
4 S; K$ n- f4 b/ l" t* q* K8 }# o a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! D+ N; k( ^) t8 ^
if(a[1]=='R')
% A9 M. e/ J8 V$ s1 i {* j* o/ y, t" o* e3 o( l. o
status_a1=0;# T! I+ P3 _& ]! ?
status_a2=0x01;2 o i4 B/ Q8 U& B f; G
}
/ W0 P3 K9 [. X( \5 z- L }: u& }# G F' O2 j& V/ f
if(status_a2==0x01)! w. H; U# {( m+ @
{4 J# P" M) N2 ^8 E5 F; ~
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 L& L: h, h0 V, a" `' T* {( i& i if(a[2]=='A'): S- E; d- b# c0 S' b; V9 G' \ j
{ \0 I( K4 e/ h) L" o% J8 P! w
status_a2=0;% A5 }! e" X/ h: Q
status_a3=0x01;
3 F( M2 h* Q3 I% ^ }
- m( X5 p* C' M, F+ P% s- a8 a }1 H1 I$ U( a! F: Q1 ]+ Q- s
if(status_a3==0x01)
% |8 u* B1 F3 e! j$ M* _4 j I: e {: E0 J7 `/ w* K# W' v1 c
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 A4 {" U R2 V" ~+ Q- v6 ^8 b
if(a[3]=='N')9 v& F1 b5 b8 \6 t
{
9 G0 ]" r0 o. _/ W# `6 U status_a3=0;
6 c! Z5 N1 ~$ @$ N, Z status_a4=0x01;
# L S5 K5 _) l) E# i9 n, x% z }" s' B, \# Q5 ^8 J/ X, y
}/ R G/ c! \) S
if(status_a4==0x01)3 z" @" U( P/ `) `7 w6 N# D: W
{4 k9 |) u& _& g2 l
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 Q% y, P) \% e' S- u$ J
if(a[4]=='G')
/ X) T9 ^$ W2 Y, n {
- F4 t# D- |1 p status_a4=0;' ]% y7 _; {, i, a7 j
status_a5=0x01;
: V( l; ]. o+ ?8 q @ }6 Z3 e8 g$ I: m6 y* Q
}" @+ {* R, i: d; x2 Q; [! W1 X
if(status_a5==0x01)
% E+ |) K9 H! L2 Z& Y! c, b! y0 w {
) s5 z' ^. g0 D. S" H7 D a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 Q. B. D$ d; e( x1 A1 D0 P
if(a[5]=='E')
( o' E7 H+ I7 f5 y" L4 s {
, q9 `5 K6 m4 j. V status_a5=0;
! x, v% Y6 [$ d4 l status_OK=0x01;
7 ~" R3 ~, K' \8 d6 a }! ~5 ~1 h& h* ?' k: o
}
; F( J' T M6 P if(status_OK==0x01). Q- Z3 O3 M" e/ |& y: @/ t& w
{
% u5 j* Z5 X$ f, L- p5 Q rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 k9 K8 T" R/ e
lengthrx++;6 A( Q" Y% d' M7 e
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)0 i+ y# t/ Q9 w) P+ M: P
{
# b" e. M2 c' m6 y# U# L% Y RecState=0x01;
6 d' X/ D4 t0 r3 S% V0 T2 w }9 L6 `; V. l: X8 B* ?0 w) C
}
3 m8 e1 F% q2 O8 P9 @( D' [- H
" }: ~4 G9 I2 |6 z. ` }
) s' C' N; `$ g$ m+ X7 A9 |, L* X9 N- n4 e0 [' g5 j1 d" z+ r8 j7 d% o0 v
// 接收错误$ g& P$ G: \. a
if(UART_INTID_RX_LINE_STAT == int_id)' R1 t- y) K, U& h3 ^+ i5 h+ p/ I
{) z# @/ V# i9 B. m% b! y0 p
while(UARTRxErrorGet(SOC_UART_0_REGS))
% ^& j% ?! @( y/ a$ X, H8 | {
" L) g8 f. b" W) V d- H8 Q // 从 RBR 读一个字节( L- }; j# q/ b+ q
UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 v, Z" C# ?5 i. f* l0 S1 M }/ |# j9 |7 c8 K" ~- \1 f. G
}
% z0 r, Z) [! N' H( Y* P% F8 a& m' t; h3 }! I) \ t C4 v. I- s
return;3 i6 {+ x# v6 G% V1 E! `2 ~
}
. L' u# j# u- g7 B1 \ \ C1 z' b+ `0 f, u0 p: _4 H+ q5 j: }$ i/ n
4 a! ~1 `! y9 Z0 A5 [* d; X
8 [, u5 z4 z, h2 V) [& h5 s! K9 |+ ] |
|