|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
4 R: \8 N Q: L* E- |我是在DSP初始化这不太明白。6 A8 s9 Y5 y- U+ y
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。# l/ _* I: S, t0 c0 r, w7 g4 N
; |$ z5 V& E. Z: Q- D: P6 Q
3 j1 p9 V7 [7 H9 I+ i* `2 {
首先 PSCInit();//UART0使能
' l+ X# `6 K% k3 Qvoid PSCInit(void)
* G z3 @! R3 H( w8 u7 s2 ^{
@6 k! Y2 |+ r // 对相应外设模块的使能也可以在 BootLoader 中完成: G8 I4 Y i- Z: i5 G9 Q, L
// 使能 UART0 模块% d& [; p( T N4 d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
1 g& I; _5 I- J% q}
# K1 s" @: ~- {+ l0 R% |2 E3 \ L$ @ h! v! M- m G
' C4 I; f) z+ [ w9 s; d5 M
然后是 双核通信的初始化 AppInit();
, n, l& y6 \9 {. c; ]* u( \: svoid AppInit(void)3 g; j; R( R7 T. g! K0 p% s
{% `( v. T' C4 I
/* Structure to initialize IPC (see Ipc.h for definitions) */
5 {3 P! P8 c8 L0 p4 }" G1 H% N struct IPC_cfg ipcCfg = {% y. ?+ n+ s" _5 ]2 M4 x
IPC_DSP0, /* local processor Id */8 l2 Z' x$ V d* ^1 L1 I
IPC_ARM_HOST, /* remote processor Id */
2 e9 n( r4 G; R3 s8 ^8 B IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */ U' | L" l3 ?8 o$ g! ^$ G
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
( q+ O# {' `! ~ NUM_MAX_EVENT, /* maximum number of events to be created */
' s1 }9 {3 V- E$ h% C D) [" x9 } &ipcPvMemDsp, /* local side private IPC memory */
1 b& M0 D6 [3 B! D% F &ipcPvMemArm /* remote side private IPC memory */
& r1 z6 K- z8 ^: |. v6 w* u5 S };
/ [! j* t' S9 F* m" g: H IntDSPINTCInit();
: |! \2 S) ~# S2 b+ v IPC_init(&ipcCfg);7 ]+ V$ D# S+ | d5 |) P
IPC_intRegister(C674X_MASK_INT5);
$ Q" [& H" c$ X8 ] iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
' t6 ^( q; {+ H( E& E2 C. g- s
5 Z! i: h, j- f- x; \ /* Enabling interrupts for DSP C674x CPU */
P( C( x$ z% n2 P6 W5 f' i IntGlobalEnable(); /* Enable C674x global interrupt */
' k& L4 T: B& W# t! U0 K! h8 K: j3 p iAssert (Notify_start()); /* This will enable IPC interrupt */7 r/ }2 }" @7 T3 k2 w$ U: ^% H
}
& T" ^8 m% \: _" ?- l+ q* P# ^+ B+ Q7 M
然后是
2 i" z& M. @4 X+ V9 I' U4 [- X // UART 初始化. N, Y% F" o3 q- d8 S
UARTInit();6 K& f/ v0 t/ q) [( K- |' a
8 Y$ S3 M: Y& n9 b5 }. H* u/ ^8 b4 a
// UART 中断初始化
. U& F* I z+ ~ UARTInterruptInit();
; \, E: `) V! b6 K$ ~
/ w) i$ s" t. k$ M9 U
5 Q% B, y8 g& ^4 u) Evoid UARTInit(void)
# w. k1 c" s' R4 s{6 L" ^/ G1 G/ V5 A- v! [+ z% Q
// 配置 UART0 参数! M0 j9 U% S) `* H2 ^+ r) _: T
// 波特率 115200 数据位 8 停止位 1 无校验位 u I: ]) U" D! v5 t1 q# a7 w
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,; ~8 N/ A* G ^ \
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) L. Z' r( h+ c+ U8 L/ U; K2 R
// 使能 UART0- k* V' C& @4 t2 e& k; m5 ~* V5 z9 X
UARTEnable(SOC_UART_0_REGS);
* L8 U" N. {5 w) l/ E2 g! f% R2 n
; T' u4 o0 l9 I // 使能接收 / 发送 FIFO6 W. w0 ]% g2 @
// UARTFIFOEnable(SOC_UART_0_REGS);
9 E/ c" N2 j/ ]% R/ u) i- {5 A& S
. {# a2 v: w& R4 K! ?0 E v$ ^ UARTFIFODisable(SOC_UART_0_REGS);
: k) o# a, s* a$ B, F3 l$ p7 i6 @7 B8 X8 M( g9 Y# j& a; o
// 设置 FIFO 级别 接收FIFO的级别
, \7 v3 w4 O, R( h* `& K! [& F// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);& T' b$ `7 d. u+ l. b2 f) \
}0 f. i) J+ V, N4 o2 ?! L2 a' T: Y) |" }
1 ]' Y% H, \7 Y5 m: r0 X1 ^& A& ^$ b
, `2 V0 K) }# c2 E- R
void UARTInterruptInit(void)
7 K4 U3 U& E( x/ E+ h{
. w, B3 r$ O* S7 l5 h0 K IntRegister(C674X_MASK_INT4, UARTIsr);7 p2 {3 K6 B, ~' X0 i, B+ L: I2 r
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
4 X. g; ]+ d7 d3 H4 D. F. I# y! B IntEnable(C674X_MASK_INT4);
( p: g) a% f2 |% R$ @; f
|1 ^3 X& Z* y, J // 使能中断" Q+ L1 {* }5 b2 t% U+ T/ n; Y2 l
unsigned int intFlags = 0;7 X1 L) E8 ]1 W3 `! w$ d
intFlags |= (UART_INT_LINE_STAT | \
, }; ^5 R% H7 y- U1 E UART_INT_TX_EMPTY | \* n5 j6 z/ T0 h p( ]8 t
UART_INT_RXDATA_CTI);
) ]# u2 u& p( |6 r( q UARTIntEnable(SOC_UART_0_REGS, intFlags);
w+ c/ a1 |- [& t7 j# J% b' I5 o}; E1 _, }2 G6 z7 v! |/ d
( g3 g J" e, N& p4 I, L! q! v I
/ P& C/ \8 T3 h, H+ k8 d1 t: \void UARTIsr()
$ J- x- ^* p, K" L, I* p* }{
# {6 ^7 h' ~- Q# x static unsigned int length = sizeof(txArray);
- m/ O( |* Z* _ m- Z& Z `' U0 H+ Y static unsigned int count = 0;
4 k' n7 ] h3 c unsigned int int_id = 0;5 D; {! V7 j7 c
+ ~( W0 q- h7 t4 X
, q) P* H/ s5 ?0 g* @; N& H1 N3 O+ v7 E9 z' o& ^8 x
// 确定中断源8 h X8 }. n8 }/ N" r2 ]4 ]0 |
int_id = UARTIntStatus(SOC_UART_0_REGS);0 Y2 c# k5 a6 H& [8 }. @
& m) Y4 m# |$ L( z9 F
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。5 t1 \$ z% Q* G
3 e) \9 h2 q6 Q; {4 a: S0 C/ \% k g) y D
// 清除 UART2 系统中断
6 {" f6 E& T- x3 j IntEventClear(SYS_INT_UART0_INT);
n [% u# v6 N
& L6 F% V2 e( k3 d // 发送中断
* B% A9 V+ P0 Z1 E. p if(UART_INTID_TX_EMPTY == int_id)
; i4 U% h% C, }# w3 y {
3 I/ h- \# x; o1 l! N3 k! g! ~ if(0 < length)
( Q% h1 D- n8 `+ B {! V1 G' }0 H8 L) f, @
// 写一个字节到 THR. O0 _5 G: U8 H" _& x
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
P2 m K0 m0 e* N length--;
" _- L. t$ y( @% Q( K: S8 a count++;
/ v n: \0 d" m0 P. w }
8 G t5 @ J( j0 J if(0 == length)3 V) q# a. ]3 p5 M3 |4 F7 V
{! [2 L! i: T7 O, J, I. d3 j5 V
// 禁用发送中断0 _. L/ ^9 e* ?7 U# _6 J
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
* ]( f+ I. q: S* ]6 S) e }8 O0 w) o+ ~% R$ O
}
9 |- J5 e8 I5 } e/ u
2 p% N3 J1 c) z$ H2 l // 接收中断! s5 A3 r3 U$ O' G
if(UART_INTID_RX_DATA == int_id)# U; t4 _9 g- {& U
{- I/ j0 |; ]1 \. J
if(status_a0==0); h5 }, E6 `: H6 ~6 s
{
4 u& y4 W& L7 v a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);. F* G2 R0 z$ }% k' @
if(a[0]=='#')4 h* A: F+ U/ Z( Z7 d
{
! _* F, [+ I. ?, P: C" q( [5 b1 _" C status_a0=0x01;6 M6 B' ^3 m1 z. ~
status_a1=0x01;$ O# U% c' d: `
}
: u/ W! U$ W+ A; k/ q+ L/ e6 S }( V1 Z! u+ i) v% M
if(status_a1==0x01)6 e4 U5 ]* S9 c1 ^% \* s5 N
{, P- s' u1 t! |8 y! S
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( z( y" m ~3 R% H1 [
if(a[1]=='R')
3 Z6 N5 i9 I3 m* x4 ~ {
* G, ~; G( {7 @- y6 @! `5 j status_a1=0;
3 R9 o8 q$ x7 \$ r status_a2=0x01;' _* {" ?# b; J. _
}
f k" c8 {5 `7 n+ }2 O- r8 y% L' E }& M: M/ ^; v4 V. |* ^' A- g6 L% s
if(status_a2==0x01)5 Y; Q9 [3 h5 o& E# h% b% Q# L1 h
{
8 |$ [0 K5 F' k5 ] a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: s; U% {2 V% _) c r, B if(a[2]=='A')
4 ?7 z1 |0 g7 Y: W9 n {6 Z- }! Q4 n, T+ m- j' N1 f7 b
status_a2=0;
X" E$ f' I3 z7 Y- F, { status_a3=0x01;4 L, \6 n! {4 e$ m0 f& k
}
' O( o# N2 U; Y! H* P, ? }2 V1 c2 A9 ]) b' A) M9 Y5 Z
if(status_a3==0x01) ~* o7 c) Q8 L/ w# H3 h
{% R$ m: \' y# H* N
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 |2 R- D* t( `, d0 l& d5 G+ K
if(a[3]=='N')
! F" Z- ~; w U% \5 m1 l- l$ L {
7 r- S, \$ B' m! [6 i; T status_a3=0;2 L& C0 Y+ D% u( q9 F
status_a4=0x01;
% S: x( S& X. S: W }$ e3 i8 ?1 P8 n. y
}
+ y: h, z S, }6 z5 x8 H4 Y& D, N! T if(status_a4==0x01)
( c$ l, A4 W, d {4 M9 ` H* x* ^' R* f1 i
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% d: F; H2 f v1 B8 M+ N G" s if(a[4]=='G')# V# ~) Z1 f1 h& N- w2 F5 }
{5 ^. _/ c0 ^/ ]& M$ W4 P
status_a4=0;
. z; d- k. U/ Z' c status_a5=0x01;
- c' U" L. p h. N+ M }
2 P+ q2 o# g2 f7 L: O3 d }
: @/ }* L! ~7 K; T. F if(status_a5==0x01)* w% _8 c% _7 U& H
{
7 i0 b t" D2 ]0 ]* F) ]6 c7 }/ O a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% e+ ?9 G9 h/ B) `$ z$ A! b2 w+ D7 n if(a[5]=='E'); G% i; s9 a5 P" B! y
{0 a( Z) ]2 X7 s# B/ Z% V
status_a5=0;
3 j' E6 q2 m* C3 E4 g* u status_OK=0x01;
2 G) J; e5 L) J U; I( Y& s2 Z9 m }
8 R$ R8 I+ O5 Y* f* \+ _% g }
- t; [+ d ?& l5 I/ i! S- a if(status_OK==0x01)
9 J& q, Q$ C! g; W5 @2 |% ~ {
8 u7 l# M* f6 G rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ o$ K; d. s1 n7 C- Q. g6 s lengthrx++;: B i, T) P; k" v1 s) |& p8 c
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值) u6 b- ~9 f u J1 X
{0 R1 l6 _' v7 [" M1 R* N
RecState=0x01;4 H4 c) ^' I' C' _; _; O- E
}4 f; m5 t# ?- N# h
}
. @& A! k7 B0 l* t$ C1 ~4 t5 n( Q+ x# o6 P
}
* r3 l2 a4 N* o9 Z T; q- ?
9 j7 K G& C! b1 {: U // 接收错误( e3 [4 S9 Q) y0 I8 O& R
if(UART_INTID_RX_LINE_STAT == int_id)
& x9 B* x+ f Y {
+ a# Z. u2 Y4 F2 ` while(UARTRxErrorGet(SOC_UART_0_REGS))
5 o+ K/ f( H( J3 P- k' y4 p9 _ {% ]. z" R9 q1 j. W
// 从 RBR 读一个字节
2 L: Y! l! S! O7 \6 [3 j/ q UARTCharGetNonBlocking(SOC_UART_0_REGS);
" j, u* o* w' i) w5 e5 ]4 V }* M6 n3 M* E4 l9 _7 F
}9 v. V: w: [, X7 \# X
8 @5 q/ I, _ O6 ?1 k6 N
return;* x3 S. d0 L3 g- \+ t
}/ j3 L! l& B# ]; P
0 Z7 Z& c( ^( V2 s0 K' j' e8 @0 E
2 `( T9 N2 b$ a7 y
. S9 l u0 u p1 H |
|