|
OMAPL138双核通信,现在需要DSP核中的UART0接口。/ Q: d! c1 ^2 [) e7 a/ r$ s/ g, n$ v
我是在DSP初始化这不太明白。
i( F6 K3 Y* V4 S7 M初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
& Y# ~8 S- k: S0 ~7 x. \' @* i9 A9 `; ^ v |# f9 L9 |
; n- }6 {1 D1 A0 _首先 PSCInit();//UART0使能3 c, K: }4 N! Z, z6 B
void PSCInit(void)
1 W1 b) l2 D6 @# _& _# J) v8 ^) b{
' N9 B& b6 K/ Q ] // 对相应外设模块的使能也可以在 BootLoader 中完成
+ W3 e( u9 r- e7 b // 使能 UART0 模块
) F" q5 p! C# \/ z5 N: Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) ]# H, j$ @$ m/ ?
}- u B7 O" H1 d9 k; l# ]& `5 R" G, f
; G8 Q E! c! |9 S
; {- B5 n; p' W" ]然后是 双核通信的初始化 AppInit();
5 S3 K" V q. M7 e3 `' C% z+ {0 lvoid AppInit(void)
* V# [3 x m. {8 z. t{
* q) Q7 w w8 [ /* Structure to initialize IPC (see Ipc.h for definitions) */
0 ~7 {# ?$ Z0 {9 ]+ w struct IPC_cfg ipcCfg = {! g! `# y8 m/ |3 S- E* ?
IPC_DSP0, /* local processor Id */
' a. L6 J/ i3 d IPC_ARM_HOST, /* remote processor Id */
" }0 O( V# L- o IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */1 D8 Y+ r1 q) j) ]$ x! {) Z0 @6 J
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
) h/ J- i9 @+ u6 b" s NUM_MAX_EVENT, /* maximum number of events to be created */
, M7 \& D, o( h% p: f1 M# f( t &ipcPvMemDsp, /* local side private IPC memory */
3 ?6 ?3 S' n" k5 Y5 ?& z &ipcPvMemArm /* remote side private IPC memory */
" P$ l3 J" b d' O: f" r3 L# y };4 \5 g) q( C/ w
IntDSPINTCInit();
7 \2 G0 h2 e: K9 i- H7 U8 B1 {$ \ IPC_init(&ipcCfg);+ ?- M/ M, Y; _+ K+ U
IPC_intRegister(C674X_MASK_INT5);
6 D6 U2 j+ I* x: ?( x- K( o iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
; V9 G- a( h: y+ ?1 G% {, D5 p
8 |/ z: i8 x( g# g) K* c; z7 [7 M /* Enabling interrupts for DSP C674x CPU */ {! H/ y D2 @( \+ U5 _
IntGlobalEnable(); /* Enable C674x global interrupt */5 f7 \( g4 |4 u# `: i
iAssert (Notify_start()); /* This will enable IPC interrupt */
4 j M6 X. q; \0 P# L}
0 R( j+ r- I9 o0 F) X% Z
( C/ o7 w3 k5 f$ J& e% }5 u+ D% n4 A2 ^& Z" I然后是 # R7 B' q6 d' j0 x/ x
// UART 初始化0 ~! Z4 v5 i, j# M/ i& V, U
UARTInit();
6 g' d: K+ B; @6 ?( B
7 ~- }* g( `- G, | _" c' b // UART 中断初始化0 a2 i* p+ g _, }& b
UARTInterruptInit();
}" p/ b* |* M+ I* F
/ N3 @% p h( N8 R, `! z0 @6 k8 V, c( O! f, X' p
void UARTInit(void)5 L- `, L" w2 d% N+ |
{
h. r6 ` y$ B // 配置 UART0 参数
+ f u/ W1 d3 b // 波特率 115200 数据位 8 停止位 1 无校验位
% E& E+ @/ C8 d UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,) @) j/ J+ [2 N! e) a% D; h' n) N
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 c. n R5 U/ d& a8 F0 o // 使能 UART0
5 e& Q# j+ a6 {- o, e- F UARTEnable(SOC_UART_0_REGS);
' D# k$ u" B; n3 C5 b1 T* l; u8 ?/ j- [# F- a1 j9 c0 g
// 使能接收 / 发送 FIFO9 x2 r# ?$ I5 d# u
// UARTFIFOEnable(SOC_UART_0_REGS);
. g7 E, ~: v2 R3 J& |. N& R6 q" D h1 N( |7 U
UARTFIFODisable(SOC_UART_0_REGS);
6 |+ c# i* a+ T$ d! ~
% K- F' l- P5 } // 设置 FIFO 级别 接收FIFO的级别
; Y3 _4 V" E( @0 E// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
4 s* E! M3 S0 H: z9 r+ u}4 {# e* m Q6 I. [
" g ^! M( V, z
" z, \. J8 r' | g) f, s$ H Fvoid UARTInterruptInit(void)
5 `# V/ w0 ]# G4 ~' \{) S# |) {; R v, c% Q+ X
IntRegister(C674X_MASK_INT4, UARTIsr);
1 k( }8 c5 `" X5 a IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
+ `3 z' W$ u' P* X# X3 w IntEnable(C674X_MASK_INT4);
# }2 U! V8 Q( e1 L* |' f3 ~5 i/ H+ \* g
// 使能中断- L3 \6 n5 B# J1 A" C: L, o
unsigned int intFlags = 0;
1 N/ c4 R6 C% q6 f5 @ intFlags |= (UART_INT_LINE_STAT | \
6 e- J0 q; K0 I. E) X! x4 w UART_INT_TX_EMPTY | \
3 z; Z5 [) P$ D* G UART_INT_RXDATA_CTI);& Q7 g. ?* l5 z) G. v
UARTIntEnable(SOC_UART_0_REGS, intFlags);
* M- c$ Q) m$ I' t4 t7 i}, m2 y+ O. g. n
% z9 W0 D2 Z% h; E
1 U8 h: V8 S7 T; |& W
void UARTIsr()- u4 |5 S5 [3 X( u0 A& X
{
1 [& o7 z& q' K s1 j3 c- l static unsigned int length = sizeof(txArray);
* W+ Q8 h* x3 s1 T6 L7 ?# H static unsigned int count = 0;" t2 a0 u" [/ p ^
unsigned int int_id = 0;
3 Q+ l% m7 z% s
* r4 `; }+ P, S( U9 G* S
: k0 ~/ A! x7 e: g4 o& r, c9 a- r0 p# L' x/ ~5 e% c
// 确定中断源
9 J- J$ e; Z8 o3 B2 x int_id = UARTIntStatus(SOC_UART_0_REGS);
% b1 W4 v* V) U7 Z; B
( Y6 y/ ^' |! l- c5 T/ | // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。8 l6 \- H. x! M4 j1 d6 e4 B# ?
0 j* t2 Z+ }+ W7 `2 _1 l d) T
: p3 y0 [9 a# A" W$ ~ // 清除 UART2 系统中断( ^3 t7 x; v' }/ \" U
IntEventClear(SYS_INT_UART0_INT);; P# C5 L! n8 |
3 N: r8 Y. t% X0 x s: f, \6 p! }
// 发送中断) `+ E/ X2 F% y2 m
if(UART_INTID_TX_EMPTY == int_id). T' Z; w! d# ?8 t" L. F
{
4 W# K. _' v, b/ s* q5 h6 \ if(0 < length)7 o( ~1 ^; W: e; ]1 f3 N
{' w/ p7 M7 c, G3 r
// 写一个字节到 THR6 _( Y3 l4 h5 T& M: r) U
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);. b a0 u- a5 B1 y
length--;
, U8 @8 B: }* r' p+ ~4 b b count++;
- d' k o T* T v6 O' d, d }3 ^5 v$ H* N3 A
if(0 == length)$ ^' R2 P4 A; }$ \4 ~: A
{2 i" u6 ^: p, M& v9 X4 J$ a* s w
// 禁用发送中断; r' n/ f; |7 ]4 ?! f
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);% ]4 }8 c& ?% D: k7 K) m1 d3 @# L2 C- e
}
0 O7 |2 C" k2 L8 w }! [" }! V: v' ?9 y
/ z; D; X" E0 H& ^" c
// 接收中断
* u6 o4 s4 B) z7 C$ q+ k) l if(UART_INTID_RX_DATA == int_id)% u0 o- z" e7 L! j/ w8 z' J2 w/ ^
{ @4 m1 e6 ^( D" C
if(status_a0==0)
+ `& x2 M2 M% C {
3 X4 T7 Z( b. X* B* r6 a a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 H$ o E9 }' V! k' c- O
if(a[0]=='#')' b% K$ s2 S: ~$ a2 N
{7 z1 O6 Q1 `7 n+ o# W/ d- e% }. i1 z
status_a0=0x01;, m9 \* T# ?# ?- S" X
status_a1=0x01;
# `+ l+ H! l- I3 q/ c E2 S }
. U7 G4 r. Q) Y" f! b8 d" R# B }& L6 J9 P7 M5 @8 L
if(status_a1==0x01)& \' m( E8 b; P+ u
{
) E' E/ z) |" m$ z/ D/ h& Z8 s a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);. k& ^3 B% U1 ]9 M
if(a[1]=='R'): X! O) S( w# {) w
{
2 {& e) [, D5 [+ u5 C. I status_a1=0;
: d2 F+ \8 h8 ^. X. O status_a2=0x01;
2 r6 T& ?/ v% d" F }/ r8 W- s+ c" z
}2 x1 u8 x9 I6 {1 u% O
if(status_a2==0x01)7 i2 n0 N) f% `- c
{
' [: R& A8 b8 P a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, J$ u9 _( W1 n! S0 A7 ~! z
if(a[2]=='A')1 O# s$ m' l3 P5 ^+ D
{$ \4 @7 k$ N3 s k6 ?. x* A
status_a2=0;
$ @$ S$ w' a1 T$ n% X status_a3=0x01;! n7 [2 g; T" Y- v* {7 a6 m
}
! R. c- c4 l7 s0 Z% ?; Y- }8 g0 x7 E) n }
- {6 q% k7 t8 T" w4 \/ w if(status_a3==0x01)
9 V8 }! [4 [. z$ {* { {
3 [3 j1 w2 C/ ^5 { a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 x* q5 L4 Y" r" Y if(a[3]=='N')' y' l% `. E& Q( q$ I; T$ }( `1 B+ L
{* F2 S3 W* Q9 Z/ _4 i- R
status_a3=0;
! a' V1 p& N4 b, ^9 u status_a4=0x01;' S+ F- p- u! L+ u& C
}
: r8 f. m, z) Q6 F' R }
7 x' o3 s7 `( C a1 |, ` if(status_a4==0x01)4 c& Z1 l& R) }! ~$ v% d
{
F @% I2 r" _! W a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; g r9 g o& q+ @- f7 J
if(a[4]=='G')$ B$ o, F1 c. r: h0 R# X% u7 }
{5 ]' a/ |( z' T! P
status_a4=0;) p5 _1 [- G: ~/ g
status_a5=0x01;2 s, I3 r. N4 H H/ c* b: \5 K
}
, q: } X6 q! z) ^ }
3 L" X1 x9 b0 A; y \ d if(status_a5==0x01)
9 G0 ]# F. m# y {$ @' C( @: U9 K6 j( e0 W/ p; \1 T
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" Q2 @( [8 ^1 i7 W `3 x if(a[5]=='E') b% V- B" h/ B
{* v& r1 `5 x' q3 s
status_a5=0; S2 i S9 U3 J6 q+ c1 Y/ p! V9 L
status_OK=0x01;) w6 `6 R& D, o2 O1 G8 w z) n
}
3 s- t; p# r4 F# C. a7 K }8 J1 f& O" n2 _% R7 g
if(status_OK==0x01)+ B! l1 G# h! U9 }& s: P
{, H6 p3 O* E5 B; x4 M
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 Z2 A- E( O Q1 @ y6 T lengthrx++;
- L3 d' c1 U) l, n if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值); c. F& O% C$ k H" \, a" }
{- ~ P5 e& D0 n' ~6 H6 C& b
RecState=0x01;
* \7 y8 y2 |/ `' b l" _ }6 l- t/ K T2 j
}
6 X; J- @8 I' ~/ t! J5 [) v
2 r! d+ s) h6 z* O8 g; S }
, L/ M$ v" F( ^
) _# D1 p+ j+ a: j# n' W8 B" V // 接收错误
/ N% L, n( d: g, k' T2 L4 p if(UART_INTID_RX_LINE_STAT == int_id)
4 \/ _; k0 f5 U7 }+ X {
9 H+ @, h1 O9 |' m! a* D1 Y while(UARTRxErrorGet(SOC_UART_0_REGS))5 K, W/ e4 S) m5 y
{' Y! D, I/ h: T ]
// 从 RBR 读一个字节1 t& C4 O* K! }" Y
UARTCharGetNonBlocking(SOC_UART_0_REGS);
; U" @4 n D+ s. z! {: g' M ` }
i9 x" P2 ?0 d/ T7 g3 P* v6 L }. L; k8 |0 H# e# n4 e8 ~! L/ L) |
- f6 y8 @& ^, {+ @4 r* w% j. m4 }2 I
return;
) v7 A/ O. x3 i}
P* @# n; S+ ^1 W
0 G# D3 `' J* M' k0 O( m
) F" k9 v+ b9 c( P8 Z& p, A: s: ~: M7 d4 Z' @0 H
|
|