|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
" ~! P6 s& t- @; x' k, s6 [: _, M; T我是在DSP初始化这不太明白。
+ n! h* e# U! }: N/ r初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。# L9 W' h: ]; V* m( O6 G+ @
$ p ]' q6 W: W
# l8 ]2 {1 O7 K) l. H2 C6 L首先 PSCInit();//UART0使能9 g1 k0 E u+ h' k
void PSCInit(void)* F+ o L% E4 M# ~6 E7 `; i
{& M" {+ i" f$ B) p
// 对相应外设模块的使能也可以在 BootLoader 中完成0 ~% F: |; \9 S0 p% ~$ B
// 使能 UART0 模块
' B+ k* _6 w1 B* f- z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE); p M/ A3 Q/ b. J: I+ v+ b
}
% x/ ]3 V t0 O$ d2 Z
0 l0 O+ {- o: {+ U5 X. B' @; b+ c& x9 \3 p+ C/ j2 \
然后是 双核通信的初始化 AppInit();& H& V- d" ?) }. W4 z3 S
void AppInit(void)
* d9 Q! l6 d7 q- h* ?{
: a( U) c, I6 @. \ /* Structure to initialize IPC (see Ipc.h for definitions) */. s5 U0 G w( s: l* W% Q% Y
struct IPC_cfg ipcCfg = {
& _, m- s6 l, j IPC_DSP0, /* local processor Id */
0 j& c6 I& x2 o" [: P1 p& P IPC_ARM_HOST, /* remote processor Id */% T* ~ V+ F. r" z5 a" v
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
: a% a2 Y. @4 J4 z' w IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
/ E3 e4 w* O d" C' P( X2 L NUM_MAX_EVENT, /* maximum number of events to be created */4 M% I! F. @5 U' v
&ipcPvMemDsp, /* local side private IPC memory */
. ^$ [ Y9 P! y" V2 h' `* g5 N &ipcPvMemArm /* remote side private IPC memory */! {: f( \* d/ ^2 V8 r
};
$ T, _, I! U2 t IntDSPINTCInit();4 h+ T. N4 @9 E8 {
IPC_init(&ipcCfg);
4 q6 j4 Q6 F& S* q IPC_intRegister(C674X_MASK_INT5);' s. ?& @+ p) g7 k4 v+ i
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));4 h$ ^0 m1 p; s1 M; _; L3 ~
, H, e! ^& Q8 W% `' ~/ ?' E /* Enabling interrupts for DSP C674x CPU */5 j6 U' ^ t) Z+ P2 n O9 D
IntGlobalEnable(); /* Enable C674x global interrupt */
; j. Z. N5 i" ? iAssert (Notify_start()); /* This will enable IPC interrupt */( q p; D2 M; k" _9 F
}
4 p- T& r' L3 B6 a0 Q9 ^" A2 }5 E4 p2 f# Y3 D; `6 n
然后是
1 f. M- I4 u4 ~' Y2 Z) b4 t3 G // UART 初始化$ t" f$ m, R* o. q, x
UARTInit();
7 V8 L( e. r/ }$ m* l, n5 d0 y" S- E: z: q: \( U' @
// UART 中断初始化3 j! h' c8 V9 I4 D6 q
UARTInterruptInit();. O0 [5 e1 \' n
# `5 y/ O1 h7 o( Z' v* P; S7 W
1 r- N- v9 o4 w% i7 d- k9 ivoid UARTInit(void)
* w! Q. K* h' L" r5 t; E/ B{7 ]& r* ^ B. ?2 ]* C" L3 U9 c' E
// 配置 UART0 参数) @: v) t+ @: X& t- g
// 波特率 115200 数据位 8 停止位 1 无校验位
* J. D( f2 f( v' p1 W UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
7 Q* E( }0 z7 J/ F( K1 ^" ~ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& z8 t& A) g9 R6 t7 _: |4 b // 使能 UART0
% ]" H# O, ~" Y9 k* i UARTEnable(SOC_UART_0_REGS);
. v% R! d( A0 p r6 |2 Z* i- E n9 `5 }- Q4 l" R6 q
// 使能接收 / 发送 FIFO* a6 \3 J. N* V; o: E
// UARTFIFOEnable(SOC_UART_0_REGS);
9 H7 O& h0 _' E% @" j' i% n; N1 Q2 R9 f, I0 V# j/ z, f5 M# h% M
UARTFIFODisable(SOC_UART_0_REGS);2 j+ c. T! h8 y f& p8 {5 a
! A4 N+ u* |' ~ // 设置 FIFO 级别 接收FIFO的级别
" i+ X. g! n" \; c/ Q// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);# Z/ J Y/ z5 ^- }8 l5 m% w0 M6 ]2 o
}2 W$ X- i8 D. T3 q" l
, \* [# O$ y1 b
1 i& t+ x3 z0 p$ r5 Kvoid UARTInterruptInit(void)) k$ R, k4 s% p9 [
{
7 L& p6 B6 e5 ~4 k. k1 m4 C IntRegister(C674X_MASK_INT4, UARTIsr);
2 F- F# i9 t$ h, X/ ^ IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
& P, i2 c# f ` IntEnable(C674X_MASK_INT4);% Y. a9 E0 ]5 f; i8 O* W* J
, X3 T" N5 G+ H- c
// 使能中断
9 t; w) |/ O3 ?* g+ T! ~ unsigned int intFlags = 0;$ E# e9 _+ @: Q) h$ w
intFlags |= (UART_INT_LINE_STAT | \
. k7 O6 |6 A0 Q% a. I UART_INT_TX_EMPTY | \0 ^" o& w7 |. c
UART_INT_RXDATA_CTI);
0 s6 G) v7 ~+ b UARTIntEnable(SOC_UART_0_REGS, intFlags);; Z: U) U0 H2 k2 c# \( v; R
}& N9 j3 I7 w2 L1 A; c( P9 C
$ T; u7 p- L( Z3 m6 s: _0 x
& p: A5 M" \0 @( N- T2 {0 h
void UARTIsr()
5 ]9 d+ t: M; R& |( L{9 g! U5 ?% o0 [; q+ v" d2 u
static unsigned int length = sizeof(txArray);
5 Y( m" F5 |1 @ static unsigned int count = 0;
$ l6 r C6 C% I, u2 ]% ?' v+ O unsigned int int_id = 0;
4 a! h: f* _& O8 X' r$ q9 a2 p" {1 A
; T8 s- H& Q: O5 x9 {: W: Y- L
% z) R2 k/ k: `9 v( j' x2 U( K // 确定中断源& F( I- A p7 O1 |( W5 o7 B; x
int_id = UARTIntStatus(SOC_UART_0_REGS);: `- N( z% b7 h! e7 e F
1 W5 H4 ^+ [$ l. y9 H# b: k! J // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。" U9 L: Q! ^/ ^/ n7 R
7 T. n- Q: U. B: `, | |# R! k( ]$ {/ ]* S6 a
// 清除 UART2 系统中断1 }- W' h$ {( n
IntEventClear(SYS_INT_UART0_INT);
! y8 {2 g6 r# b0 `0 Z. h' |) u7 b& H, D$ f
// 发送中断
) \8 P# D" D& C: E- ^4 D if(UART_INTID_TX_EMPTY == int_id)# B2 |2 N9 q0 _6 }1 o
{
; v f E, X2 L4 L3 B# x: J3 g+ d0 F if(0 < length)1 p& K' S9 c9 w6 Z
{
$ ]0 j5 p1 h0 o1 m // 写一个字节到 THR m& x& B' m+ M! o- W! [
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
8 ?- b( j* ^7 h7 Z length--;
2 {* X0 G6 H* v4 [- _ count++;! q2 J+ O" O( ?% M0 T) _
}
& [+ i5 U. p8 i; F if(0 == length)4 L# A# ]( M) B1 ^7 b
{
2 F/ @- q9 M/ S+ `) p, F2 u7 w // 禁用发送中断7 D' n# G, |. j
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
" a% {; B4 P' {0 o+ e6 ~ }
" v* H c' P6 V- S }8 X" L; G/ U' P5 v: L4 |
; ]. C% w, U- v6 q2 q" h
// 接收中断
( v$ X8 p7 n5 c, [% Y. M% w! X if(UART_INTID_RX_DATA == int_id)( `% R' R' ~- \- t5 h7 ^
{
. U4 M9 P$ j7 _ if(status_a0==0)
0 K+ r. l9 b1 L J {- k! F. E3 y, p; l4 T8 s L
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% w% Q( J4 N N: a }6 t if(a[0]=='#')) R4 A' M& T- s* p5 c, Y
{
* h2 q6 L9 `* V! D) K status_a0=0x01;
5 J' [7 F) v4 H, h$ H; b status_a1=0x01;4 K- ~8 t* r8 a9 p9 F
}0 \6 c% Z& K$ J
}, u& R9 @# {/ N7 v2 u h3 K8 N/ g' e
if(status_a1==0x01)9 F+ v! l3 ?' O/ R7 t
{4 I8 |* q: c. U8 ~% O( @1 t
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% X$ m. V, I9 ^% ~ if(a[1]=='R')( f9 B0 R* f# O' u
{
. Q: H4 L$ X- P" y9 @% m3 V status_a1=0;
& y0 j" x' ^/ i" q6 Q3 {% C- @ status_a2=0x01;: Q6 ^% X4 J* P: z
}* ^4 ?* F0 M, x0 _
}
" L4 W0 d8 I8 x0 T D" W$ O" J3 \, P if(status_a2==0x01)
" t$ C# |% }9 o8 e) C' ] {4 O! H) \" g) v) c% ]; E. G& c
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 O7 `5 S, v: f. f& a if(a[2]=='A')( K+ M% Y8 L! q& W" i7 x _/ t+ A
{( ]% [% B6 c, i. h; P$ B3 ?5 ?4 Q! M
status_a2=0;
* d5 F0 `$ J" h! q status_a3=0x01;
# j0 H! ^, F$ T' y6 H. q9 t }
! Z0 h1 V# b( A }0 a9 B* ?2 z% i0 B6 I
if(status_a3==0x01)& {3 J l$ F* M9 k$ Q. r
{
2 {! }4 E& a& q a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 H/ ]: G9 L) N. s: K8 Q, x if(a[3]=='N')* p! `' t. C. _9 h% g' z
{
% e6 ~/ |7 n1 y status_a3=0;
! [. k- c! @! ^- {7 }# f8 W status_a4=0x01;( Q3 Q; V: I( G- b$ U. S
}
7 e: e2 n! C! t6 @ }: e5 H0 J, i8 X+ ]$ _
if(status_a4==0x01)( `4 \( E, f3 C& [% z" L1 e
{
0 Y+ [5 O7 M5 B& _; |) V* V: ~ a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# \ x$ \5 A0 v: Y$ R8 T& V- P if(a[4]=='G')8 Z E! h8 L" n; z" j
{3 U3 d2 l% }3 o4 I ^
status_a4=0;
( d& W/ V L, M- o9 n. J5 J status_a5=0x01;+ h* e6 _. H& O3 ]
} N+ Y9 q+ D6 }) F& H: e. f d
}
. m* w: Y _ D) z1 j, Y if(status_a5==0x01)
; {- Q+ \$ N- J; | {# P3 g0 Q/ G% O8 @7 z+ D
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 s7 f# l$ T; y
if(a[5]=='E')
7 d' L, G" l5 [$ K {
1 B- ~8 L: @- G1 I$ l status_a5=0;7 C* m/ ?+ L' F% ?: o* I: a
status_OK=0x01;
8 l7 @ h+ T) \0 k( p }+ i3 T2 |% A+ j8 [6 j6 w. V" j
}
% T4 L4 l3 z* G! u if(status_OK==0x01)# B" b: A b1 b ~
{
+ U) a! F( h% v% z; ] rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 b$ r$ i. K3 q/ N: a3 u
lengthrx++;
0 t0 h: L+ t: n if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)% b4 }' J8 N! y; o' K X
{$ p; B: \" G7 ^( ]" x
RecState=0x01;+ z; T/ O9 n$ C
}1 G5 |4 p7 z! |* O
}: { U: D0 q$ E. G8 P: n8 D. W$ }
* Q; f- m' U1 s* M- T8 C+ f5 {( r+ S
}
* Q% N/ ~5 a2 ]; L- @2 y" a/ h1 Q% S0 D' x& X/ h6 M. R0 R
// 接收错误
! i5 `" e+ J1 Y9 x8 |- W/ \ if(UART_INTID_RX_LINE_STAT == int_id)
: S0 L2 g# b6 H) N6 K {7 l4 P8 Z2 C) K8 ]* g- J9 B
while(UARTRxErrorGet(SOC_UART_0_REGS))5 d1 ^& q2 M( y3 C2 d }8 d
{' y% c- K2 y3 `( x2 h! ~0 O; `
// 从 RBR 读一个字节3 q+ `9 g9 \' N" ^6 d
UARTCharGetNonBlocking(SOC_UART_0_REGS);3 | G# b9 }% a J& y& n
}
C. j2 i k# U% Q d }
7 S- t n W7 u8 g I
+ C4 A1 j: z2 o return;9 e4 u$ }0 K2 X
}3 N# G8 c1 J9 E( S/ b; L: i8 t( l
; c( B% {) U* O& E, w
8 x% i, k+ j" w) |8 i: j: e |3 B; c3 F8 L
|
|