|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
) D8 T' D: d4 G. v" H+ ~$ C我是在DSP初始化这不太明白。5 I3 w8 V3 q; `
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。* Y) [$ `/ p/ b. E$ e6 [
Y: [) E/ A1 @7 ~; C! Z6 ~! c" M# G! L0 {# ~8 ^
首先 PSCInit();//UART0使能
5 z+ j1 S/ W) Q' s3 dvoid PSCInit(void), y8 x1 U( \1 p" S& d
{
5 L/ w( R& W; M // 对相应外设模块的使能也可以在 BootLoader 中完成
' ]# m8 T) w6 N6 ?+ X // 使能 UART0 模块: |9 Z% n0 J1 p2 _! J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, B# _9 A7 V" M& t
}- {! t# X% `1 J0 t
! y5 ^0 ~! j# d8 W; F$ L4 `0 T
- [. m) m# f: ?. }* J
然后是 双核通信的初始化 AppInit();
, C1 c5 w6 @9 G" jvoid AppInit(void)2 n5 j* a% a- t" A* }5 y$ i
{
! ]" d) x m# y5 E /* Structure to initialize IPC (see Ipc.h for definitions) */6 T) ?' }4 D9 @/ N- }
struct IPC_cfg ipcCfg = {
4 m4 I r8 @9 m; Q IPC_DSP0, /* local processor Id */
+ D6 R1 O) T" `* l* v IPC_ARM_HOST, /* remote processor Id */6 |, \4 J7 I2 U* y2 S
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
7 S5 L/ Q& F7 c. _ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
/ u' H" U4 t' ^5 G/ P# [ NUM_MAX_EVENT, /* maximum number of events to be created */1 i$ @9 p9 E, W2 [9 p+ x& r
&ipcPvMemDsp, /* local side private IPC memory */
6 \6 Y7 M' s8 L &ipcPvMemArm /* remote side private IPC memory */9 k2 _7 P: v1 D) h% x. l
};
9 j' K \" _6 P) E2 [) Q; I' `- F IntDSPINTCInit(); z2 y+ ^; N1 {+ X3 Q# L0 l) _
IPC_init(&ipcCfg);/ |: J. Y# l+ N+ G% Z$ L
IPC_intRegister(C674X_MASK_INT5);1 \# D2 d, g, G3 @
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
5 x4 p$ M! }: U0 b @. p6 U* U! f( z# [$ R5 v! p! p
/* Enabling interrupts for DSP C674x CPU */7 p5 f0 l* m5 B4 j
IntGlobalEnable(); /* Enable C674x global interrupt */
- v! L# N7 \ V, V iAssert (Notify_start()); /* This will enable IPC interrupt */
4 }8 X# _! z. A) ?4 J}
a1 ?4 ^; p% P/ z3 r* f6 [. Q( Y+ p) j, q* g( p: B
然后是 / u6 f& y N: B) y
// UART 初始化' {5 s5 w8 D2 M0 @
UARTInit();
. f) E( g% X! A4 S# P9 b c; W2 c7 [/ e0 Z% V) E
// UART 中断初始化8 K; X+ s) s9 Z: ~! y8 G j( v, T
UARTInterruptInit();) {3 P6 b3 ~1 A H: k8 Y
8 D& X2 S: I! @+ ?$ Q9 u
. L/ S2 g: @4 C+ N% d/ W) Qvoid UARTInit(void)
9 k/ ~6 @1 ?8 }1 {; S* f0 Y7 e f8 F{
( L: R; ` e# ?9 F" @8 M* { // 配置 UART0 参数
% V2 s+ \8 T$ N( ]+ n // 波特率 115200 数据位 8 停止位 1 无校验位' ]# C3 r8 y" y0 E3 g
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,( p& o+ A2 T( b
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- n9 t3 ^8 [0 P) e5 h( w
// 使能 UART0
. I5 U6 G& |% o( a& ?, l- q UARTEnable(SOC_UART_0_REGS);$ Q7 X* Y5 z: Z: G4 d( l$ h
, I; i3 E t" x3 x8 u // 使能接收 / 发送 FIFO- h! c: M" C: J( q
// UARTFIFOEnable(SOC_UART_0_REGS);
2 v* _3 E' x: ^) U+ {5 x* G
' D$ i% J! m2 i: u6 M& W" A- V+ z6 Y UARTFIFODisable(SOC_UART_0_REGS);
1 [( I/ H2 W0 R& ^8 I) n6 a! c% B
// 设置 FIFO 级别 接收FIFO的级别
; U+ G- d; K" Q4 g' m) c p4 ]// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1); L2 T/ V! \. z" P3 Y( b" ~! K; ]
}
" G, q6 A& a/ `5 n
9 D' b O: E7 q+ b1 J9 g; \" d% B
void UARTInterruptInit(void)( A* O; ^0 j4 K! Y. L( n$ X! D( q7 N% i
{
; z6 W+ w6 a: h- n* f& F' x( T T IntRegister(C674X_MASK_INT4, UARTIsr);$ J* Q v/ O$ P, n
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
0 `# L, @+ A) E. L& @0 \ IntEnable(C674X_MASK_INT4);
1 `1 k" c* l% k4 y1 D# ?
) R7 B* s' [0 H' M6 a* s$ u7 [ // 使能中断+ ?3 _3 U( Q0 T
unsigned int intFlags = 0;
1 M- K r0 [3 N# H9 K# s* R intFlags |= (UART_INT_LINE_STAT | \
2 ]8 W; F1 M* i( r. ^, j! ? UART_INT_TX_EMPTY | \+ J" n0 \- N: B& A
UART_INT_RXDATA_CTI);
! ^- T& a2 z5 D, ] UARTIntEnable(SOC_UART_0_REGS, intFlags);
7 B: A3 `2 M7 [2 V}
2 x1 }. f$ ~( s: ?
3 z* w& O# d' Q, _+ I
1 \* A- p8 Q1 J, F/ xvoid UARTIsr()
& A7 x) }8 g5 \/ V: }{
2 h$ D b6 J1 e6 A: J D static unsigned int length = sizeof(txArray);
8 o3 w& n4 j, F' f# P1 Q1 Z static unsigned int count = 0;
6 i" ? W7 a8 D2 T/ h T unsigned int int_id = 0;
- Z& B# t2 ?5 ~8 r3 t$ f! r2 P: J% S' Z) s. f$ z, c) v
0 B: H! I3 V( Q N; O
+ [3 h3 V$ e. `. \; a! L, d1 x // 确定中断源
/ I0 j: R v% p3 T$ q9 C3 \ int_id = UARTIntStatus(SOC_UART_0_REGS);) M6 d8 W* N( _+ Q2 D, b2 G: ~
2 h% `* F; y; s; I8 R3 j // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
% X2 E4 u: a5 c( h; Z! d+ s: p! P9 T. R; ^( s, {5 Y
0 r- N& U# a* s! ^ // 清除 UART2 系统中断- [) x. m9 I8 S0 O2 H# @4 @) Z
IntEventClear(SYS_INT_UART0_INT);) x1 g+ H+ J' P; l
5 {! p; T3 a, v% `& L // 发送中断
% ]1 M1 D/ w$ _1 y' z3 @9 o if(UART_INTID_TX_EMPTY == int_id)
* Z' ], P* i# F: v: n& q/ H* D {2 W' Q9 Z* ?9 O( } U% z
if(0 < length)
( Z9 z9 x/ I! m P9 V {3 S2 n- }9 p+ w4 Z2 \0 Y
// 写一个字节到 THR
1 W- c/ q, [; {; F1 _" l UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);% T& P O; h2 I$ t
length--;
( _* V- ~: o7 G* V% h' O count++;
9 i3 @% T. v1 N }7 @2 t# v* ^- c& S
if(0 == length)! E8 c# e0 P+ f( i
{) s. D! v0 r7 r. }& N/ D8 P m1 [
// 禁用发送中断
V' c$ E0 o3 H. i( f% q% k- U# j UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);2 c( d, y: g1 s* j% i
}
5 m: k/ e5 B% [# y3 T }
- z% `9 V/ A, C1 h7 r
' d6 s0 z0 z J( D, h3 F // 接收中断# ~- [* [7 b+ M: Q6 t" q' ]
if(UART_INTID_RX_DATA == int_id)
- y8 l8 N$ C2 R' v8 L4 c/ C {& U) z1 c: S7 j( c4 A$ T* r
if(status_a0==0)9 O, Z% v% I, w4 t
{
% ? w6 b) W0 a( v& X- [* } a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 Y6 [. A" k$ C1 A% w
if(a[0]=='#')( h- _! F1 g3 U0 S
{: K- w8 L1 M* p' U/ i$ y
status_a0=0x01;
7 S; w& `: a/ E7 ^( H& X# y. F# k status_a1=0x01;5 i: h& s! W/ i4 G6 f
}" _9 m& ^' L5 |2 E1 {, n
}' U0 Q$ k8 y# T& Y3 g$ [
if(status_a1==0x01)9 ?0 S' L7 D. x3 a/ N8 C |
{7 R! g, a! @4 z9 L" n$ V
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: V( y! M. a" ]+ I
if(a[1]=='R')# c! C8 A" A/ | B# t
{
4 X# w/ v: p, P# z" r" H. F. i: c" l status_a1=0;8 e. V0 D$ R5 |/ j/ v
status_a2=0x01;. H" g2 z# L9 z+ M# w
}
6 O- C+ k, [! k$ N: \ }
/ P+ S" a! f6 X if(status_a2==0x01)
8 @% g7 D' t6 y' E: @# \' C {
$ ~' L! d6 b# W" j/ F( j a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 g9 j( n! Q, @* K1 x1 c if(a[2]=='A'): G' b( j+ [0 w% Z8 \
{
9 h# d9 u+ [/ s5 l! x status_a2=0;. \2 h0 u5 G5 Z H1 \( r1 D" \
status_a3=0x01;9 P- X# H6 Q) W: }6 C, \. K
}
! Q6 v+ Y3 G* j/ R" B1 p% K }
+ t0 w( ^1 K1 Y) \2 u& u: R if(status_a3==0x01)+ n# X& o5 S/ U: r0 |
{! g1 [* v( h2 M( p, w
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; n2 [, U9 p$ ^2 q: x x2 W) T if(a[3]=='N')3 m% f5 ^; X- V1 R% n
{' M$ M. Q0 a" B* Z
status_a3=0;
8 w9 ?! B. m' F, {; W4 M status_a4=0x01;
' d6 w1 p3 E) {8 m }
, r4 [7 p) j" R& H }+ o7 \; }6 h g; n6 X+ W& j
if(status_a4==0x01)
' l6 b/ A9 r- [7 N {
0 ^2 Z5 Q: h; ?" q a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- M6 U; D z- H R% t if(a[4]=='G')8 n- c7 Z6 A. {5 Y0 \% E8 z
{
# p# r; e" m% S& K' [1 \! b* q+ B status_a4=0;" q0 P; X' G* e) k ~+ B4 O" o' f
status_a5=0x01;
% Q# I7 E2 i/ i. |: a4 n0 S }
) E4 ^5 }9 [. I% c8 l$ u* Q }
- r7 P1 v, ^ C2 a( a' _. e' G if(status_a5==0x01) D! \2 r9 W% t8 K5 x
{7 f( s* _* K6 |4 N. D: y9 x9 C
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( w, t \& t7 k+ t, i* H* h3 v
if(a[5]=='E')# ^: O4 o$ ^7 k2 K4 d2 V
{! y7 C5 q' A g" f; h+ Q
status_a5=0;2 J4 X6 r$ Z" f4 \2 C! A1 Z" t
status_OK=0x01;& q" R7 Q# O U4 N) [8 p
}6 H& S% @% ^1 `3 R7 c) G4 m- n+ C
}
- x* H! T( p9 W: ]4 J if(status_OK==0x01)
& g1 h: H/ J' w r {
3 }* S/ Y2 ^+ y2 m7 w& Q$ p9 h$ i) { rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 u: G8 z8 }+ h7 m: N1 s lengthrx++;6 E- J6 x8 b; q8 |
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
o! Q1 a$ G$ ?7 V2 I& g' n8 p {" z% b: W4 _) U
RecState=0x01;* w+ L* R$ V9 c& f* y! D& N! _
}( ^! v: C& @* b; g9 v* s# L
}' u/ Y5 ?4 L8 X2 a: m& f2 j
" ^& W3 n7 x6 ?$ j
}
' B& E6 A7 b; l# ^1 E- A. I0 f6 F4 ~2 V( H0 o* A
// 接收错误
% x3 @3 u+ e/ v4 b0 s2 ` if(UART_INTID_RX_LINE_STAT == int_id)
6 I% ~3 {+ v' w7 p2 @! J% e {
& u6 \6 h( P J+ x4 b while(UARTRxErrorGet(SOC_UART_0_REGS))
3 ~, }5 m) y: Q {( n# o5 a6 ^& x# U3 }
// 从 RBR 读一个字节
# ^8 I* @. ~6 [5 W4 U UARTCharGetNonBlocking(SOC_UART_0_REGS);
' A% n8 M$ v) y) O, w }
& r6 G. S! g& c' B; ^% c5 _( H }
/ ]$ h% D: X) M9 U# g+ y
# K' B0 O# \+ V2 \' a2 X; v return;
5 k& z& ?7 a) J- E! U/ P: Q}
) k) k7 s2 q; p* S# }" E; p0 {; x9 Q9 S2 K
9 [+ ~, Y! v$ H3 C
6 G) M9 `$ ~. C! [/ [; Y& } |
|