|
OMAPL138双核通信,现在需要DSP核中的UART0接口。( h; n/ O6 y! g S1 t
我是在DSP初始化这不太明白。+ C7 L! C& |- o% R9 a% C4 I ]
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。! g) c/ i2 o/ G1 ^( U, @: W; K, b
: i3 k6 x) P/ C* w
1 |9 `9 Q6 p; C6 O5 { h& p! M, D i首先 PSCInit();//UART0使能) S* d* n3 `- ^. U% U7 | N2 d
void PSCInit(void)
; x. o/ |1 ^( I% L/ X{- M" s X& @- ? s6 L
// 对相应外设模块的使能也可以在 BootLoader 中完成- d6 w1 n* s4 V& @* H) H* v) m
// 使能 UART0 模块2 r9 t% s" v; ]( e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);1 k j* g6 T! {/ z4 X4 L; i
}
; d1 v% e+ ]3 F6 x$ A& c+ l3 r- \+ {6 T
3 M6 V, t3 @2 n4 | r
然后是 双核通信的初始化 AppInit();, d+ }) W' e) j9 x1 ~
void AppInit(void). R# w: @. o6 }+ I3 w: {
{
% c- y0 F( F2 ?. y /* Structure to initialize IPC (see Ipc.h for definitions) */; X2 c) f( I0 l& T3 P4 [
struct IPC_cfg ipcCfg = {
" |3 R5 a% t7 Z4 S2 |: R* q IPC_DSP0, /* local processor Id */
& D: k7 H) h$ x IPC_ARM_HOST, /* remote processor Id */# _0 z: U) O1 \* R# w7 w
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
8 m& C" G# _# X IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
g; ~& J h. x6 ? NUM_MAX_EVENT, /* maximum number of events to be created */# H# ?' Z1 A4 u3 \' `
&ipcPvMemDsp, /* local side private IPC memory */, a# ]; d4 X9 u: h& l
&ipcPvMemArm /* remote side private IPC memory */
% A2 I6 Z5 z8 ~3 O3 P };) W6 T, {# q0 Y0 Q8 O
IntDSPINTCInit();. W1 o# |3 O- U+ S$ g
IPC_init(&ipcCfg);% [% b. k$ U/ c# t4 |# t
IPC_intRegister(C674X_MASK_INT5);3 {! l8 Z- B1 G) _" P
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
8 }. H4 s* f& |
: G* w& O' a# v" f1 U /* Enabling interrupts for DSP C674x CPU */# z7 t/ X f( k% i: l0 `8 _
IntGlobalEnable(); /* Enable C674x global interrupt */$ ?# B! J5 ]% @& v& d8 M6 C
iAssert (Notify_start()); /* This will enable IPC interrupt */
x! C; ]$ ~& w}: z3 S0 B- }; S7 }2 ?: J0 a
3 u# a! n6 Q) M8 i" K
然后是 5 D' i0 i' b3 q& [% l2 u ]
// UART 初始化( n k, \" q% n9 t( ~
UARTInit();
# I2 f# `- l* U) C0 h8 Q
( L" I; g+ V6 b% i; R // UART 中断初始化
( ]5 b3 K4 a5 i% a UARTInterruptInit();' j, u0 F5 @2 [/ R5 _# D1 I" G& ]
$ s) ^2 C! [. [5 a2 `
. U$ o! S5 l2 G! R* k+ j) Tvoid UARTInit(void)
& k: _6 z0 P$ [{" d% r6 _2 V, p% \
// 配置 UART0 参数% J2 V1 y k) S. z( Z& k
// 波特率 115200 数据位 8 停止位 1 无校验位+ x( X( V2 [3 L% n
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
1 ?. f( ^& }% n- |! `& m9 W) W' {, U UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 X4 K3 b" q( ]$ X# Z, D // 使能 UART0& H9 X$ o, H# z7 r6 U) K3 m4 q
UARTEnable(SOC_UART_0_REGS);
' P6 q( {0 W+ q) g& p- ?3 G1 w; O7 L: A
// 使能接收 / 发送 FIFO, c: w) c8 d: |. |$ K
// UARTFIFOEnable(SOC_UART_0_REGS);
$ ^3 W7 o% r8 T* q' o: n/ u5 b- ^9 g" t9 i' q+ `4 n8 I
UARTFIFODisable(SOC_UART_0_REGS); ?- Y4 _0 h) g+ B" W
* o6 x$ W$ l( a- A
// 设置 FIFO 级别 接收FIFO的级别
: s" g; e" e) r: P! p' R// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
- n9 {5 ]- a8 l& m& ^}
# I5 d3 m! j8 [& X. S& {
3 Y3 }0 Q& e1 I }: A" S7 Q9 t: ~% O, g/ k/ A- x( l
void UARTInterruptInit(void)- N* x9 V$ R3 {, F% b+ f2 b6 d
{
. R( M5 } d1 I5 O3 M0 I; u# n IntRegister(C674X_MASK_INT4, UARTIsr);
! E4 L% ?" e# J% x1 ] IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
) P* m6 T ^/ `1 [4 H$ `5 F IntEnable(C674X_MASK_INT4);
& M- O H' J8 U o0 v2 ]' R0 ?- P' u' T: p2 j+ P; w* v2 v" ]6 F
// 使能中断
, {# t7 z- g, c0 u6 R! d$ C unsigned int intFlags = 0;
% ~- e; O' k G% m& U" }* b intFlags |= (UART_INT_LINE_STAT | \: R E- q/ E+ n4 A& X
UART_INT_TX_EMPTY | \8 R) y4 D% G" b3 B7 l
UART_INT_RXDATA_CTI);7 \, a0 U4 W8 R3 M/ S) N
UARTIntEnable(SOC_UART_0_REGS, intFlags);# f& x+ ]3 a4 y6 ?8 r4 K
}
$ H/ [+ |; W9 X
! h1 v, W3 r4 R0 {/ x
9 J0 L k+ n. w8 b& Zvoid UARTIsr()
/ t- J" D* D' O! o4 T3 A8 ^{4 z7 n) D+ e8 Y; r4 |, v
static unsigned int length = sizeof(txArray);; D2 J* \$ |/ C3 ~+ c) f8 N
static unsigned int count = 0;: G* } o( ?: C' c! V+ t K+ R
unsigned int int_id = 0; x* {( w; s5 M5 ]4 T/ c/ N& c* F
, N' C9 R+ ?9 M3 w" A8 a3 S% \8 s0 C& K
% U" W9 K; y* |, J- T3 \ // 确定中断源
/ |' j+ _. K6 W8 h# h int_id = UARTIntStatus(SOC_UART_0_REGS);. f* T. ~6 W* U! ]5 `6 {5 Z
9 Y, o! Q+ w |/ }4 B; r+ u3 e // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。7 T- P* k* b( H o9 g1 H8 {
, Z. A4 z' s% m) @8 o* F
W" ^. W; p- v+ Q' }" G4 P
// 清除 UART2 系统中断$ t! f' I2 z2 b7 q* H, p M
IntEventClear(SYS_INT_UART0_INT);
/ C/ o- W B: x4 V# b% l, N. I) \5 g) B! I! F
// 发送中断* u# C3 A% }9 C! C3 _5 N/ { p; s
if(UART_INTID_TX_EMPTY == int_id)
+ d% u, m& J+ t) x1 g) m, P1 A5 ?7 c {
1 N9 {5 d! a% G! [& P" b if(0 < length)5 p3 Y$ z6 b5 s+ _( s2 L% _
{1 I! P' p3 u: w3 e
// 写一个字节到 THR X5 x9 t# ?; z) W5 k- v
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
5 N( n: j4 \# U' x8 ] ?3 T length--;
5 V" o5 z7 M( T) F+ W3 r# a) a; K count++;
9 N, ?! y' H5 q' s, j5 [ }/ p8 n: |+ e3 T1 m5 p# v
if(0 == length)' ~, W3 A: d, e
{
/ N- Q7 X& u* [9 D // 禁用发送中断 d# y, p9 }. m7 L
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);. n5 S5 Q7 |5 E u5 g
}5 T- }' X4 z+ ~" b8 F% B d
}3 ?" D. f. R1 [; v8 L9 a; C2 S
1 j+ ?( `5 F( a5 D4 T8 k6 u // 接收中断) z; B- z% H7 U/ B; k- q
if(UART_INTID_RX_DATA == int_id)5 R" H) o8 [9 ` I; x u" V
{, ^& R6 x* ~$ T. ^; y
if(status_a0==0), O/ u$ J+ ~( _
{6 j$ m6 i& U9 i6 C7 j( l q' r6 d
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* ?, }# d& D" B+ E+ W- C+ f if(a[0]=='#')* H# K, a2 r5 c* g# F- O
{
) O$ j2 S8 U8 ^ status_a0=0x01;6 n" N6 e7 f0 |( Z
status_a1=0x01;
2 t: L" a* f$ ] }* [1 O7 u) X, G; B: {! L1 l% Y- ]' Q
}3 ^% v# ?( ]/ M
if(status_a1==0x01)
/ ]1 M4 {, o6 d {3 W: a7 p4 U2 Q- G& a2 y' f5 u" {
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 d! E6 \& p0 m# L
if(a[1]=='R')
) t7 w( ]% f( g0 D" h* k/ r {
. Q5 L1 H, n# N; o/ R& K, e& u status_a1=0;5 Y, i+ |& Y" c% v' p! F2 }
status_a2=0x01;3 i3 ]$ J8 R1 S2 J# S
}8 d) D* T% C: Q
}9 S" ^& V9 k- U* J) D J# }+ R
if(status_a2==0x01)
. h& b' A) U0 ?' H {' S4 }9 n7 K; [' W
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
T; J9 o; y1 W8 s: g5 W; \2 i) W3 V if(a[2]=='A')
+ y1 k" t2 R/ H) K7 |4 E3 y7 i {
" q9 [" D8 w; j/ ]- b9 n- U5 M status_a2=0;: t1 ]# M7 _0 o& Z: ^% {# r
status_a3=0x01;
V# T7 m, A7 T+ l, h8 a5 u, J }0 M% j/ q" B) r/ c) v
}: W& O- b0 F2 P6 m
if(status_a3==0x01)
4 z, B; K. E# S& K$ Y' @ {" q; T# U3 s) K: s) q
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( y: i( H8 N/ Y" v7 [+ a
if(a[3]=='N')% u+ S% S6 e! @* Q
{
& x5 }/ x& s) \3 @. m2 m status_a3=0;" c6 o; ~2 d7 D* T" f9 s( W
status_a4=0x01;* J! q: N* u: h: y( p: D$ G! Z$ R7 o
}# e; n; d8 G9 u3 o5 h- w
}/ C5 W T7 F& a- Y: P5 \
if(status_a4==0x01)
, C( p. N" G, T& ]( y3 x0 r# x {. `1 @2 i7 L4 n2 Q
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% Z# U+ q- ], B# S4 g* E+ ]
if(a[4]=='G')
& \7 l+ s0 B: \2 {7 z# [" W {) b( w( l. o' Z9 o* ~3 w4 e
status_a4=0;
, F# h- {) ]: ^" V* Y) _ status_a5=0x01;& `5 X+ s' W( ?1 }/ F
}
, I+ A) |" [3 e" T( I }
5 d2 g& k* [* n. F \+ { if(status_a5==0x01)- O2 x. y2 b) m& J' J( z1 d
{
/ t5 i) L" f5 J, f a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; B" o) d( m9 Q3 {0 t
if(a[5]=='E')
_5 ^) I r" G2 p* _ {
7 O+ l; V1 \% J/ {+ ^% j status_a5=0;
6 B ~) v! ]/ w. k. ~' }/ z. k status_OK=0x01;& K+ ?6 P7 y+ l( }7 Y
}
8 W3 ~2 ~6 K( e' C) G2 I }( k% I) X" }. ~7 L7 g2 f7 L& N
if(status_OK==0x01)
+ ~8 h1 q# q {7 t9 R+ H {
/ N: Y) A" I' b2 Z; |+ R rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ n9 i% d4 Q* _/ G" |1 C1 U6 E lengthrx++;
3 r2 s" F3 e% q' \ if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
2 l! k. x& }& l) | {
+ b4 Q- b J/ ]" w7 w8 `: p; w RecState=0x01;
% M5 p0 K7 a% j/ ~! J }" D9 }6 |, R" m
}
* h" y* W* X) K i0 ~( q
3 J& y$ u& ] J }7 g+ \! r. Y% m
; |) Y6 `/ Y7 V- N+ o- c // 接收错误6 L' M$ a0 G7 o5 r% b
if(UART_INTID_RX_LINE_STAT == int_id)3 g% A: x8 C0 S* K
{7 }4 u1 _7 ^4 z" t0 o/ _$ {- U3 v
while(UARTRxErrorGet(SOC_UART_0_REGS))
3 s* C$ G" k" |6 U {
" @: E5 r* h7 x( V% V8 J // 从 RBR 读一个字节% B$ h6 W& o8 P0 {. o/ f& w
UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 A3 E1 Z! L( @; ~ s }* R0 n; I* N" S& n% N
}
- v# s8 G5 F7 Y: _& d0 o, P9 Q) |8 U. F5 e6 I
return;
9 L+ ^( k# P: d R) n. g- O}) \+ _, b z8 q
: K4 V+ _/ J( ]8 d+ R, K4 W& F
9 _- Y# K, r+ S9 c3 {& u; T! |
5 ?3 m4 q" ^/ t# { d& e4 H8 Z |
|