|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
2 M$ h y; Y+ M6 ^. u9 x我是在DSP初始化这不太明白。# o: p" U2 @" G" U* { K3 P7 |
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
5 |6 i4 H! N2 p1 @! h! c0 A2 _& P; Y
1 c% m( G) @' `8 x. z4 j首先 PSCInit();//UART0使能
2 g6 X& G# f3 ?. S% xvoid PSCInit(void)
! t" }' a( o0 e5 C1 F{
( W+ N" N5 F; H# u2 I# G // 对相应外设模块的使能也可以在 BootLoader 中完成
: q* A7 x9 M/ }9 n // 使能 UART0 模块. H% |) t! b# H9 u( K3 m, i% j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ \0 P9 E' x7 J; K l
}" b" ^( W4 \3 G+ x$ X
2 b# M- U; W8 s( U! F, a g, e, G6 \; ?7 ]- k
然后是 双核通信的初始化 AppInit();7 B5 g& m1 t4 k8 m( {( I. S4 [
void AppInit(void)
5 T0 w; i$ s; Y6 O4 a7 w4 j{
& c7 h0 k7 @ W# m, x7 K /* Structure to initialize IPC (see Ipc.h for definitions) */9 V0 ]$ F0 s; @3 A* T' j8 p
struct IPC_cfg ipcCfg = {. o1 K' P8 |- ~% G3 ^
IPC_DSP0, /* local processor Id */2 E+ ]& y; j% K: C4 l, O
IPC_ARM_HOST, /* remote processor Id */
# x# s8 }7 A8 M8 R' i: J IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */9 z# l( d* S3 t+ h. b! o- O- }! _
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */1 i# Z, x/ k' K z( g
NUM_MAX_EVENT, /* maximum number of events to be created */
\6 B0 h u" Q- u &ipcPvMemDsp, /* local side private IPC memory */
/ |2 v! w* w1 p% Y6 c- R: } &ipcPvMemArm /* remote side private IPC memory */: O; @1 R2 l8 W$ s7 R3 q [
};
9 k5 w1 S3 p% G5 [ i IntDSPINTCInit();
* f7 @7 K: g4 ^ IPC_init(&ipcCfg);
: p7 _: R; f+ a IPC_intRegister(C674X_MASK_INT5);$ h/ b8 V6 F* M+ o
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
7 H% R( ^2 z5 O
- v) P ]! W8 P /* Enabling interrupts for DSP C674x CPU */
0 Q6 g1 d5 K+ I3 z; ] IntGlobalEnable(); /* Enable C674x global interrupt */. M: L8 O u1 O; Q8 B
iAssert (Notify_start()); /* This will enable IPC interrupt */
# F( }' W" p9 P. v I}9 C4 R( |! S& x" {1 n8 H
* V: a8 m/ q% v1 n( Z, k# W然后是 ' x; M3 J Y# P8 x3 f
// UART 初始化* P( v. S1 B3 k0 R6 C; g
UARTInit();
" }" l( {: p; T# q" y+ ]; [, t. B
- R0 e3 g; x; L2 a // UART 中断初始化9 C! F7 ~) c: A
UARTInterruptInit();/ `# @, j8 Z% `) U2 m9 f% z
$ ^0 \; q6 ?. P& A. M$ A0 j- a* y8 P
void UARTInit(void)3 F( h) b5 a9 ^' f# r, N
{
$ G9 V) v1 o3 @0 J3 b6 T // 配置 UART0 参数
- D' b0 B2 q8 } // 波特率 115200 数据位 8 停止位 1 无校验位. Y, ? v+ E: `7 f6 T( [6 D
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,& e) B+ L1 r2 L3 j3 Z9 Z
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' q. h7 D3 C+ ]# G& x3 \ // 使能 UART0+ R9 \+ X: R' X Y! o& S, _
UARTEnable(SOC_UART_0_REGS);
0 I6 k! P$ y7 s+ ]
+ y% h' X: L' ]+ |+ y // 使能接收 / 发送 FIFO
3 a, V. |6 j' ` x9 w# F// UARTFIFOEnable(SOC_UART_0_REGS);
0 E$ g9 T: G% F: T# C2 \' t
" t e1 x7 [' {1 [& y& P: a6 C UARTFIFODisable(SOC_UART_0_REGS);
q3 r+ w! Q, S5 P0 \6 k1 M# w" d9 K1 s# w" i4 W! H
// 设置 FIFO 级别 接收FIFO的级别
8 v! h, M1 I4 Z% i2 N# J6 Q4 s// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
; ?! g$ a+ L) ]}! W2 w# M5 g8 h! g( D9 x; e
y$ A }0 |+ V
* s# s$ W' H2 s; {( `) D
void UARTInterruptInit(void), z' k) _# V0 R
{
/ y( k0 g4 v+ h0 n, P5 I, v IntRegister(C674X_MASK_INT4, UARTIsr);
! t2 b' B$ o8 x1 S! D( R o) e* c IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);' d; v% m# b: B6 i ~ F! E0 m* A$ l
IntEnable(C674X_MASK_INT4);
+ `! R1 l/ l( d
4 ?8 \8 w) l/ P2 i( S4 E" B // 使能中断2 T4 c6 E# R* I+ g+ a3 J) @# B
unsigned int intFlags = 0;
5 a% Y- u7 ]# w7 C; `7 q% p intFlags |= (UART_INT_LINE_STAT | \3 K3 [: D0 B/ v2 a
UART_INT_TX_EMPTY | \9 L0 j8 \& ~2 k0 C5 t
UART_INT_RXDATA_CTI);
# i6 }& ~, L' g UARTIntEnable(SOC_UART_0_REGS, intFlags);
9 H# ^6 T: ? P! ~! g. x}2 F" ?3 C; n C; q) c7 o
/ M3 |: V- w# m0 m) _- R& ]0 [4 f
# O6 i- t4 {, V# b
void UARTIsr()6 w$ Y" Q0 H5 b @9 F* S2 S) ^2 t
{
3 m, R% \0 c+ \" ^ static unsigned int length = sizeof(txArray);
+ J4 |6 r4 T' l static unsigned int count = 0;$ K! w2 Y! R# M, r7 {; J6 d @
unsigned int int_id = 0;
6 F7 j" D! F) z- A, g
) ^3 Y' _/ h' C2 s
- h" ]: e; l0 J. ?
, g0 B9 |1 H$ n* T( E2 G3 B // 确定中断源
5 s4 Z! y% m r( s @ int_id = UARTIntStatus(SOC_UART_0_REGS);4 L/ n. Y6 Z8 w8 \" ?% O/ X9 e
, P+ J, A3 y& q, U8 @ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
) a2 g% H5 }6 a1 N |
+ N s" a$ d1 ?" ?1 m1 m9 [
, e$ R9 U) s, n# Q, |8 m6 j$ b; K // 清除 UART2 系统中断
0 a* f/ t/ s$ G# ?9 x IntEventClear(SYS_INT_UART0_INT);
' G% c: a y* R4 P" K& y0 S1 F/ L* |" ~- Q8 R J
// 发送中断
" u. N2 x4 x, u$ Z4 n+ f8 W* |7 q: ] if(UART_INTID_TX_EMPTY == int_id)# F# s& d0 u5 F) s3 ]( N& B
{1 D: P7 q5 t# Z! O, Y5 g- T% f7 Q
if(0 < length)4 q" P* p1 C( m6 @7 k
{1 Q# Z0 a( F* G& h5 r+ Y) w, l
// 写一个字节到 THR
3 P: ~, A* y; Q" c UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]); v5 j: ]) t$ M# j% U7 \
length--;
; c: }$ }3 b) l count++;( }% S% U( Z# r) B" s/ x- I
}
6 D/ }! x9 X7 N. P' I# w if(0 == length)
! D3 s; ~6 o: w8 ^ [' ? {
" c3 ]! {+ _' F // 禁用发送中断
3 l& t; W% H$ U) M& P) ^ UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY); s! d. W; `& Y2 B. l
}! {" X5 ]: q" S$ q, q4 n. l0 ~
}% @. j8 D5 r2 d0 @
7 J+ n% E, A- J+ x9 h2 c9 _
// 接收中断0 e; m% l- N% x3 R! i7 X3 W
if(UART_INTID_RX_DATA == int_id)0 T: n* H* i x! x# q
{
5 c2 ]4 Y0 A7 ]# L9 { if(status_a0==0)
1 P9 @8 F* U6 z { N8 n7 `* |7 G$ W' H
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- B$ S- H2 K; ?; ]& \' ~, e3 ~ if(a[0]=='#')
; b& h7 M1 S% y7 C {
# d8 q/ u, }3 l( f! t" @3 V# x status_a0=0x01;
* q' s6 t7 C7 v6 `9 F" P, _- r6 _" A status_a1=0x01;
0 ?6 A5 c' K: r! f }; Z+ \/ q$ h' b5 w% i0 S- n2 a5 }8 A
}! \9 h5 \+ d# G: [' |1 v# R
if(status_a1==0x01)/ u4 q$ v0 Z4 ~5 S3 a
{1 f* C9 M* e+ c
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. s) S4 h( W) C+ ?. A if(a[1]=='R')
. C5 i: X& X5 H% ^3 X {
# ?$ ?) _4 _; i `, Y% |/ }8 n9 Q status_a1=0;
% I# L4 X8 r6 ~$ a' U4 @- x status_a2=0x01;; D0 l d. R, {6 z# \
}( D6 n! s i- S+ C d
}
& e: |+ J( c0 \1 ? if(status_a2==0x01)
) C F" @1 o" B* N {% I5 U: t1 G0 y, R1 I
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" H+ v- X% B- S2 v+ f
if(a[2]=='A')
% G5 s# L8 R5 p3 m1 z5 \5 { {- c/ M/ `, L; o# P
status_a2=0;7 ?2 M% W& y) w5 g* b
status_a3=0x01;
; e! d" k8 m; I; V }$ I2 R2 `0 }; g, f
}4 ?: s# z+ k$ L$ i: | c( p
if(status_a3==0x01)
* F5 @: K7 c P# z$ M# m {3 g9 m& A) k! ] O
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# D h2 _! O' o0 h6 m) Z1 q+ |3 x/ t
if(a[3]=='N')/ ^7 F I2 f& q6 x3 \0 t
{4 z1 [. b* C4 V, A. v0 s; n
status_a3=0;7 x& T: I0 C' @2 y( O( k9 q- Q, M
status_a4=0x01;
( x! i2 r" X7 v N) W' @6 x }
1 E' N/ R- Z6 e# W: g0 l! Q }
3 m/ w" C! G A$ Q. a- d. M: v if(status_a4==0x01)! k0 o8 G0 l) \" d
{4 r9 V- Y" [( j: G
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, X5 d1 d3 Z' X0 C& l2 ~
if(a[4]=='G')5 t- \* i N7 K n
{
/ [* v$ W$ z3 U status_a4=0;0 w+ {4 t- C( N
status_a5=0x01;
: T% ^4 O" F$ R4 B* f% @ }' @+ _" V3 C* a) v! I9 a7 X$ a1 N
}
& X7 T+ l/ H* G- p; F { if(status_a5==0x01)
( Q9 r; h& [5 |6 H/ i' r- R {0 t9 s% x5 d& J* P4 \9 z
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! P; O0 t2 q, A: O
if(a[5]=='E')7 R3 L+ Z) _0 `: V6 u
{
5 v0 S4 s1 b. Q* {$ H2 P2 Y status_a5=0;
- S3 W+ a8 h5 L) i# S, Q' }1 b/ O! n& w status_OK=0x01;/ i3 g( |7 {) p3 c3 f; C3 p [0 ]
}* b9 `& e* [2 B4 M* `* f: N
}
$ U9 O+ g* p3 N- t3 ^ if(status_OK==0x01)
y: ~' M# m; s5 [( y$ b {
8 U7 |& V' j! z U' s rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& r5 O1 v# N6 n7 i3 w$ x& i
lengthrx++;
3 ]2 W- r0 j0 _7 M if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)! E" J# ^! z1 s- D( c7 A' Z
{' s' ?4 s0 d1 z7 h0 W
RecState=0x01;
5 d7 h% s3 d$ q+ ^( T, P% G9 Z) Z }
8 W5 U$ O+ a6 o! g7 L4 O0 y5 B }
0 X" U$ z% c. U* K6 s: ]) f* ^: F
: C( w% K( n; O }- Z0 F; z( ?0 c: }/ l7 a( B; T8 _: K
3 u4 L: y. C* L! r
// 接收错误0 t, W7 @/ n% g
if(UART_INTID_RX_LINE_STAT == int_id)
. O) X! M% i, Z9 y# i/ h b' y {
! x j2 W4 y f7 ~0 m% x while(UARTRxErrorGet(SOC_UART_0_REGS))
7 h; ~- I$ ~0 s! i {
$ I, o) |4 T4 f1 m% ?6 i* F- l) S // 从 RBR 读一个字节
9 t- P6 ~$ y# x0 Q- b7 v- C! }5 R UARTCharGetNonBlocking(SOC_UART_0_REGS);5 e# J1 `+ W4 Y# a# ?
}
" Y3 u7 m5 U8 |, Q, ]7 k1 ] }8 Y8 N: f5 h2 {' s$ b6 D* K' a
5 p. v) d& u8 o4 b5 O; |
return;
( _/ R. Z6 G j ]}
" V# }+ o6 O9 B0 L k: h; |" o: X3 P: h% s) b
+ C2 g. D+ p. F0 U3 S* d' G0 m7 [% }* K! ?' n9 A
|
|