|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。, j' g5 E7 _6 s3 J4 q* `
我是在DSP初始化这不太明白。: z8 C& J4 l2 A
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。) Z+ S" Y1 b7 `3 y: s% Z
3 o* ]' |& F( C% U7 u9 w2 x" r: B9 l- A2 T9 d
首先 PSCInit();//UART0使能/ F C& n4 A7 u# \0 p. A6 s
void PSCInit(void) h# i1 T2 U1 W4 T$ z
{1 K/ g2 X1 D8 I8 P& i
// 对相应外设模块的使能也可以在 BootLoader 中完成
' t! z5 u8 y) b" Q8 O# p! A( Y r# ? // 使能 UART0 模块% m/ ^0 [ {$ v" A8 w& }$ q' P. a/ [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
2 d1 t% ~ n% O0 Z1 T( c% ]* Z}
1 _( s, R. N" s5 L
0 ]5 z/ F: j# A q5 L$ R4 S- A, O+ R# E% r
然后是 双核通信的初始化 AppInit();
! T! T% Q& v" b4 Yvoid AppInit(void)0 Z; e) H! I6 [) j$ {
{1 L$ ~" _6 W8 J5 J
/* Structure to initialize IPC (see Ipc.h for definitions) */# ?, V: C; u2 J- q# N
struct IPC_cfg ipcCfg = {
( u$ U6 X& q" m: L1 Q: h- N& R- R3 O2 c IPC_DSP0, /* local processor Id */
+ E! }9 M4 e5 I0 ?4 V, P+ ` IPC_ARM_HOST, /* remote processor Id */, @( I0 C% O$ k8 a4 e) \ ]% q
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */9 I; A' K/ Y5 h
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
/ q& r* T( K# f' B NUM_MAX_EVENT, /* maximum number of events to be created */" O. G" J# ^( z# P3 @- _' K* }1 ^% n
&ipcPvMemDsp, /* local side private IPC memory */
! j# C D& f( F1 _ &ipcPvMemArm /* remote side private IPC memory */- e7 l. O" H( P" A0 O
};! C: v) S9 e; Q' H ~6 g: p' \: Q
IntDSPINTCInit();
W) ?, f' {! L) e IPC_init(&ipcCfg);
' V! q. z7 K! Y, z' ?/ [ IPC_intRegister(C674X_MASK_INT5);0 @7 t* t' J" B- ^
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
" q" ~5 ~* x$ e( V$ Y- Y4 V6 d3 s) ?5 w2 G. N1 y$ {
/* Enabling interrupts for DSP C674x CPU */
8 j/ n( a1 w' x0 t! w IntGlobalEnable(); /* Enable C674x global interrupt */( @5 Q; S' t1 I# o5 R) l m4 `/ s
iAssert (Notify_start()); /* This will enable IPC interrupt */
! G# O! N) ]8 S3 W& g6 \! |2 _/ c}
4 X C, M+ _9 t0 H7 a, S2 H" M8 Y9 {1 R0 C6 L
然后是
5 j4 j& a6 o* B/ d6 Y- p7 u! N // UART 初始化- E" _9 Z: A& T
UARTInit();% E$ s b, d8 Q, d w
0 X& q4 W0 }2 \) `& v4 }
// UART 中断初始化
. h+ ^# ^0 j- a2 t UARTInterruptInit();
! e; K3 O6 v$ O1 _6 f5 T( g2 V
& s2 }, @/ u* T" H& q* t; i. d; z/ J3 N) k4 ^
void UARTInit(void)
/ v2 o0 {6 E- }6 Y{
: M+ j2 O( B+ l% g // 配置 UART0 参数! V1 ]; `6 o' v" Y- N! T
// 波特率 115200 数据位 8 停止位 1 无校验位
9 }4 u- W! b7 O9 X: h: T0 L- e$ O UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
! J! W7 B: G. X8 N" w2 \ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ b; i; `5 e+ m0 I0 Q
// 使能 UART0 s- ]! S: O( ^2 t1 P8 U4 `
UARTEnable(SOC_UART_0_REGS);
% G" s7 g; J. O& Q* Y- _5 n, m7 ^1 I3 s, [9 h7 I
// 使能接收 / 发送 FIFO
; U2 e2 V3 k! \- \; [% d// UARTFIFOEnable(SOC_UART_0_REGS);
, A8 g$ _+ j; v3 Y2 I' u4 v
( A) p- o! R3 k$ z4 E UARTFIFODisable(SOC_UART_0_REGS);
; l# c7 u5 j( H% x% N: C9 e& U% |6 U& p( c
// 设置 FIFO 级别 接收FIFO的级别
% A: v9 a/ }2 W( m) V$ S) G/ e// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
! \4 y- v1 \( \. `; Z! @6 V0 U! x}
; W0 i7 i9 c$ u# M& l; X# K* f: {% r; l3 Z3 T4 v; ]- t% Y. h
5 d* W8 e; h, B& s9 c2 {0 a
void UARTInterruptInit(void) y# S1 S- b2 @: G, Q2 ?7 O
{& F _3 ^% @4 K7 O
IntRegister(C674X_MASK_INT4, UARTIsr);
& v+ _/ q- p1 j9 n- p# o) Q IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);& }# p- N a$ y. M1 a$ G
IntEnable(C674X_MASK_INT4);/ k7 Z" c) c- [$ f3 H
) D1 w3 S0 g! X+ P8 ]$ I // 使能中断
) z! L: H. L- H. O unsigned int intFlags = 0;
- ~/ z- S* y! }* r' |! z4 S4 j( U6 A intFlags |= (UART_INT_LINE_STAT | \
' J8 n: q) x- _( ~8 A6 l" M UART_INT_TX_EMPTY | \- S5 I. y6 l& A
UART_INT_RXDATA_CTI);' b- X" q9 f' q+ Q" q( z
UARTIntEnable(SOC_UART_0_REGS, intFlags);
6 _; ]) ]$ D: Q' d" t}
; X- z5 c7 [& }1 n9 ?) q$ Z K2 O! x5 v2 S
* T, C( T1 c% u/ e& y. ]# p- `void UARTIsr()
- B2 _) H. D0 Q! W- U{$ o# |8 x+ `. q' |* G- h% k
static unsigned int length = sizeof(txArray);
/ y. j) ?: M5 x$ g$ U# Z7 [( G static unsigned int count = 0; L7 ?! X- u i2 Q
unsigned int int_id = 0;8 u2 z- G0 ~' G8 }! L
?2 \+ h" {" o E* j! T+ T q* X
# a* x2 S3 n. {! n* D! _" v) A
7 ]1 X- V7 t) b3 G7 ]& I' f2 i
// 确定中断源2 {* g5 {% M3 H* d
int_id = UARTIntStatus(SOC_UART_0_REGS);. S \% ^4 {$ F# T: Q1 p/ b9 d
]" ], N" f( W8 e0 b; Q
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。6 G& I, j! Z4 P) r2 R3 w; k" E( T$ w
1 N( G. y, k; Q5 U8 o# @) h! z0 c
8 f7 y, `3 m" b/ x { // 清除 UART2 系统中断5 C3 Z/ H E5 E
IntEventClear(SYS_INT_UART0_INT);9 C$ r! Q* e' O# v" W6 Z- j
# Y- k1 C! `- \, T! G
// 发送中断
! F! v0 ]" q4 H if(UART_INTID_TX_EMPTY == int_id)
' l- g, {5 |4 h0 R6 a3 |* D& ?5 _ {2 M( f5 U* s8 `, ^
if(0 < length)
+ s6 z# R6 R! A* Z. X. B { y7 O: {) t7 e" C ~0 q! D
// 写一个字节到 THR' m- _" w9 x4 U
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);1 [+ K$ c6 v( ]$ t* t
length--;
9 t( J8 T" c; m0 e" B count++;
! H; u3 K' Z) @ }& a" P6 h- n0 ]! @2 D: x# i* I- a% p
if(0 == length)2 t; L" K% j# x# c/ T6 }4 m8 K
{
L$ S1 ]- a$ n4 F8 |: v3 q // 禁用发送中断$ j4 q/ z* T' F( x9 K0 t
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);. g; b. y' t& Q, K
}. v0 T: V" I3 ? y% u7 A& _
}/ i; Y4 i0 b2 D& S
6 M2 X: Y7 ~( H& ~
// 接收中断
0 U+ V# P" ~9 [) C if(UART_INTID_RX_DATA == int_id)
) [: Q# L, {# Y: b/ z {. C* v5 W) n% p/ A9 a9 K
if(status_a0==0)
6 r% S$ h0 a' f$ n9 T/ n2 }# |- ]( ~- }& j {" X3 }" ^+ b4 Z, t- w! ~
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& {* V: i) U% A: g if(a[0]=='#')
( w0 W j5 M/ m9 k( G$ L- l {
9 u5 o }& n m8 B2 | status_a0=0x01;: S$ V8 k1 b+ @! e) C8 o
status_a1=0x01;( Y3 s/ }* I. p7 I$ v- P* Q
}% E/ X7 K1 G% }- O# i1 z
}
. z" y3 O# [9 Q; i, U if(status_a1==0x01)
8 ]5 d- N, N1 @' ^' w {
. U6 t% T" [7 H" r8 x, K5 i a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, H* W; y$ q2 o1 A6 X; u if(a[1]=='R'). a( ?) b$ I- `) I
{2 f0 x0 [$ F* P) B# ]8 k( q: {
status_a1=0;6 {# m, A" V0 v
status_a2=0x01;" F+ y' @8 D; Z" l% g
}
% Y! e' `- A% U }
' o& |. }% p! n& [$ N/ b. \# Z* h2 W if(status_a2==0x01)- l& r y/ h3 U7 D0 m" e3 h3 n5 L
{3 i2 g) A% @: U0 q4 \
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ A4 T; Z o' T" \( L6 \2 x if(a[2]=='A')
+ k9 W% {3 F! \* M$ k {: X( R: N* X' l) C- o! [
status_a2=0;
2 Y1 N' O6 s* e* F5 r6 ? status_a3=0x01;9 a- `6 f- P s) c) C! x
}0 ]0 D8 z1 ?+ l- K
}9 F$ x! z& y. Q
if(status_a3==0x01)3 m. l! y7 h+ t
{2 Q+ G7 Z+ E7 U3 Q5 y+ ?
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS); V. R6 H9 U9 P- P% M+ O
if(a[3]=='N')
a& }* T% H' ]1 T4 A! t {9 D4 R3 ^9 y5 B
status_a3=0;
! N- r$ U6 T* M# w; j% M status_a4=0x01;
8 \! Q7 Q" ~! b- ?1 q }
/ P; R o) C2 e$ ~% c/ I: l. n }4 U2 X2 m* R/ n: ^; J; W( {5 K
if(status_a4==0x01)- B: u6 H' D. i/ a( ^0 H0 r
{
- D) w0 U# R: l a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 q; T5 g% I% m# j1 H9 c
if(a[4]=='G')/ r' g2 Q/ ?0 H8 L- l
{
2 P/ A/ @) T4 h- V: I status_a4=0;9 j* F& Z8 `1 F$ [' F& Y. a( l& [& @
status_a5=0x01;3 y1 J/ \) d. |
}) Y' q! k' U$ Q; k# G6 \& ?
}
) g& g0 k# q3 P* g if(status_a5==0x01)' D6 m% H, x) F/ h+ c+ s
{
! d" I! P" u! k) {9 o( |- S3 f3 U a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ V( U2 V" {" M& H y- G% Y if(a[5]=='E')
$ X, h, z5 {+ {: g1 J {/ _3 L, O) A. J5 v& u; v4 }
status_a5=0;, s" u* g6 i$ S6 i: N w
status_OK=0x01;
8 o1 s5 ?# K z; i; m+ P; O5 c5 c }- R& u' J; E% U# H" r
}% r9 h2 ^, |( k) V' b
if(status_OK==0x01)
- c8 i3 m- e+ y- d0 V3 Y# U {/ G4 t5 T( l* N# }1 M0 t
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 \' n" @! D* T, u- t
lengthrx++;# a- B% N: _" |/ b8 i! h
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
( K% N5 P. s% \8 d6 J- W) @ {# ]9 Y" M% ^# p X5 g; R9 i
RecState=0x01;
! C G! G% E5 q0 R6 ~1 H9 W }' \& l7 z2 E$ {5 l
}
3 G4 J C* `) J, R9 b% G' F% D, h, I6 Z
}
, d/ x |& j9 {0 y
5 y7 f6 T+ }1 k2 P7 m1 ~ // 接收错误
: V# _$ \9 R& G, b2 L if(UART_INTID_RX_LINE_STAT == int_id)$ v0 V/ n, n; Y, k b7 W
{/ ~2 w+ \$ u, a( a9 M$ B
while(UARTRxErrorGet(SOC_UART_0_REGS))( Z0 y/ u t+ j6 [
{
/ a, w6 `3 P3 Q // 从 RBR 读一个字节* ~6 n$ _9 b( n5 t# ^' u# v
UARTCharGetNonBlocking(SOC_UART_0_REGS);* Q! p8 f* i @: w' i
}$ W# D, H! E [, U0 p
}* h8 ]/ m$ t+ Z+ Y
0 C- K- C! f4 x, F return;% `3 \( X* f2 ?) o9 i: Q" |
}) Y0 z3 b" Z& V9 U S Z* U9 p% j
2 u$ Q( ~ Q; ?7 [# y0 T
4 S9 f1 y6 ]9 C" W& C o0 @5 h: a- H" W& d
|
|