|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
h! j! O& l8 c5 z# `6 `5 L我是在DSP初始化这不太明白。+ B% k2 @9 Y( r; Z5 {+ o
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。5 Q$ x- v, i; i, F; Z# ]
( [& c: i5 P( `& H, x& I
3 v6 p+ J( b3 c% c6 v1 }+ N首先 PSCInit();//UART0使能
* \4 g- z2 ~/ c$ s! r" Q; c5 W, kvoid PSCInit(void): J, q z- b/ I1 G
{: V8 m0 @; N( c1 {* _+ L
// 对相应外设模块的使能也可以在 BootLoader 中完成
. B( K/ Z4 p N x$ D5 O/ d // 使能 UART0 模块
% i( e* E8 D. M' N4 H% V PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);! o D7 O2 p9 d& K) Y
}3 i9 g/ S; x7 @- t1 O
' ?) T5 j2 m# ]7 L& h
! d* g8 _3 v2 A然后是 双核通信的初始化 AppInit();
! P6 \! p) a7 {! Q: yvoid AppInit(void)1 o( g6 c$ {2 `; }
{% t6 F2 {% H) l& A5 d; Q5 i
/* Structure to initialize IPC (see Ipc.h for definitions) */
) w0 `1 K: X4 D+ N q6 p' y' _ struct IPC_cfg ipcCfg = {
. w; d- d, s2 X, Y, X IPC_DSP0, /* local processor Id */* p. ]9 Z0 m$ U' o0 V$ g
IPC_ARM_HOST, /* remote processor Id */, L1 W' n: B+ W! j+ C9 ?% u
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */' L; ^7 Y6 h; s8 Y' e- O; {9 I
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */" [6 B0 ?$ d. r% z' A( f
NUM_MAX_EVENT, /* maximum number of events to be created */
- m; u c6 t0 M! i6 `7 e &ipcPvMemDsp, /* local side private IPC memory */. U! m* }7 j. L& k$ W
&ipcPvMemArm /* remote side private IPC memory */
: @1 b$ N! O7 E) T m };
8 ^3 e; o! D- S5 j( ^ IntDSPINTCInit();
2 L" v+ Q; J6 q7 `! l IPC_init(&ipcCfg);
1 x: I, X3 v8 L/ h5 Z6 o0 e IPC_intRegister(C674X_MASK_INT5);0 q2 {; X& I( D' Q4 a8 z
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
- N7 g" z9 q% a3 Z& a
' \# {' U1 O2 U6 N) i, D0 `3 z /* Enabling interrupts for DSP C674x CPU */; x8 }4 U3 ^. a' f0 U% y
IntGlobalEnable(); /* Enable C674x global interrupt */
7 v/ @' {# b# ?2 K% Q" K iAssert (Notify_start()); /* This will enable IPC interrupt */8 D. ~, O) l$ y
}7 B! M& D, @, M& T/ G. z) r
9 d# J& \3 x8 J然后是 : D6 x0 ? [1 B
// UART 初始化
) D9 _* m1 S4 x7 h+ C UARTInit();
" e0 U% `1 h, z" N, r8 u# V
/ r5 O' C1 A3 d$ F3 Z% n7 v- Z // UART 中断初始化
1 Q. v/ t4 U: k& n |! A8 L UARTInterruptInit();
, r- z( V+ @1 A& b+ W* B) g' x3 V+ f6 J
0 e1 w1 o6 S1 V$ K. K! Z
void UARTInit(void)% c6 ?0 I6 P) g& G9 Q" ^* e" p+ M: N
{
% K" H8 @5 T) }; b // 配置 UART0 参数/ J- W) ?4 E1 e% ?4 _2 \3 v9 f! V
// 波特率 115200 数据位 8 停止位 1 无校验位2 S& l! k4 N* v$ w+ l3 d. y
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
( t* j( [7 R8 p- W0 K: f2 e9 L& Z UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. m' a2 I" i4 C& w/ F
// 使能 UART0% q2 q: x5 Y" p3 e
UARTEnable(SOC_UART_0_REGS);
7 Z( G7 l. ~# F, E6 Y7 v, h( r: ?8 L6 f5 Z0 y. {% i0 G1 B' M, c
// 使能接收 / 发送 FIFO. \% O2 n! h+ h4 K; [( |6 g2 p
// UARTFIFOEnable(SOC_UART_0_REGS);, {( n2 k3 g+ u5 ]8 B" w
, w# O8 k- D. a: h UARTFIFODisable(SOC_UART_0_REGS);
& h0 c' I2 C. v9 ~" \& `" M, i' Y. I$ ]9 M |! H( H4 t; I! f" s
// 设置 FIFO 级别 接收FIFO的级别
1 |5 C. S+ ]/ X& h) G// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);6 }. E6 W5 y* H5 O3 C: x
}" P: S- c' Q- a/ q% P' M8 s8 @
: U( l! C: ]6 |* L* j
6 J0 m& J2 D. p6 jvoid UARTInterruptInit(void)
% n* J; a' l6 h0 z& K{/ Y) L1 l$ _4 \* Q6 {7 ?. o6 A
IntRegister(C674X_MASK_INT4, UARTIsr);
8 T$ F c) g3 M* h! _# O+ n2 ? IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);9 B3 e7 t E" ~
IntEnable(C674X_MASK_INT4);
& K6 V% K( x/ ^: x, u* {; }
1 a) z0 ^7 Y4 H' \, A // 使能中断: l _8 ^1 ]6 x; X
unsigned int intFlags = 0;) l+ k6 ^) m/ |' S" B% a6 F
intFlags |= (UART_INT_LINE_STAT | \
' i0 C- E1 \! _6 C UART_INT_TX_EMPTY | \
/ b$ f8 B, k' }2 I UART_INT_RXDATA_CTI);
3 t/ i1 f* D+ a0 d8 n' R' k UARTIntEnable(SOC_UART_0_REGS, intFlags);
2 A9 s) n( V7 R" ^6 B! L: M}6 S0 A4 | K4 T4 [/ y
. H# C6 I; n) C* ?7 m
! i1 N: a# g# ~+ b. X( f1 Jvoid UARTIsr()
$ v# d6 @; q: B p; N) _{" @7 G( C& A3 |* m8 \; g8 ?# S
static unsigned int length = sizeof(txArray);: h* h0 Q. H3 A3 Y @# s: S& P
static unsigned int count = 0;
4 T, q- i4 q( m* U unsigned int int_id = 0;+ c4 Z% ^- w+ M& `
, J' t: w' S) Y1 A4 n. u5 c
# B7 L. C' \; s! r3 P
$ A. ^" b$ c8 w
// 确定中断源7 x) a; n" H$ _3 {( g2 h1 q
int_id = UARTIntStatus(SOC_UART_0_REGS);0 ~ }# S3 Y2 q4 D
$ j% [! q1 E. I k$ B // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
% N# n. \0 B. N( Z; b* Y; }7 G3 {, C, o; M8 ]
8 y/ C2 h d* d2 I' `. j, F& [
// 清除 UART2 系统中断; g+ A0 [7 Q: v4 y. d1 X7 i3 W
IntEventClear(SYS_INT_UART0_INT);$ C9 n! q/ `5 K) u1 ?) U/ h% ?
9 x) Q2 l9 \% e# O' m* x5 `9 z
// 发送中断& {& C# }4 d, y! i
if(UART_INTID_TX_EMPTY == int_id)8 Z( P& R5 N; P- b& m9 V' d
{# ]$ u# Y; S! o0 j3 R" A
if(0 < length)
+ ]- \: P9 \% F2 _1 P( T2 j {
" C' w; w( I9 U' }7 d6 r // 写一个字节到 THR1 r# c L9 w7 t9 D; e( b, |
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);/ [ l7 l: c+ v/ h8 j+ U3 \
length--;
1 o; K& x% N2 ~, Z3 x2 T+ q1 h count++;) x- K7 c0 G6 p
}9 g3 F0 ]& M H
if(0 == length)
! a/ F+ M$ L( A+ J& N {
; {1 g3 i5 U! ^/ i9 R9 a3 W // 禁用发送中断
0 O @# ~& N/ H' w! L UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
; m+ ?' w( i* u; f: x# n. {: p! B }
8 V: s8 o; C! [& e! z }
]6 ~# d# i! t( z9 @9 c
/ e' |/ }3 H8 g/ c) _ // 接收中断4 m+ A0 r8 ^6 B7 W7 x! ~6 s
if(UART_INTID_RX_DATA == int_id)" a4 w* m+ h. Z# N- U
{, A4 T2 `. q7 u& v: u( G3 u
if(status_a0==0)
9 `: v4 t. M p8 f" ~( A- g {
' D1 ]( Z2 F. r, \' {8 c$ l a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 b Y5 Z$ M1 z7 I- ~
if(a[0]=='#')& \& ^; F- q; g) }4 A I
{
. W; _. G) z5 @- C" E8 c/ } status_a0=0x01;
3 F( |& [! x1 `- g, T, L+ w status_a1=0x01;
+ n+ r1 \% _) T3 O' H8 _ }
) N6 K: F% Z1 s8 b' @7 K- k }* e& U4 F$ J. X; A! ?
if(status_a1==0x01)' j0 K2 S( P8 E# O# F- g* T: S
{; f- u/ c# P6 b
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- c5 Z& m3 ^, Q) ]/ Y
if(a[1]=='R')% e- a' `$ `- b+ ?+ W: P
{( q; a8 ?. V$ t& `
status_a1=0;
: w9 F% V |- v6 s' r2 `. |/ n status_a2=0x01;5 }8 j* I& q4 z1 C
}2 `8 {4 g: M4 Y% x7 B& i3 x* p
}
* ?3 X) u. M2 \; c if(status_a2==0x01)0 X( m; n f" n- P. ^; A7 j
{
3 h5 `6 U; s9 V! L a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 v9 B. B4 Y% K3 X( G: g E% f if(a[2]=='A')
7 z4 {; o9 f* Y4 F% X1 g. c4 k {5 s! L: W3 M1 K, q' T
status_a2=0;
+ \5 h) Q0 z6 o; }" @7 g status_a3=0x01;
3 e: c6 I9 V! p4 w* I }
4 r: e1 R- `# x5 p a }% C( E4 j6 G! ^
if(status_a3==0x01)
) Z: @, M) l& h {
- u! b" p/ [* S/ }; f7 p0 m a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);/ e( M+ P* x0 Y: R3 t
if(a[3]=='N') b2 T& @ V3 M! G! V3 |
{) k* X2 i9 ?; c0 e$ {1 e1 _
status_a3=0;" N) Y+ @: I4 U8 i) Y7 D9 V+ F
status_a4=0x01; Z: r8 }- C* R& v1 g' [" q
}
8 _& F/ \9 P+ P+ H' I- { }
- l3 F, N; s# Y6 `. C. n* E0 P6 F6 x if(status_a4==0x01)& P# A d) E" e4 r! X& }
{5 C* W- P% L: h5 a0 T+ c* R
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! s4 n9 N; ~+ O& |8 C" r9 A; ~ if(a[4]=='G')
, Z+ C8 ^- [ T8 G4 C0 |! ^ {
`/ L2 i. m$ M6 M1 j status_a4=0;+ Q) P/ V+ L, K& q3 B
status_a5=0x01;2 N. d7 }+ G- S( g9 v
}
$ B4 c F: g- Z7 w: ^6 H }
3 B8 ^# ^+ i' P3 t+ } if(status_a5==0x01)# Z+ J( [) R4 B
{
# f9 C+ b% S# \6 H a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 n3 Y9 j E7 V* A d: ?
if(a[5]=='E')
# Y! W+ H7 J( g5 N {
! A3 ^2 H/ {: R# @" {) ]& }% R status_a5=0;
. K7 z. p: m: e5 W( c status_OK=0x01;
3 o2 P; g; s" u4 k+ Q }8 O; o% N( g& D& U
}6 Z- }3 R' ` o6 T
if(status_OK==0x01)1 y+ w% A: V+ a: G
{. k* k* p v" d1 B: |; i
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 {7 Y6 z2 W n+ C2 C" k: j+ L7 f lengthrx++;: M2 H. ]2 i9 W9 L, f+ u; Q
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)8 u2 \0 w* J& Q- D% m. \
{
3 e/ \+ ]0 B9 _* O9 G9 D# B RecState=0x01;
; j/ v3 b% W8 n& s. H! l }, ]! K. L8 W& M8 s: M
}" ]- I* i2 P% u( B) T
$ r6 ?# B& a2 l2 G5 C5 R
}! M9 s1 v# T R7 T9 @
# F5 ~" D( ]" Q @! y
// 接收错误
6 t! a O: f8 j4 o0 ?9 ~# c ~ if(UART_INTID_RX_LINE_STAT == int_id)
2 \" Y9 G3 x% P6 q' g! S {
B- g1 e. b& L3 r% o4 A while(UARTRxErrorGet(SOC_UART_0_REGS))4 f7 q9 f+ `2 @0 _- H) X5 T$ ~& `
{
: l# k$ J# F! H3 h, k // 从 RBR 读一个字节" c+ |+ l3 V2 p1 _$ y
UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ {" i# _5 ^2 L( e! G, i$ `* \9 S }
" R$ i5 i- R0 }# @; ?( c$ j }
t* I- X: o2 ^! K5 V `% o/ z, B4 V& ^5 Z+ `
return;: x' P! d, ?. k1 I
}0 _/ I; i; `% E, }. w1 g- R
# D/ c( B6 b3 S& |/ Y) Q: {
+ {8 u0 n+ [1 K- I0 x( M4 g2 {) w5 i7 x$ m j b3 i2 v
|
|