|
OMAPL138双核通信,现在需要DSP核中的UART0接口。( L6 |" m% N% M, F* e: G+ J! g
我是在DSP初始化这不太明白。2 ]& e5 J' d$ W9 h+ w- o( [
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。7 {! ]: A$ v1 `8 d0 b' m' N( _2 Y' r
+ w% n6 b& `8 Z2 f" P
1 S! w3 a: H6 v: r4 ?2 q& y首先 PSCInit();//UART0使能4 K# W1 W" G. {* l! g' M# K( W! |% S
void PSCInit(void)
" b; Z# }: s2 A: z# c4 D{
) Z( z( [8 K) Q' ` // 对相应外设模块的使能也可以在 BootLoader 中完成% H5 T3 C" x' t9 U, R
// 使能 UART0 模块+ f7 j5 b# _' w( g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; K. }$ r; d/ v) ~
}
* T2 l2 O9 N4 ?, M3 P- Q
8 D+ `+ C9 I8 c) Q) d F2 F5 }5 m
然后是 双核通信的初始化 AppInit();' ?* y2 r* ~) z% B2 f
void AppInit(void)0 u/ s7 R2 W& ?, c$ F; D
{
$ A8 x0 g2 w( K9 d2 ^! r /* Structure to initialize IPC (see Ipc.h for definitions) */
* J9 u; q' r6 _4 L7 ] struct IPC_cfg ipcCfg = {
; ^* \$ x8 r% X# d: P; o" G/ a IPC_DSP0, /* local processor Id */
0 |2 q, D! j7 z6 Y7 N IPC_ARM_HOST, /* remote processor Id */3 Q+ S Q e9 I2 p2 [! S
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
: a7 X* x6 l. p0 F: y IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */$ o5 j+ N6 t) ]
NUM_MAX_EVENT, /* maximum number of events to be created */
0 ^( z1 v1 d% o: c2 y &ipcPvMemDsp, /* local side private IPC memory */+ d/ A3 ~1 z) x
&ipcPvMemArm /* remote side private IPC memory */: m5 _( Y8 j, b" b6 x S
};
+ u8 V' m$ L8 u7 I. _0 s IntDSPINTCInit();; o) r0 K8 e$ r/ E5 f: Y6 ~
IPC_init(&ipcCfg);
0 H+ Y% S& \0 G$ \2 { IPC_intRegister(C674X_MASK_INT5);# ?* n" w& L6 ^, u& M
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
- \ e5 w* U" j1 F, \5 J% q1 M4 r9 k/ A8 K
/* Enabling interrupts for DSP C674x CPU */5 h- G9 g) k; K8 x+ W* }1 Q# b& ~
IntGlobalEnable(); /* Enable C674x global interrupt */
4 v) G8 @$ @( Z iAssert (Notify_start()); /* This will enable IPC interrupt */& B# V A# \% F+ n5 ]9 L7 }7 L
}" L! j4 ~! e. ?+ Q: t) e
# l+ m% J' p- i J' }* n0 E) F6 A然后是
5 [: A2 Z4 \6 E( J4 w2 r% C // UART 初始化
# _5 v6 a3 z) t6 V3 \( `/ S UARTInit();
% M+ j. q) e; T3 b7 C' e5 a
( _) J6 e. @7 L; C // UART 中断初始化
' c& @+ c- |1 c' a' i3 ?! f: E+ F4 ] UARTInterruptInit();
+ D$ E, m& `% d3 N6 n0 j
8 S" }4 f( r' X. d8 L: l Q0 k
void UARTInit(void)6 M9 W0 Z: ^% J6 B" V! F! s
{
# H% ]* o( I* K# C9 l0 ? // 配置 UART0 参数
0 ~ s5 f- a% \4 [; [ // 波特率 115200 数据位 8 停止位 1 无校验位, S. j* m( l: y, `" i1 |2 o
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,! m8 }% S$ f8 m9 ?- a( b& Z- b f
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ T) T# ~5 m. _0 m& h. F+ N: x
// 使能 UART0
& b2 e" a5 k0 G& L0 e* ] UARTEnable(SOC_UART_0_REGS);0 \) v9 c$ l8 _, l! R+ j5 w1 j
: _, @" h8 ~/ Y9 O: @+ w' f8 g/ t2 t
// 使能接收 / 发送 FIFO
w+ {' i+ Y. X( v3 `- F& K4 R* G// UARTFIFOEnable(SOC_UART_0_REGS);
+ G; L7 @$ ~9 q8 t \, t( I) [# y2 P
UARTFIFODisable(SOC_UART_0_REGS);: o i) w# M' k/ D i
+ X9 k/ |/ D% H$ _( C // 设置 FIFO 级别 接收FIFO的级别
, t) T9 c0 d* Q; B0 p2 O0 O/ A// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);0 {3 ?3 L8 s3 ]
}
9 L) H& i: ?/ s) ]0 O8 @4 H$ I' s0 }% O, f5 }! t
2 b b2 h8 `2 ?1 O5 z+ Q6 o! j
void UARTInterruptInit(void)
M. J! |+ x, ~: {& o{
3 {! Q+ z i* [& }1 _ IntRegister(C674X_MASK_INT4, UARTIsr);0 z* `) P" d2 U; R
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
3 U4 E0 ]! g8 f/ [( y) X IntEnable(C674X_MASK_INT4);: g. ?) d- \2 L% P/ l0 t
8 o: i5 J: ]4 f! ]9 V* e/ Q& w
// 使能中断0 ?7 b' ~! L) [$ h
unsigned int intFlags = 0;) ]6 H8 {* t r
intFlags |= (UART_INT_LINE_STAT | \
; [7 i- d" H9 n' h# N2 H7 | UART_INT_TX_EMPTY | \
' {. I* X V+ ^; f4 d6 G! l UART_INT_RXDATA_CTI);
8 z, B* {+ N P D% e UARTIntEnable(SOC_UART_0_REGS, intFlags);
4 A% l4 J( o; r! K" P( \}
! F$ N; _) z* @6 w
9 D: m b- {. K/ U7 `* L+ L- J5 Y; `% H! i+ A& _, q
void UARTIsr()
" ^2 g- T( b9 k m{9 F+ j$ g" B( l% v% O6 L
static unsigned int length = sizeof(txArray);
! ]6 f3 q: H$ Y/ r static unsigned int count = 0;
) R1 ~ _! Z9 k9 \ P0 ] unsigned int int_id = 0;$ O" x9 Q2 T' ?" @+ P
2 I9 Q1 |+ _( |8 G9 P5 b$ \
& m" W5 q$ S9 q8 `+ X
+ ]! \% y1 ?' E& g# O6 {" H( F
// 确定中断源, A+ N2 e6 V/ W* U
int_id = UARTIntStatus(SOC_UART_0_REGS);
8 Z/ U+ k' u0 t. i* B% `* j& b
/ [) }. S" U F6 x( \ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。9 Q {, w# P6 e& s; r
2 W& x# k7 m5 H! d) \; R! i6 I* F/ {
' I }6 k. P$ E# V1 L5 B3 O; f // 清除 UART2 系统中断! K4 b) H) ?, h7 K2 t6 ?+ B
IntEventClear(SYS_INT_UART0_INT);
1 I4 ~" F w( Y2 M# a
4 D* H0 V3 d% C% t // 发送中断
$ I" n* D' b+ l3 z F if(UART_INTID_TX_EMPTY == int_id)
7 J" c; Y6 D+ L7 w, T/ P" x0 y {& Z5 N* B) u% z
if(0 < length)
8 k, {: n4 u: S$ R. [3 X {5 {3 E6 y8 P( `6 C3 t9 U
// 写一个字节到 THR
# d" o7 ^5 y2 {9 P UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);: b4 j" _" u( I! C
length--;/ z6 I q: K% f! Q( |; s
count++;
, Y( X$ O" y1 R }+ o" c# o- v- G% r: B) p
if(0 == length)1 I8 ~( v3 P( F% S- q! Y
{4 | }% I. I! i! t
// 禁用发送中断
: _0 t3 e$ x I: ~% I UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
3 L! ^+ V+ a* {- m& \" x: f }
9 t, J9 U+ J5 ?2 F T( C8 I: a' L }- R) |+ j* A- b; Q
: t* B$ h7 u' Y# G. P4 b \ // 接收中断1 S, N" B' @- b) X
if(UART_INTID_RX_DATA == int_id)% p* }! s$ F. D; ^
{
5 _7 z b; A" _( m( \ if(status_a0==0)
0 E: T' Y; N6 ?% W {
2 d$ P- N* e; f' J; {+ k a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 z$ i( n, e% a, @/ U0 b
if(a[0]=='#')
# z7 W1 z0 U! {% v {
# h* |0 A; A& R" g/ [9 c! w5 o status_a0=0x01;: i/ c0 Y. U3 J3 X2 x5 _; W
status_a1=0x01;8 w3 J- t! x; G) X# V
}
; P1 o( |: K9 w6 n! T' J" k }
& q4 A; g1 N7 V* \0 ] if(status_a1==0x01), T1 [- `, P% f, y' @
{: B3 }+ R- Q& x4 @
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 D0 C8 [1 E9 X. }
if(a[1]=='R')
5 }; z5 q' l2 L y {
) Y5 a; q, Q& C2 Y status_a1=0; V2 h W* I0 Z* R
status_a2=0x01;
5 f% R# j8 M3 D+ K }+ A6 a! F6 u) p
}
0 z: C( i4 @7 u$ H3 \0 X7 I4 T if(status_a2==0x01). x$ q9 n9 Q) m* P0 U5 G I2 M
{
+ ~; [1 c: I5 A. E a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 P$ \1 o2 k0 H) _% j
if(a[2]=='A')
' H" g/ T# y% d9 S+ E! z' X2 g3 q' `# g {. I8 `& t, }! a2 o: x E
status_a2=0;- S) b" z; x1 t. |1 h0 K
status_a3=0x01;' o/ Z) Q I3 z) p1 N% |! l8 H7 n
}
0 h8 K4 P6 p$ A# N% p2 @0 Y }' X$ o" p( a: ~
if(status_a3==0x01)5 d! h* J' ^/ V& E% j5 y q' g4 v
{
6 A$ C; T/ o: l7 v' Y" w a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- n9 L+ U2 C$ {# t D/ Z if(a[3]=='N')
8 b: u3 r D/ s {* H7 P( S8 E- R
status_a3=0;/ A6 u/ h( C+ R
status_a4=0x01;
4 I, B# H9 i2 I; C7 J6 e. r }1 X. w2 E+ \7 q
}; I! B3 D" O6 D. j
if(status_a4==0x01)5 K% V$ G# \& c9 [
{
1 ~0 e) x, K& A2 r; u- M" G a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 N/ d1 F( T% b3 \ if(a[4]=='G')* `, E W; i# N$ z9 a" t/ a
{
+ u' _7 V# `+ ?" t) }- F' b status_a4=0; K- C; ^" j( Y$ T# s: f- A! W
status_a5=0x01;" ]) J2 s/ r: m! ^; d8 R
}
Y0 O N& h2 ?" Z4 F4 S, g }! H3 g. p8 O0 i: ^
if(status_a5==0x01)+ i# t$ v# R Z! v) j
{
4 s. D$ s- q- `7 I- V a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; |1 O* B2 X3 r# D/ s' u% s8 w- Q
if(a[5]=='E')
Q r q }& S5 }$ ~2 q {2 A4 c% t# k# e1 N4 a: `
status_a5=0;" Y" i1 z' F. o
status_OK=0x01;
2 D: G0 q2 m7 [$ k2 o$ R5 H8 P) Q }; J7 u+ m9 S8 K6 ^/ O
}
7 V* [2 W0 R1 X& `: g if(status_OK==0x01)
9 B) B: i' `$ c. N+ D( S {
1 J. j, G& t0 N4 p rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 ] ~9 }& D, N0 c' `( K+ i/ d! T lengthrx++;/ d& G3 D D/ A- `4 c
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
; o2 l) @! A" W2 M; {8 C {
, z5 N5 J% E8 p6 L+ N RecState=0x01;
8 M# ?$ P& k2 \, O: N5 j* J& k& C }& t8 D) G9 |, S4 f7 h2 V
}7 Z" g( b& b2 e6 `8 S
2 [1 F/ \- _3 b+ j6 D( z7 T0 Q9 M
}3 O! x% u0 c* r) s* i" b- P
- t7 ]+ p5 c0 t2 b // 接收错误9 p2 ~+ u8 P) G( ]
if(UART_INTID_RX_LINE_STAT == int_id)" `* z" K. U+ [) q5 ^
{ V% C% q8 y2 S; f
while(UARTRxErrorGet(SOC_UART_0_REGS))% |- g& {: {+ t8 U
{, u, m( A# n7 N3 f; v* N6 K
// 从 RBR 读一个字节# H4 ^6 O! v- l) l" Q* I9 q
UARTCharGetNonBlocking(SOC_UART_0_REGS);) c# H1 j1 {: l H" @- N
}. O( [5 H, @9 ?1 L
}
, o/ A/ `: p' T. a5 S4 f7 {' {2 u! X) m( Q. N7 C0 H8 Q& T
return;; v. X# H# I1 Y
}1 I" l2 @: T( G! m
s0 Q) V& @, |
! _4 t% W& M3 f6 H0 v3 i
. J* C1 c6 [# E! @) T |
|