|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
$ ]/ X( h$ r, T, m! }9 Y我是在DSP初始化这不太明白。
. b3 r0 T+ w9 u/ S2 N初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
$ P( x* U- D1 v- X
! z$ Y7 R0 [6 J, u. a1 R/ \
7 Q' S3 R) i, Y首先 PSCInit();//UART0使能
9 e( h9 [2 B: a0 W; c( |2 A7 avoid PSCInit(void)8 {1 ]2 f% u* P9 j
{9 _! X. k& S1 e- p
// 对相应外设模块的使能也可以在 BootLoader 中完成! _4 W5 ?& C/ K
// 使能 UART0 模块, ?$ q! i4 v- d2 N2 N* O8 w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
) i3 Y* Y5 V6 k" r& M6 W. n' E7 \# D}/ E3 x+ K) E3 [) \
$ U: C6 b* G5 U+ a6 G* U* F
( [- W, e2 T: r, y3 K; o, D; O然后是 双核通信的初始化 AppInit();. L1 w8 R/ f1 V4 Q9 v) V
void AppInit(void)8 z, ?- f# ?* R
{' w: f5 B, f% A
/* Structure to initialize IPC (see Ipc.h for definitions) */
8 J3 x! l6 w/ r) K struct IPC_cfg ipcCfg = {+ N& h0 [* k4 [9 Q% r
IPC_DSP0, /* local processor Id */
; _' K) O8 g E; j* f IPC_ARM_HOST, /* remote processor Id */
2 G0 ~) e: t7 I" @! i IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
7 L. j/ P' W% T- z/ ]9 a8 L0 @ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */3 B3 p2 c* h/ E4 ~1 T- R
NUM_MAX_EVENT, /* maximum number of events to be created */: y) _6 X' k3 N
&ipcPvMemDsp, /* local side private IPC memory */
3 K, l( `1 g' E3 r &ipcPvMemArm /* remote side private IPC memory */
0 C6 l( `1 S9 U% U7 U };( ?6 q$ `* m( Q; O3 f; ]" q
IntDSPINTCInit();2 \$ _5 t3 X: m# R9 ~5 `& q# H
IPC_init(&ipcCfg);
% e* O$ R% R: L9 e IPC_intRegister(C674X_MASK_INT5);
+ W$ H$ o: f, I3 ] iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));* l- A, y$ l# G# P
0 H4 V% m: k4 s3 Z9 G" h/ {% a1 \% q /* Enabling interrupts for DSP C674x CPU */6 _( m/ `; D- i/ t1 O
IntGlobalEnable(); /* Enable C674x global interrupt */
4 i; n9 p4 {. B. A" j1 A iAssert (Notify_start()); /* This will enable IPC interrupt */% a) A, Q, X. H( I1 ]
}
7 H( u( {, t- C$ J1 l- a, R1 f! U1 g& P- }! J8 r9 [
然后是 2 }: M$ W" |9 v+ B, B2 ^6 W! W
// UART 初始化
]- i& j1 C2 l8 Y9 S UARTInit();
! I3 Y' e8 C# H8 z) k+ r5 S H E& O5 y% ?) v
// UART 中断初始化
8 S+ b4 i$ k4 @ h UARTInterruptInit();
/ W3 s& Z9 {4 O! O/ l" i9 n
5 g' {9 _* X1 i9 q# B7 G, l! p
void UARTInit(void)+ _7 y, U, \/ g6 E' \/ S: F. x
{ ^$ U8 U# G% \; x: w3 B
// 配置 UART0 参数+ ~! k( I7 \& ~$ m E
// 波特率 115200 数据位 8 停止位 1 无校验位
D1 ]" b2 s$ x1 W UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
9 k( Z" S# Q& S* S; o UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) I& K3 `8 O+ p/ x3 Q3 R
// 使能 UART08 T; t) ?5 M! n) z# d5 e3 M2 \
UARTEnable(SOC_UART_0_REGS);3 P7 M: h# m" z
6 d& D4 d- `0 a
// 使能接收 / 发送 FIFO
B7 E! S% r, B0 q% E( b0 Q: R// UARTFIFOEnable(SOC_UART_0_REGS);
$ e/ q! a( r& t7 d
" ]) z( w' H! Y& ?$ V) N' I8 G UARTFIFODisable(SOC_UART_0_REGS);& |9 L4 @+ |) t6 ~1 ~+ N
# e% T7 D, _7 B) t9 F o2 a
// 设置 FIFO 级别 接收FIFO的级别" G3 f) f! M- }, |& T: E. j* b
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
) E% V6 C7 f! L0 {' w}
6 I) c0 [: d1 {2 ?2 L6 t% W4 U0 ~1 R. Z. K2 @" p9 }
" F6 Z- U' z# }# N/ n; c nvoid UARTInterruptInit(void)" B" ~3 U Z# {& l% q% @
{
, J& T" N* i' B" }; S1 m+ ^ IntRegister(C674X_MASK_INT4, UARTIsr);
- k3 c/ h6 d" X+ v5 `1 n IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);" H; K& H4 I) V8 |; \( f! z4 [
IntEnable(C674X_MASK_INT4);
( W" _/ }1 z( r. e, L$ t
1 c* H- Y( L& B$ I" ^) l // 使能中断, j. @; I: M, k* R( N
unsigned int intFlags = 0;% C3 Y" n0 \1 e$ G
intFlags |= (UART_INT_LINE_STAT | \# {: D$ L7 g: P! t; c- W6 W
UART_INT_TX_EMPTY | \6 u. {! ^0 Z+ h5 ^5 ?6 @4 O4 r1 s
UART_INT_RXDATA_CTI);( \4 k: c7 s' U" L
UARTIntEnable(SOC_UART_0_REGS, intFlags);
* [# T* t8 o: E9 q" ~}9 S' h* A' L, M" u' Z; Y
; Z0 P5 {; d8 x( E+ W, p* @1 X7 b
) C: y7 W: }5 A, L. h! q& M
void UARTIsr()3 s) Z: N& v9 B
{
6 Y: h- L8 ?1 y' z% g+ x static unsigned int length = sizeof(txArray);
# o( k8 A' u: B$ Q static unsigned int count = 0;3 ~4 f7 m0 j8 s- m2 n6 v
unsigned int int_id = 0;
# Z( e6 m0 y( T
. Q, I0 g0 I6 z+ B7 J. R8 |' p0 J7 v |7 c6 v
c3 P7 p6 ]" h3 n1 ?3 {4 `1 Q6 w // 确定中断源$ m& ]& B- O( j0 p% b
int_id = UARTIntStatus(SOC_UART_0_REGS);
) y1 h1 l* n7 h$ k; D( F7 @
, s1 X/ e, e, {. d# g4 C$ ` // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。- O) P0 B% i* q! N, T
2 `8 _/ t' T" |' n- e; N8 A# o1 |( |; I% }% E
// 清除 UART2 系统中断/ u8 Y. \: B1 {$ o. s' D
IntEventClear(SYS_INT_UART0_INT);1 Y8 A1 U# l8 z1 Y2 q# ^
! }0 H1 a4 F4 ~- |- ~ // 发送中断( J7 J' S. Z' C* G) {5 _
if(UART_INTID_TX_EMPTY == int_id)
# C( X0 S% r3 f9 e$ N* N4 z* T5 E: e {2 Q5 g2 n' B3 S. c+ ^1 F/ B: `
if(0 < length)
7 X9 M% w4 k1 c+ q5 S {
/ q; N2 ^0 x+ f6 F5 C' I // 写一个字节到 THR+ g, [, k, X4 Y* W7 i
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);) n) c/ y5 k: e% C
length--;! f" F4 I, W/ W: [2 J) q& A
count++;! J$ T& t2 b& r/ l8 A
}
; L, G% I4 J+ K8 x, _& g if(0 == length)8 M) r' L) e2 q+ R8 b( p+ X
{
' a% p0 M% H" q3 X9 f // 禁用发送中断" c5 v# g( J0 S3 V. p' K9 G
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
; k! _1 k) }8 a5 Y1 f5 L }
! d! Q( K% \8 h" | }& [# Y1 f# j4 J$ j% c) @7 Y
5 L H1 R6 h6 m1 Q$ I$ Z // 接收中断
1 R F* C5 @% b9 a* N! e if(UART_INTID_RX_DATA == int_id)0 A% [6 s2 i- X2 N
{2 u7 e2 s3 E& G
if(status_a0==0)8 ? h x* _4 R7 U7 P9 \
{
8 A" R! P3 h6 L a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' r6 P. n) \; g
if(a[0]=='#')
) t4 M- R/ V' c! Z/ ] {* C4 h4 i. d, T8 O9 H' Q
status_a0=0x01;' \! r/ g B- x6 }2 o
status_a1=0x01;
7 O( y" W' `$ Y0 D2 R" [ ~ }
+ r/ Q# X8 y- k3 K }/ l3 y: X6 P, V/ _! V; c: y
if(status_a1==0x01)
1 m% m1 p* J6 }, o( n) o. n {
% k7 d5 J6 \2 R; [+ ]2 c0 J a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% ~7 t( F2 V% C" I
if(a[1]=='R')
. @# b" [5 }/ C {& w: O1 @2 J, j, p
status_a1=0;2 ]( Z, L6 x9 p a9 X
status_a2=0x01;
# N8 a" A l, O/ j0 l( r" P }
2 d1 C2 ^- E/ _2 F }
; ?4 I$ B2 ?* N3 O% t) N+ u if(status_a2==0x01)
+ O# _) I* ^. p) k8 Y {3 v& x! C: f+ i" d- a0 |
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* w: n7 E% t4 v' n: Q/ X; E5 C1 K
if(a[2]=='A')- J# c1 W5 J6 N- x; L" P" j- Z$ L
{1 r' C1 h! k0 C! g0 h! E
status_a2=0;8 f; y, q" @- B' m
status_a3=0x01;
, o0 |6 f! V3 i* w/ M% a& R. y/ s }
( z" y/ z2 \$ D- p" o }' a( z: Y6 R# U- z& P
if(status_a3==0x01)
5 d4 s, }) B7 G7 J, | { \! k3 P, I6 W6 \2 F0 L5 f
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& s" @, \( C. l% R
if(a[3]=='N')' W( \& `* Z; E" J* E0 j
{
. L( i+ \ C) |, D! g6 z* @* m status_a3=0;8 e: @7 n$ _# j% `
status_a4=0x01;
, w! j: M/ \3 h. t }6 y" C! \ W- b/ f& X& G
}
5 B! B% B7 [3 r+ T if(status_a4==0x01)
# `% |& t4 I: H5 D {/ e: {, I6 P$ y! M* h. P5 ]4 g, `. X
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 V$ T5 o7 K% I- l: l+ ~; n if(a[4]=='G')
3 z; u! C9 b. d. M8 I4 @7 T {
1 S$ U6 W `1 l5 M" }+ m$ H$ O# b status_a4=0;' m9 o2 b" h4 I9 ^1 Y) A0 M0 t1 r
status_a5=0x01;! z) J4 U' m. T6 B/ o$ \, q
}3 ~/ j c5 k1 Z: h3 k3 G
}
; F! D( f7 p! k! V0 ^ if(status_a5==0x01)( N# t& Q7 r9 p* a% ` U
{% e/ j' D' |. k& u! c$ I3 A# s( { H
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 c9 v' p5 z. Z if(a[5]=='E')% c! P6 G8 Z+ l2 G# Y
{
3 V' d$ o6 S6 r; I6 y4 ~) e; M status_a5=0;
! e( b5 s2 a4 \! k status_OK=0x01;
4 s- u! `) @# T$ I9 K" Q3 V }/ Z8 u8 ^* X5 R F: f5 d
}
: ^ w: U& ~5 X6 v2 U6 y" c1 b if(status_OK==0x01)
! H2 h. K A: l {6 v4 Y$ ?' l" j9 B. v5 M
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 P/ n4 d+ G. D4 A lengthrx++;
$ t D8 d9 P% ]" s* ^. S- { if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)9 J& l" @' ]8 ]6 U7 C
{
. G2 Y; f( m0 l+ H RecState=0x01;2 p# r8 Z" b4 ]# G' I2 X
}9 P8 C" @3 e& r8 T! c
}
W. M: [: f a0 h/ |$ q2 b0 w& J1 o
}
7 N( _" D# }8 x. D0 |
3 v0 Q. F8 D" h // 接收错误
) I: J/ y( J3 [. B9 v% D" y5 @ if(UART_INTID_RX_LINE_STAT == int_id); l. s# I* ?5 I
{1 I3 y* i6 Y5 C& l0 d: [
while(UARTRxErrorGet(SOC_UART_0_REGS))
0 q. e" R- K* @( ^4 \ {
$ H* d* b5 `. W X // 从 RBR 读一个字节 d8 h j" t# o6 t1 ?+ E# A
UARTCharGetNonBlocking(SOC_UART_0_REGS);2 L$ i3 O# d, l% g& l( ^
}6 t4 x D1 E3 Y! q( u- c! i# s. O; T
}1 X& C( Z* ~2 q# J7 C3 z k- O. _
W# w/ C8 e2 }8 m
return;' j( }4 p# i) g* B! N2 m9 [$ |
}8 H, L" V: b4 p+ X/ w7 w; g) F
( \" I: x) f- e$ d3 M/ z9 s2 _3 e1 }( m" a8 P
: W. l2 ~, T0 L( l# T+ j8 V8 p
|
|