|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
; Y: P& U' g, ~- l我是在DSP初始化这不太明白。9 D R/ h1 `3 F% i! ~0 Y
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
% r3 O! k# Y1 n2 ~; B3 U) y5 ]) b( d# e; H E3 [9 c
. Q* s: W! [: q9 t8 D0 \2 N
首先 PSCInit();//UART0使能
) c: q/ G/ J, | i$ [void PSCInit(void)
' {9 V; C2 f0 Y- U' A% o8 X8 P{
* C0 o, q4 m+ `1 Q0 H$ A // 对相应外设模块的使能也可以在 BootLoader 中完成, `7 S( T! g2 C
// 使能 UART0 模块, L% Q4 ~$ j2 D" b& G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) F/ o& _7 C; z7 A: B
}0 S* Y! G8 ~+ b) _
1 L# l0 A4 r2 v7 S- b% V' R, R4 I4 ^( }
然后是 双核通信的初始化 AppInit();
6 _' v, p- S0 h( m$ dvoid AppInit(void). c& _0 V/ W2 P3 e4 C) W+ M+ w
{- v* |5 P7 Y4 F# ?7 n5 j
/* Structure to initialize IPC (see Ipc.h for definitions) */% T) S0 ?# M- o9 ?0 K6 x0 r+ J4 W
struct IPC_cfg ipcCfg = {
A0 c, D7 b2 C& Z/ E1 R3 o IPC_DSP0, /* local processor Id */
- n; A' i% U( W8 r6 \8 p- } IPC_ARM_HOST, /* remote processor Id */$ [. i9 P' S1 E8 \
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */" k: t1 [; p9 ]0 F8 r& C
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */1 y& h0 l; B" `! L" I
NUM_MAX_EVENT, /* maximum number of events to be created */, _5 P$ N2 ~& A1 F! P5 P
&ipcPvMemDsp, /* local side private IPC memory */
5 A1 W2 y8 R2 z" M% O' U/ L( K &ipcPvMemArm /* remote side private IPC memory */
7 p& f2 |& c$ i1 B/ S7 |% f8 d };5 U" v3 F9 e4 E% m6 o" {( K" \
IntDSPINTCInit();
. M$ |! s+ H9 \+ A* x IPC_init(&ipcCfg);+ S/ W! O" q1 w9 P
IPC_intRegister(C674X_MASK_INT5);, |& V7 U$ _6 A4 v1 y* H9 T
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));9 w Y* t1 z/ i3 a6 Z: F
2 e% [4 N9 P ]; ^% j7 K8 \ /* Enabling interrupts for DSP C674x CPU */
9 c- }0 H% O9 t: x1 O0 d% Y A- ? IntGlobalEnable(); /* Enable C674x global interrupt */
/ s/ l/ S5 g: d5 E/ @/ I1 { iAssert (Notify_start()); /* This will enable IPC interrupt */
( \: B* ~4 z# w- b) I( L}4 e+ `& g+ K0 O: k h
0 m* w6 L+ K5 r, P# |$ u
然后是 1 \4 b" U3 g* A! L6 V$ ?
// UART 初始化; ^: w, ^ C/ c* R B' m4 o
UARTInit(); r1 z, o L' q5 e( o3 V
4 T% z) {4 N% E
// UART 中断初始化0 U& ~4 g+ h; `5 j! N
UARTInterruptInit();5 R# |9 R3 n* ?, c
. L+ J1 K/ d, a* `" L
" Y5 Z* ]3 ~+ u! |0 N: V
void UARTInit(void)
, @6 r5 d. u$ L, z, h{
: \2 j+ H- f/ L# w" z9 k // 配置 UART0 参数
+ d+ w, S4 \2 ^. p& D# w) d // 波特率 115200 数据位 8 停止位 1 无校验位
% P( r# h0 n$ I8 M UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,% t+ j" `% f y! M5 G* e
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 j6 a7 Q: O( [, n
// 使能 UART0
; p% g% ^$ V# ^6 F UARTEnable(SOC_UART_0_REGS);
: Z$ `/ e- ?9 S
- T* a S" g- @2 y4 s- l9 s: y" _% v" a c // 使能接收 / 发送 FIFO( g* {9 W! ]& z4 U$ ^( y
// UARTFIFOEnable(SOC_UART_0_REGS);( Y2 t4 T) D# D. \7 u. p( x: P1 K0 ]
+ |( K' j1 h/ I9 E, v7 ?5 ]
UARTFIFODisable(SOC_UART_0_REGS);
0 G8 H" \; V" a% E# \0 [$ g D- z, W. G+ C# f
// 设置 FIFO 级别 接收FIFO的级别
: u/ m( |7 N& S1 C4 P// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
* j8 j9 `9 e! v}
) \: B+ S O- c0 h5 e
& S5 r1 H$ O" I3 y0 B- Z0 X
1 d; |8 r& l, D* ?9 P( Fvoid UARTInterruptInit(void)
' e) h2 w- N' Q1 U{8 }0 Z# Q* L+ M" |6 P, K
IntRegister(C674X_MASK_INT4, UARTIsr);
7 C0 \. E, V9 S+ K IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
L0 S7 N" J2 B5 O3 w. l: w IntEnable(C674X_MASK_INT4);
( P* C5 l9 q; N! V& u& c6 u$ v {1 ]* ~$ y3 I; x3 w2 R
// 使能中断
/ Q$ N2 K/ j5 |, b, J unsigned int intFlags = 0;/ t3 j' i4 w: v. |* J# z- i `5 x
intFlags |= (UART_INT_LINE_STAT | \* M( D0 Z" r. D8 W1 A( o% C
UART_INT_TX_EMPTY | \) p! `) h# n% K, b# Z' n3 E. c
UART_INT_RXDATA_CTI);
' C0 t( T+ I. Z8 `9 p. D0 |2 Q UARTIntEnable(SOC_UART_0_REGS, intFlags);2 Q ~% D7 U/ r% a/ m. c1 W
}+ t/ s( I( D, S# M% \! ~1 w
# q$ H! O f# D- n5 s: Q
. C# J7 F$ N2 lvoid UARTIsr()) Z! l, X1 L: A: g- M+ Z7 U$ h2 y2 d
{
8 }6 q5 u4 C- [) f' e, [6 ? static unsigned int length = sizeof(txArray);
; A5 j0 @2 O2 J, M static unsigned int count = 0;
9 U1 P& b# R+ Q) N8 p unsigned int int_id = 0;
8 ?; l" L. \6 N+ h7 c
, l' `! a, ?# h4 i) j
1 \: I: G. P) j' z0 |1 i6 q8 k# t8 E* L9 [9 m6 Y5 ]5 I
// 确定中断源1 ~9 ~. b9 e7 `2 |
int_id = UARTIntStatus(SOC_UART_0_REGS);+ X2 A/ M `$ }7 \2 K& C2 {
* I _+ F4 t+ U& S" ]5 c3 w2 z( V, T // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。) C1 \; v/ M5 j( [
1 G2 a8 ^; _& A9 e, V; E* g Z
; q8 g% {+ f; t2 [/ Q* L0 i! d
// 清除 UART2 系统中断& x/ Y' [' o$ i
IntEventClear(SYS_INT_UART0_INT);
' e- u# {- d! I3 s" ]6 ^6 }8 b. D9 n3 B
// 发送中断
' i' V8 c5 d1 x if(UART_INTID_TX_EMPTY == int_id)
" D- K u, o" L, ]- ~; u% `2 S {
0 M7 A$ S$ [% F+ r8 ?+ G- L0 D/ n if(0 < length)( I1 b7 ~3 x0 z
{1 W- i* j9 |7 ^
// 写一个字节到 THR5 R+ e, N: U2 Q6 q, d' _) N
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
# q' c! J" q+ H% R) B0 O. b length--;
8 z) n+ z7 Y+ a6 s! |. y count++;; i, Y+ Q+ C4 a- _3 {
}
, J. w9 P" O: Z if(0 == length)8 G1 m% t0 G$ N u
{
, Y3 J. u1 E3 ]5 \/ d // 禁用发送中断7 n& j2 S+ @7 \7 T- V
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);3 U/ h6 x9 U- k6 H
}! j6 T; |. c6 M+ l+ e! ]
}
2 \+ R l _. h5 e. M# @
7 l6 x! z; {# Y! S% e5 a5 _ // 接收中断# [4 i) `/ O0 k5 a2 [# `
if(UART_INTID_RX_DATA == int_id)6 j9 Z# E6 h8 d8 t- K
{; R" E) W- C3 B3 `
if(status_a0==0)
p! q+ C& Y8 `7 ~+ k+ M4 [! D0 ? {
( B" A/ w' U, k$ }1 f a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( h; P! D# r* q) u) Z if(a[0]=='#')
. S% t2 I+ {- R3 M$ O {
; c+ R( H$ Y5 E, \! s9 j status_a0=0x01;
; x' d) q" f/ }( E status_a1=0x01;
" s3 o2 J, }) |: @) G8 K! V }: \# v9 U. b7 X _; c- @0 w: p6 s" u
} P! Y, U9 |& J* ` E
if(status_a1==0x01); {/ B8 }+ U* v
{
1 b3 [7 x' R: {2 r5 g a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) {1 J7 a/ F! h+ R- }6 \ y' f
if(a[1]=='R')( y! t/ t7 ?0 W& G4 A
{
& B: J7 F2 S" C' P$ }" N" r) }& g status_a1=0;
1 Q4 \+ Z2 `; q% Y! \ status_a2=0x01;3 x) H, L4 Y) X2 R r& i e
}
0 O" A0 ~ N5 K# y% e& o5 W8 d z/ _" q }+ X6 [% y# U3 u* C
if(status_a2==0x01)+ F( N. `* `, W1 f$ i
{
( L9 T: P( v' e2 a: Z0 v& Z) o a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ z( f9 k) D0 w) c# d& o" { if(a[2]=='A')
; `1 m7 i# U1 C {- T- K! Z/ G9 F" C' p6 z, d% O! I
status_a2=0;
& }) M6 f4 J) M; J- t9 R status_a3=0x01;# e, |! J' Y4 `9 p2 p
}5 p0 q9 I' F1 R! s1 A7 |
}
8 c* s; a. W; M( _: E) V D) y' q9 S if(status_a3==0x01)
( ]9 T; o* z/ a# `" X7 B {& @/ G- X L! v5 c
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( {, h1 m( m! u# c: M if(a[3]=='N')( g6 t# }" ^; R5 q! H
{
( l1 T( y: l7 \4 {# @1 `6 m; o4 ? status_a3=0;1 [8 q( O" d: G# ^4 k* j) Q
status_a4=0x01;
6 b/ Q/ }3 L* [0 e7 j- r }
* Z: _3 _( Z2 K3 Y& O. O" } }8 \& O8 {/ U' n- W* s4 X6 K. W
if(status_a4==0x01)
) }" o: t$ f, j) N- ? q {' ?# q) W& _9 ^" ^, s$ s/ Z8 b
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 z7 Z, ]$ W+ N: [/ l if(a[4]=='G')
( q5 i! s% P+ O7 I B9 W. V {
, a. Q: D9 f$ D, z+ | status_a4=0;
) g3 X2 }- m9 v- q2 g( ?) O6 s status_a5=0x01;
/ ^9 ~6 G" ~! V P% u! O2 v; c! |: l }
- ]- {( }1 V, n+ A( `( U }
- m/ ^3 j+ K- O8 }; T3 V: B \ if(status_a5==0x01)
* `2 Y" H6 m J% x( F% }& i3 ^ {
4 p% B5 z* a6 d8 P- w a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 o3 c4 D# {( Q7 ]3 S4 O
if(a[5]=='E')! ]8 g- j& B7 k i
{
2 s+ `0 o' p! F1 A4 M- C status_a5=0;& S$ y7 D2 i" A) G# o
status_OK=0x01;% p! G5 H0 W2 f" F7 _! X% T
}$ R, O4 ^& j5 _
}
; c! V6 q" i2 J5 M+ k if(status_OK==0x01)( C/ E' s; I$ V8 W" r, i
{" L& M+ S+ w7 t8 S
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
Z5 L. b3 b4 @ `: `$ U6 h& z lengthrx++;
. j+ z+ y: _, ^8 `' n! q k5 R if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
# s6 b, A! s+ \! j/ E" c! l& Y% [ {( v3 M" j( I ~. g; p7 F6 q) _
RecState=0x01;& e( v% E% q/ H. k4 C" r
}: \. M7 o7 i) t' i: c6 i) @+ H
}
1 B- e0 M, z$ B2 G" s( m4 [ Q! J
6 d0 j- h) z5 M5 S6 n4 [ }; w! r6 `& G. o; P/ u: V/ M/ c5 s
) O5 m6 q! z& j; q, `+ \
// 接收错误% i' T9 G- x) e7 G0 b
if(UART_INTID_RX_LINE_STAT == int_id)
4 P: p, X/ ^% w1 |' U: x" l# v {/ Y4 A0 u4 n" w n+ ?6 \
while(UARTRxErrorGet(SOC_UART_0_REGS))
7 s& H& O/ \0 C, S! E {
' H8 w, m) w5 {. `; ? // 从 RBR 读一个字节
7 O. L( e; f0 c% ~/ \% k UARTCharGetNonBlocking(SOC_UART_0_REGS);7 T* c8 ]" K5 b' I( M
}2 b! |3 Y: y- u* b: z
}
1 |" E$ d! H5 z9 h% ~, o$ S5 ~! \. y6 v& w8 n# N2 x( U: r
return;
0 W/ ~* g# H8 i! y* ^}; W2 A; b6 ^& r
# f1 E) Y& k! M$ Z2 L
B Q; }$ T- L! x1 k
& w6 J" F. S0 u; Q2 q d) Y |
|