|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
$ ]2 x+ L* U) n+ v }3 j1 ~我是在DSP初始化这不太明白。
7 a, Z3 s% t- X& ]; T7 r初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
% {7 f8 W, K3 [( g: v
9 M6 A# u$ [& ]$ k B3 f: x
3 {! L& F0 L8 S3 O首先 PSCInit();//UART0使能
- I6 Z0 Z7 P) Gvoid PSCInit(void)* p+ r; `2 `" M9 i( Q w, ?$ H; c
{ n' m5 ]; O! p) n5 j4 }9 A
// 对相应外设模块的使能也可以在 BootLoader 中完成
( T+ d' m6 d( |* f, C // 使能 UART0 模块% U6 y5 Z- e0 k2 Z, I# c4 q& m4 g4 q7 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: J3 |0 Y; U$ ^$ L) ]( E( @' h
}
$ @, M- f; U9 |" ?% a+ P* K5 R/ e+ r5 t* I2 `8 H
2 a! n2 @, {" G0 |然后是 双核通信的初始化 AppInit();
6 d- y% V# N* Mvoid AppInit(void)
# c; e8 k; z8 \" M) }{
1 o3 n: b: X8 p8 v# y/ K /* Structure to initialize IPC (see Ipc.h for definitions) */+ W, R2 r* ]! H- R% a2 N
struct IPC_cfg ipcCfg = {
+ c- [" `: W6 C: k% z IPC_DSP0, /* local processor Id */- p1 F& m c" B- K
IPC_ARM_HOST, /* remote processor Id */
% O* T+ S3 | ?9 e. `$ H IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */. F' S0 N- x; T2 [3 g9 m
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */: D0 c5 c) {5 r; q4 W
NUM_MAX_EVENT, /* maximum number of events to be created */+ X2 [2 c0 C9 G/ [
&ipcPvMemDsp, /* local side private IPC memory */
: W+ a7 n' [- z( C: }. c &ipcPvMemArm /* remote side private IPC memory */
5 c! [/ C: ?; L5 m0 ^) F };/ d( y6 { ^0 E7 Q
IntDSPINTCInit();" W3 A' U% H0 i3 ]6 N+ F
IPC_init(&ipcCfg);+ g. m) s, X" q0 S6 P
IPC_intRegister(C674X_MASK_INT5);: L/ O a9 H& _; K6 ~) H6 o: n
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
/ W1 e. y4 M: [ K/ B0 E. S* ]. p
6 Z. f8 m( R5 n' F4 q /* Enabling interrupts for DSP C674x CPU */
: ?! b6 e" ?2 {; ^& X/ |; k IntGlobalEnable(); /* Enable C674x global interrupt */3 T+ x6 J ]: I+ k9 i- g
iAssert (Notify_start()); /* This will enable IPC interrupt */
K/ O" ~: ] T' v F3 N% C}* H: F0 f' Z b6 a9 m9 Y
8 ~# N9 e% K& O) j4 _
然后是
2 b) X3 E3 `: z- z0 |7 @ // UART 初始化
|$ r0 b1 T# k" A( T UARTInit();
% d, j8 E2 C3 p" Z ?0 G. @$ }( D) r2 y3 y0 M6 j
// UART 中断初始化, n! w) O$ s3 _$ L9 s* ^8 F
UARTInterruptInit();5 E5 T, j) Y! a9 O5 |
3 g2 m) I; r$ F+ S" J4 P: h4 e
3 {2 x! ^1 S( T: ]/ l- ^void UARTInit(void)6 T$ ~/ F9 U; l6 u8 t
{
& ?- ~5 q/ y N3 V K# }& o( r1 ? // 配置 UART0 参数' U! C+ d; Z7 v( R! P
// 波特率 115200 数据位 8 停止位 1 无校验位
0 u( W, e' d: H6 Q1 p3 R3 r UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
1 _$ w1 M$ T' m$ K UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 _7 z P; M4 O) n. ]4 ~, |1 T0 v
// 使能 UART0. }% s, N2 s5 |: U5 W
UARTEnable(SOC_UART_0_REGS);# H4 Q6 r2 j7 b/ K9 b8 @
: b" q/ r# W# J/ K. G0 v8 [ // 使能接收 / 发送 FIFO; g a( Z( g4 N& s$ E
// UARTFIFOEnable(SOC_UART_0_REGS);
/ b+ [& o- K0 ]$ d
2 _. ~3 q+ t) @. J UARTFIFODisable(SOC_UART_0_REGS);
8 J ]9 A1 k$ G4 s1 X; s! g# l$ e8 }, F! v9 ^6 r
// 设置 FIFO 级别 接收FIFO的级别) X. Z% z2 ~" K3 p. ^' C% r
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);# p. W# q |: D
}3 U( V) j* M; v& U. L" v' e. u
. I/ K P/ |- l y$ g4 Z: q3 V% t( K" e) ]
void UARTInterruptInit(void). R% z# c9 Q* O3 ?+ F
{
, B0 L' U& f! \& o3 O IntRegister(C674X_MASK_INT4, UARTIsr);
0 b1 w4 P3 J3 V3 H IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);* k0 \! m& n4 \1 ~6 h0 K
IntEnable(C674X_MASK_INT4);
8 \* X/ N& J4 h9 h& }; ]7 x8 q+ ?" w( T7 D$ t( K1 C3 t# _, n8 _/ ?
// 使能中断0 L# U$ ~. \7 G; I O" p$ K6 Y
unsigned int intFlags = 0;6 @. L' r$ d) R" {9 D; C2 t4 D
intFlags |= (UART_INT_LINE_STAT | \
. w, E- U) F# ^* W) G8 C7 O: B UART_INT_TX_EMPTY | \
0 j1 M- L7 J, n) n$ w UART_INT_RXDATA_CTI);; O, O m4 y- Z& [. x2 L3 f, w
UARTIntEnable(SOC_UART_0_REGS, intFlags);$ t( ?* J( F6 J7 Z* _3 b
}
) ?8 [$ Z3 B3 i' H2 R5 i
0 w! J) a' T E, F, P9 u) H3 A- _% `* V) k0 I8 i+ X
void UARTIsr()+ B+ p0 ^- t) y6 J
{
9 b; Z" T! I' q4 T1 g7 ^ static unsigned int length = sizeof(txArray);
0 @. Q! `0 v5 M9 f8 t: L; W static unsigned int count = 0;" t, |* r# w0 S! q/ o
unsigned int int_id = 0;
* `& k( V* I# G2 D. M/ X
0 K5 G; m* `/ D+ G$ F4 N
( n+ s$ l: K. F2 i1 H* J# g6 Q6 m2 G8 K
// 确定中断源
], @2 q& j) C: O int_id = UARTIntStatus(SOC_UART_0_REGS);, Y5 m M1 k0 H# U, O
8 I# E4 G' m* O // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
5 B$ k2 U6 K6 {" }* ?- j1 ~) S- Y+ @' Y2 C* A0 F* n' m
$ u( p) l7 k$ E9 K1 ^. O
// 清除 UART2 系统中断9 ]- c* [. l* w2 Q3 B* d
IntEventClear(SYS_INT_UART0_INT);) w* C8 G( H9 J
6 W; ?; H& C+ A, i3 i8 j! ~& M) o
// 发送中断
% c% t7 x& J J, q if(UART_INTID_TX_EMPTY == int_id)
" b2 [/ i: t( P {
6 Q% w" p4 \( ~$ w8 [. ?/ y) N1 l/ l# \ if(0 < length)
# G5 {7 h, a- N' V1 e. S4 U4 w {
6 \! ]4 r* l2 E4 q% R( g7 _$ s/ l // 写一个字节到 THR
' v) r+ j: s' U. g UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
( t, e8 I; d, m: n1 o8 A1 Q length--;" h8 A5 J4 y: {+ f9 Z0 H
count++;" y1 q3 I4 H! ]
}) a+ g6 |5 z/ N: c9 h
if(0 == length)! B0 k: ^7 d, w: U4 v8 B: i' @8 a4 b
{
3 n2 I7 a+ a7 r: i( p // 禁用发送中断
@' ]: Q. g) f! V: n UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
4 y7 y# A0 I- w }' R0 {( N6 L) m9 v3 M8 q5 W
}
K) G+ x- V7 ]- g% P& u
" u% P9 ~. Z, o4 \7 q [) w6 d" \+ q // 接收中断/ I" H7 n) V9 y# f
if(UART_INTID_RX_DATA == int_id)4 b9 S' a, }3 E$ Z; k& \
{
" `3 y$ z/ j7 n8 q3 | if(status_a0==0)
8 D% g ~/ b! R7 r {; ]3 ?9 ~% S ^) Q
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& c, A' T+ l8 V0 ]- ^2 c! M
if(a[0]=='#')
5 n* `( O% J5 j ]: j {
9 v% T$ x1 Q. z& h [1 ^2 E status_a0=0x01;% c3 N% w+ Q+ m' Q; |5 o
status_a1=0x01;# B9 a4 N# t3 }; f1 R9 ^) U
}3 r9 U% T! U+ c1 g
}
: w1 X- ^, O J R if(status_a1==0x01); b+ E: F. d, G" }. Y
{
8 d) J: s% J# z4 y a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: G( j. o$ d5 f
if(a[1]=='R')
# h+ M$ D ^+ r, z4 M. p5 M {2 |; v+ ?% Q8 a: z" D3 J7 @
status_a1=0;
3 z% U9 S; D# z) Q status_a2=0x01;/ Z* V# x% E6 T& e, E
}
# M. m7 Y7 g( O9 J }2 F6 G; u# L. v: o4 ]1 x; v
if(status_a2==0x01)6 x. N% l p0 s& I8 ~
{
$ C" P/ s* I( |( d5 ~" [; @ a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" m8 N, k) a1 R% I9 s if(a[2]=='A')
8 K: Z: v/ `5 V3 J+ } {
6 v9 {8 o4 ~& g! q status_a2=0;1 X% Y$ {) T' E! R9 R+ s4 `) e
status_a3=0x01;
6 T7 m- p* o5 w8 T3 ^ }
# [. \4 @) x: Q4 x2 } }8 s8 e" H4 u# Q# |6 h
if(status_a3==0x01). b0 c% L( n% y C1 T
{
( r' H( T8 p' e( p8 n a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' d8 T5 f: A Q if(a[3]=='N'), }7 [6 p5 Z6 s& z5 s
{1 j; c* [4 H) R' M
status_a3=0;5 p" X# d- f+ d( \
status_a4=0x01;2 T0 v1 k) a! Y7 c8 h# Y1 `
}
' W- P) u+ p* X+ T ` }
+ v J3 r7 H3 `1 C! ?. ~" ? if(status_a4==0x01)) ^8 X& t' F3 }/ a. e5 E
{
" }9 O( \3 `% \: W3 F. y- q& l- \) s a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; s+ h7 F0 [+ |( i, w; P# b if(a[4]=='G')7 d# ~, I+ d8 l) o2 Y* w
{
8 }0 ]. P* Y9 V0 ?' L1 r status_a4=0;' M" r* i$ u$ W) {9 b
status_a5=0x01;
0 H/ U9 Y6 d* X6 _6 Y( X }
9 ^" N3 }; G! L6 s% | }
# U2 V+ ^( o9 l9 Y if(status_a5==0x01)$ N5 y3 q m# p0 I |% b, Z1 A
{6 \0 P3 {6 G5 M
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 `7 b% b5 Q+ Y/ t( j1 F if(a[5]=='E')
# Z' \: J) ^3 M; Z& B3 D" K' d* k- E {4 R. Q+ G/ M4 @1 e1 {" n9 a
status_a5=0;/ A9 ~+ k+ i* v5 c' o
status_OK=0x01;" O0 u8 @ p7 H. D
}" i2 x, i6 z8 S/ J$ G
}' z3 K$ } D. H7 M b b7 P
if(status_OK==0x01)
( Z. [0 ^$ {) B1 _" I) i* X- @ {+ Q W; M! j! K% g
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);+ p0 N5 @% A. ?: j+ Z
lengthrx++;
) K7 t6 }# L% Z9 m" v, [& [1 U if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
& Y* D6 l9 h2 Y7 t5 y! u {
, R8 V7 _( P8 ~; A RecState=0x01;
, \- _2 x8 z" {: c1 l$ m9 p8 E }
2 u+ M" Y! E$ `- R }# X8 O+ f* w! F; A% _8 ?. U, B9 J
2 j, B. e; B' G4 b' @1 D( k }
' u, ^* c- }: c& Y& i" {. W; d& t9 G( c% J5 F( ?* f
// 接收错误
4 c7 o0 _ |" x, O6 V7 C: e; x9 @ if(UART_INTID_RX_LINE_STAT == int_id): H ?" r& r( p% m4 [
{8 Y, W- w: c2 s$ J+ O1 Q
while(UARTRxErrorGet(SOC_UART_0_REGS))
7 W5 J# I2 I! @) F4 y. y {# M, @- o) a. B5 H
// 从 RBR 读一个字节
: |6 Q/ P! U* G4 ^; H5 f) r" A5 h UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 Y2 A$ |* `+ K0 ~ }6 P9 a2 K( V# D
}" _' K. u" k! j T# T l3 W
) Z4 V' ]! s+ O& _+ i! M
return;
- v4 H; P5 Q& o) i9 C& C1 [}+ F/ a4 p' H( q: B
3 A6 {. ^' S) m( e+ k9 u8 V! \0 a j' S; `- j" O
, i7 J2 H6 l( E8 r |
|