|
OMAPL138双核通信,现在需要DSP核中的UART0接口。8 e) ^5 `* T/ I5 R4 N7 C
我是在DSP初始化这不太明白。- {$ w& c& s4 W U( `
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。0 B6 c. A" V# d, I6 q$ D/ C
! V ~2 [) N. d% u( T( h0 F3 w8 n* F
首先 PSCInit();//UART0使能
9 A9 I' k- x$ u* Uvoid PSCInit(void)6 D# p$ S# p/ R2 J3 n) Z6 S
{; w' |* q1 \* T) Z; n+ l
// 对相应外设模块的使能也可以在 BootLoader 中完成 Q( _3 }" F* O0 s1 u
// 使能 UART0 模块6 ~7 H; F( }* R! K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 [8 z& H3 o+ C- A
}; Q) z& O& S/ e& R+ B
2 |& Z; c4 {1 s/ _3 `- P
% }3 Z4 N0 s- d1 @! a( [* K4 Y: U! }然后是 双核通信的初始化 AppInit();0 a6 b b3 K0 e. L2 P9 w
void AppInit(void)8 F% w6 C: _% W) i! c, \+ |; m
{3 A, f& t9 c0 f& F
/* Structure to initialize IPC (see Ipc.h for definitions) */
0 x' g* a# E! i4 o; f" S$ o struct IPC_cfg ipcCfg = {: A, M, k& y% F4 b& b7 y
IPC_DSP0, /* local processor Id */& V2 s5 e, L) Q7 `1 o
IPC_ARM_HOST, /* remote processor Id */
/ f6 C0 p8 `8 r/ R1 A/ f IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */5 Q4 }1 O7 ~7 q. E+ c
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
2 Z) q1 {7 @" b* c NUM_MAX_EVENT, /* maximum number of events to be created */
0 _/ k! D7 F! A- L# u* r# t &ipcPvMemDsp, /* local side private IPC memory */
1 n: k8 d) Z4 g4 m$ Z1 |/ ?5 Y2 y &ipcPvMemArm /* remote side private IPC memory */: F/ u9 o: [, H
};
* l; j5 ~: x! U2 V+ M6 R& x IntDSPINTCInit();$ a# u- Q% D; ?/ k
IPC_init(&ipcCfg);
3 O# H) b6 {0 V$ K* [6 W IPC_intRegister(C674X_MASK_INT5);$ N+ C; M4 W4 W- g8 Z
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
: C) l# e! t) F5 x$ W% m% Z) O& L" {& Y' a# J% Z: |& W% O
/* Enabling interrupts for DSP C674x CPU */
$ Q: Y4 Z1 W& v8 V! I0 I; N IntGlobalEnable(); /* Enable C674x global interrupt */
; z/ p8 e6 Z! q iAssert (Notify_start()); /* This will enable IPC interrupt */! J+ l9 c9 M" F- ~! ~6 q
}0 H/ ]. E: t" q- f1 _
9 p/ b- g& k9 ~: \, J
然后是 ! i8 z+ Q" n0 b
// UART 初始化
; x5 p* U/ P8 @- }, a UARTInit();
o. |, L; ]9 x& `+ ?* j
- ^8 o& x* H% I- N! I // UART 中断初始化$ w8 F# J2 p" Z' y
UARTInterruptInit();
- V9 [" O# A& c* n4 Q. J$ l9 a/ H/ v
) k5 I- V8 b4 ~8 r9 t
void UARTInit(void)2 w, U6 P) g' s
{
; Z! O& B9 b( i/ f. k% Z6 G8 X* _ // 配置 UART0 参数) t U. b0 T+ ?2 H5 T
// 波特率 115200 数据位 8 停止位 1 无校验位$ j T% H4 K; X. g' T
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
1 Y$ p' G9 p! q. C UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ {) @4 w6 [! h$ \ // 使能 UART0
1 F8 ?8 Q. @0 t) i7 H9 n UARTEnable(SOC_UART_0_REGS);
! n- A3 b( ?- A2 ?5 d" j
; e+ D. |) z7 B+ \! S // 使能接收 / 发送 FIFO) _, V% m, ~" j% D! O0 `; v& ^, v5 k% @- K
// UARTFIFOEnable(SOC_UART_0_REGS);' g# m& |3 ~) F2 \- W) x# W4 j
. {/ v& o# y! }% l
UARTFIFODisable(SOC_UART_0_REGS);/ p5 z% G1 I5 i5 K1 V0 f7 |' `6 R
: y. A( e5 e% G' f8 i ?0 X$ U
// 设置 FIFO 级别 接收FIFO的级别* h$ J+ {, Q3 @4 n$ ]4 W
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
0 P' n( u" J* B}
3 ?$ s0 w" l! d# M
! {4 v; I, S! c1 r e6 {7 x" i" B' u( G( ~4 j
void UARTInterruptInit(void)3 ~8 a& K' [' o/ t8 i e5 o
{; j b% Q) z: G) d q* l
IntRegister(C674X_MASK_INT4, UARTIsr);
4 X3 n+ R/ i3 ~( I! I IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);! ]) R. @0 `2 M z& Q3 I5 B
IntEnable(C674X_MASK_INT4);
- q3 M+ I" J7 T. ]# y- u7 P. ~8 t8 J% R+ m2 n
// 使能中断
* x+ W c; V* o7 B) K unsigned int intFlags = 0;- K M* }" T! R" W! z
intFlags |= (UART_INT_LINE_STAT | \: G1 S \3 z, A' Y
UART_INT_TX_EMPTY | \
* E$ Y6 y9 F5 s& v! q9 _9 C/ N UART_INT_RXDATA_CTI);
2 I7 {# c: _ D0 M' A% { UARTIntEnable(SOC_UART_0_REGS, intFlags);! p& P/ ~ [4 [, Z% ?1 m( y
}
; T' N6 H3 |/ r t& g
- I! v9 v4 f6 O. k5 ]7 P5 L& W5 C4 A8 ^0 `) S& n" C
void UARTIsr()7 v% J$ |# {$ P& L. h
{9 V( _2 C V% t2 }
static unsigned int length = sizeof(txArray);
! P0 ~1 w, T! r7 g2 w( g; g# i static unsigned int count = 0;
9 @$ y9 k" ?! c1 }8 s u9 i/ y; | unsigned int int_id = 0;
1 A* b! `2 E/ \: k0 z( w% i7 m9 ~, U! k1 O# ]( ^; `0 a
* z ?$ A3 ~' {! v
O; d' z2 t( x9 H) A
// 确定中断源
" K! t5 l* g$ ?; j+ n( A int_id = UARTIntStatus(SOC_UART_0_REGS);/ U( m0 W/ C3 H. `6 u- K
# N) f$ D. s4 J u& |& ^+ m // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
: w' {0 m; o t/ W! c; C9 Y
4 z: h) w4 J. g ]
- W5 _9 E& g- [1 l! m$ N // 清除 UART2 系统中断
- g# n0 J4 d ^' L0 M4 ~ C IntEventClear(SYS_INT_UART0_INT);; I5 V1 Y# K& V" u" J4 R
5 s) C: d) p$ X/ D
// 发送中断
4 B' v( C& j% e2 v& Z if(UART_INTID_TX_EMPTY == int_id)
4 ]2 a" Y; t* V# o! ~ {
2 C$ K: C; p# b7 w0 H4 N' T if(0 < length), _. C8 e' D$ x7 L. A) T0 i$ h7 k7 A+ C
{
' U0 W3 ~+ T( i; @& b3 w // 写一个字节到 THR C5 d2 D5 e3 W: t }& ?9 K; c& m
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);) E7 E( Y7 q6 p
length--;
5 `9 f* H, t& W+ i2 a count++;
7 m. T/ A' F! c& v' V: w }
: M& T+ r9 a7 V! J if(0 == length)( M( N4 R8 |' r4 _
{
. p0 n6 g4 {& ?' F6 }) o // 禁用发送中断& m1 `, m; p' K7 B1 U# Y
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
% n+ b8 k6 f% P d& `7 A/ r. M6 Z3 u& G( S }
9 Z" z+ G) a, n/ e% ] `3 C }
/ _: } o; i6 Q' ~6 p9 I4 u5 {4 n6 H2 D
// 接收中断+ _: z9 x3 b% X: `& ]1 Q
if(UART_INTID_RX_DATA == int_id)# F3 K) B& D, ~- }$ i' S6 n, U+ U5 N
{: [5 _9 Y0 W M7 x7 z
if(status_a0==0)4 h4 [3 p2 q2 Y J- x |2 V1 o
{
, f+ ~4 {% ~9 B a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 F3 j; {+ r g1 d if(a[0]=='#')+ c s/ M7 `- O7 S
{
. |# c1 o S6 e4 E7 V status_a0=0x01;+ O, Q: L: P4 W) ?2 q
status_a1=0x01;
# C) f0 U Y: r" d }
& _) N' G! }% U% [0 y/ d' y }1 \7 f5 I6 I; F5 ]* f, n. H9 t
if(status_a1==0x01)1 Y" C4 G/ \/ f8 [) w' w
{' X M( X# S: I, }
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);4 G2 q0 N, [( O* u! [
if(a[1]=='R')
. U' R% T/ Q1 r1 h {
# p" w1 r) V( V! H- Z+ w1 `* U status_a1=0;
1 {$ f8 n r' Q, s status_a2=0x01;
$ S( J. {* ~* _) x' n; K* a: I5 h }
$ _( e7 L/ a" ` }/ Y; F- W. \. d. H) ~
if(status_a2==0x01)
9 a$ ?7 C; X) f. V4 T( C {+ _/ h6 P& t; U
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( ^0 q; d. Z0 T" L- a$ |% M
if(a[2]=='A')
: |# A9 W5 }! N: l {
4 A: T+ T0 ^% x# ^+ n3 G3 }+ ? status_a2=0;
4 R/ h& _7 ~" d! O! ^+ N status_a3=0x01;
. r+ p4 N0 s2 @2 [: X; B; D }
3 @0 Q% \0 r j9 J }8 ~) [9 i3 G: x0 T( Z* y1 f
if(status_a3==0x01)& F6 z- G, i. G3 o. n* @5 }4 a1 k
{ R4 V0 X1 N+ U: C {# R8 r7 x
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& C" B* X; }! |2 d9 a- ?
if(a[3]=='N')
$ E4 K: Z% E. V2 K9 } {
. Y# T5 G7 q' Q2 A4 k" x: g status_a3=0;
0 z- ?6 L/ E: y# k; M, a/ T0 d6 t status_a4=0x01;. T/ u3 X" f# }8 O
}3 [) Z% p1 y5 n6 }. w5 s( R9 _$ ^
}' |% s- Y: K8 D: B' _
if(status_a4==0x01)
# o" a! E) R$ | {
5 A- c$ ]4 G! @7 e6 {- @. x6 f8 L a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' r1 r& K4 s% R
if(a[4]=='G')
( J" `1 ~) x$ g/ x) I2 y8 M {
$ t/ { ?6 G: L% [% i4 n status_a4=0;+ l5 T0 s( i. y8 J% |3 {8 O
status_a5=0x01;2 S& Y) B" M; r5 o
}
: j7 D, W' u, V/ G }1 `/ g- `! e" i6 U' C: g7 C; R" s
if(status_a5==0x01)
# g: P4 ^# U0 T2 i5 g {
! y" `( Y K7 {/ @3 L a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 F5 g# t, V2 v& x* O C/ l
if(a[5]=='E'), Q8 }+ o, c9 x" d1 z7 r4 K
{4 r( s: d' }5 S% S; w2 p0 t, J
status_a5=0;
5 J. K$ K7 {+ \2 } status_OK=0x01;
2 |6 x! o' d3 L6 N9 x1 r. @3 } }% z8 {1 Y* l( C4 h& v8 B6 w _
}
* i3 `4 M0 W' x6 m2 i if(status_OK==0x01)
4 F/ x6 G; {, T+ l7 B$ t( w {
m5 s8 e# `+ H7 v+ I% H& x1 K rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ Q5 I6 p2 x0 F0 Z2 ~$ J6 R$ y
lengthrx++;
, D+ M" o$ s+ k% n if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
; V7 l- C! L+ o" z k6 w {% j* z* V; W3 {8 A+ @
RecState=0x01;
8 ]3 M- {8 V" ^& I4 k }
( k4 y4 B0 Q/ C }) `* X9 s Z/ q
+ L. d9 X& p2 v3 F
}% Z+ G2 f. n) Z+ |5 I+ w9 }
8 l1 |9 H, b" c5 c8 t% M$ W // 接收错误" a; f, t, M0 y6 M$ F
if(UART_INTID_RX_LINE_STAT == int_id)
2 K* k7 n o8 N" _ {9 K/ ]' ?. B. w2 t& P
while(UARTRxErrorGet(SOC_UART_0_REGS))
8 @% o) v |9 A9 e! P {7 D: K( q, h1 a% ~
// 从 RBR 读一个字节2 d( o" v0 J, R4 h' J4 |
UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 B0 h0 ]/ |% _" ^( j7 N }
" \2 m- [0 M3 o) P }- N- a) U! Q) E' M* H& ^
8 l9 w7 i* T6 D5 M return;
+ W/ |" c. U0 F( y! J- V! v}
2 ^. l9 D& H5 Y3 }5 u8 ~' R- s
/ [2 L. g. T( @7 A; h- I
# q5 s% T4 K- @* }
% Y) L' ?0 F( w) L* r& s. { |
|