|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。; `( c7 [2 P: i5 c* `! }4 @' r
我是在DSP初始化这不太明白。; U2 k' d& Y8 f0 G1 o2 ?# v7 Z
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
- Q6 z3 ]( d z5 K4 E+ X O, \7 ^. l0 R0 w8 Z7 s
" O! \ M" C" p5 r/ V0 w5 Q0 W, v
首先 PSCInit();//UART0使能% X8 E9 \: ~$ S, u+ Z- M
void PSCInit(void)
$ _5 p- X7 f; |{
+ ^7 m7 ?1 d5 L6 X // 对相应外设模块的使能也可以在 BootLoader 中完成5 o! ]0 O/ t: N* p/ e+ B+ j
// 使能 UART0 模块7 e$ t( e+ W4 c3 K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 X; V+ Z# D6 P0 [4 |1 C$ n2 G
}7 J+ @7 M( Y, a# n6 u" K
7 N- j: M+ a6 x# z2 u5 d8 X
& z/ R1 @) t+ O# D3 k3 t1 Y然后是 双核通信的初始化 AppInit();- ~' _+ z, ?& [
void AppInit(void)
( l+ T" J( Y: O! {+ v: H3 T{$ {( ~1 G7 F" n; A
/* Structure to initialize IPC (see Ipc.h for definitions) */
& s) b, j1 ?; f% ~# o+ @ struct IPC_cfg ipcCfg = {
0 e) n( n* W/ ?0 T, u' E IPC_DSP0, /* local processor Id */: b4 d1 W M) B5 T' ~
IPC_ARM_HOST, /* remote processor Id */
% v" g! F& Y$ s. P IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU *// C) Q$ s2 G" ?. Q3 ^+ {! d9 l# p
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
5 y$ r& {- z9 w NUM_MAX_EVENT, /* maximum number of events to be created */* K" g: [% J2 {$ y
&ipcPvMemDsp, /* local side private IPC memory */
k% l; r1 N9 `% Y &ipcPvMemArm /* remote side private IPC memory */
8 }$ J6 U5 C( d8 `2 i };
, _+ F1 M* q4 O: s( D/ i IntDSPINTCInit();9 m1 \. [4 z- h3 ~4 W0 {' x" D1 W* X
IPC_init(&ipcCfg);- w# M% Z9 }5 O/ d. q8 m
IPC_intRegister(C674X_MASK_INT5);; w9 ^2 d7 k2 Q9 g0 |
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));* q. S9 ^1 i0 o
. {# Z |7 w; P6 W; D /* Enabling interrupts for DSP C674x CPU */
, k$ T% Z. I5 B: R2 e0 r, x IntGlobalEnable(); /* Enable C674x global interrupt */
2 r) D( ]2 o% g! S# p. _; G iAssert (Notify_start()); /* This will enable IPC interrupt */
, e e. Q# z/ D1 c} C; q0 q* C$ `+ n/ S7 U# j
0 u- T5 b1 m6 j! X; j% U- M; z
然后是 ( ^. t9 n& J5 y4 F7 i7 E
// UART 初始化
- u3 m7 [" `) T' X+ T# H& X UARTInit();
1 ^0 d" B7 e. g" x4 f* P- j
1 k5 n% H9 q: W! ^4 S // UART 中断初始化
3 T) s7 ` d' W( c8 k# A7 u UARTInterruptInit();8 N& J# h# [5 K- e: S* _4 s! \
% [) G# o) M6 N; m$ r+ E/ H
; _; ~# D ]2 a9 u8 ?. @void UARTInit(void)
# Y+ G F) V# @3 ^7 M, x1 g{
x1 ^% M( Y8 X // 配置 UART0 参数
# M M9 U, h5 b) B x // 波特率 115200 数据位 8 停止位 1 无校验位1 e9 B! H2 \% p% ?
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
8 D& u5 I( }' z4 L8 k( o UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 ^+ T) Q+ b7 r. j' c' L* U; O
// 使能 UART0
; d9 S7 j; {: k& u$ Z UARTEnable(SOC_UART_0_REGS);; b. M: u6 I' E& ]' l
: |3 n3 J7 n9 B) i
// 使能接收 / 发送 FIFO
5 l2 u6 N/ h# E" d8 w1 ?// UARTFIFOEnable(SOC_UART_0_REGS);5 E; \2 w5 O6 B) U4 d" V) ?
4 R* ^( w' P0 I& {6 M( o! w( i UARTFIFODisable(SOC_UART_0_REGS);
* ^/ ^6 H* |# {4 ~5 \4 s `" j2 Y& M2 ^5 Y# ]' K
// 设置 FIFO 级别 接收FIFO的级别4 p$ G$ O6 T7 [5 G( g3 s
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);3 m$ e' a& v; ^; `3 k
}5 C) A' D* z# ~6 M- `5 m" p% Y
2 o4 I! {$ _, Y8 O2 j0 B9 r4 {: |3 ?3 C, r
void UARTInterruptInit(void)# q, K- J/ z7 [
{2 b: o! j* S# ^
IntRegister(C674X_MASK_INT4, UARTIsr);2 P; \' M8 x+ S; m3 N
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
2 j2 i( Y9 }$ b4 }; i! Q IntEnable(C674X_MASK_INT4);
1 W/ i4 I% ~1 ~9 \$ ~/ ~( g1 ?7 E) z2 t
// 使能中断
7 @" |1 F" `+ k* @% q/ ]" @6 c unsigned int intFlags = 0;, v; n/ x5 H8 O6 R
intFlags |= (UART_INT_LINE_STAT | \
! O/ N$ O, O' x3 u& ]" j/ m UART_INT_TX_EMPTY | \
# Z6 I" L+ m) L5 C8 q" M UART_INT_RXDATA_CTI);
( R5 |+ @$ }0 p% g1 g0 W# n" [ UARTIntEnable(SOC_UART_0_REGS, intFlags);
: Q6 _4 g8 _$ `% v* P3 N}) d+ l" D0 d6 \. Y+ ]2 s* B
- o. }1 U* y; b
3 z9 T; Q- L' h7 ^* k) o9 ~4 B) M) w
void UARTIsr()
* g& Y& T) [) O* e{" l9 |- Z+ ^5 I7 N l
static unsigned int length = sizeof(txArray);
/ V* P& C% m$ J, ~, } static unsigned int count = 0;4 ]' r" q4 I9 g
unsigned int int_id = 0;! t/ {1 \& \, d0 _0 `
2 s. l4 c) k M' ?$ I. z& `
2 m/ d" L3 X+ K: _) A, H* n1 l* E: y, P' ]# j" a
// 确定中断源
" g: o& ~" k- b0 r. I int_id = UARTIntStatus(SOC_UART_0_REGS);8 w0 i* X2 K: q1 f/ Y( c, y: g0 [3 _
6 h2 `, q, C4 m: U9 K; s5 Y" s9 _; V: _
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。' @9 g+ X2 s* V! \3 @
; g# h L5 L D% q7 \* x7 J5 ]$ E) l/ s. \# u' \! m
// 清除 UART2 系统中断
* ~- J& O" J4 ^& K( H IntEventClear(SYS_INT_UART0_INT);# s! _- V6 r% W5 \
u: r5 m3 B% F" _( I2 @0 W& s0 Q0 i // 发送中断
' } y5 ?8 W) S/ E if(UART_INTID_TX_EMPTY == int_id)
6 x- w9 U& I. P# ]$ @. k7 } {. \4 C# u; L; e3 ~
if(0 < length)
/ Z" r) }. Z. q {5 w3 s8 C. W5 u& t
// 写一个字节到 THR3 X: q5 y" e$ m5 q
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);' o z$ |5 U% D' B" M z
length--;% r# q* e1 j) i; X1 S% a8 L: k
count++;
- U1 h1 t H; U* P+ ^* Y6 s0 T }$ W) k7 c5 m( _8 j3 W
if(0 == length)
k% C& P& A1 d! L; P' x( A {
0 ^, D; b d# i7 W# H7 T // 禁用发送中断1 h6 x: Z: i6 o
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
4 S8 a1 ^8 W( S/ C( X; u& B; u }
+ j9 E7 O b8 I }
6 w. L6 e$ i; f9 j4 B" \6 s! c# n9 J; y# B( M
// 接收中断/ b& z5 o9 ^, g- @9 [) h( t2 s& x- A6 D W
if(UART_INTID_RX_DATA == int_id)
) m( V/ L" [, I1 p: N {
. o% N7 l- O3 O% W if(status_a0==0)
) ?0 O2 C5 n/ l9 \+ y4 U' F0 e {3 M3 c/ ]% q% h/ F; ?' X" t% I
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 t0 |3 E: S$ n; F if(a[0]=='#')
4 H3 O7 M+ H* R$ b( _# ^ p/ R {( g7 b3 [0 u% W; }; ?3 _
status_a0=0x01;( C6 l) E$ I) I' i
status_a1=0x01;
7 E3 T' Y9 e2 _ }
8 M* Q7 O: T/ o j! r }( y6 K8 L0 U: j" _7 d
if(status_a1==0x01)
3 S7 C/ _+ K+ |- _+ [- d* ] {
( S H5 I3 x, L: l% N a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( j# E* w! p9 K: B, Y3 Y
if(a[1]=='R')
5 b5 v% ?# d% ?+ A$ Q1 W! p z {
$ w- h3 n3 \6 L6 }3 m1 D status_a1=0;
" Y% l% t5 l, e status_a2=0x01;
7 `: L* B/ x& i( K% Q }
+ B/ f, Z7 a" K( D }
+ I! Z) D/ z' P, @6 R if(status_a2==0x01)/ w+ ^+ {1 `% r
{
) t/ l2 b1 Q8 A/ a( J7 d% { a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ l. o* Z: V5 |+ ]7 g! ? if(a[2]=='A')
# f3 @" w: F7 j9 M {0 |, k& Z+ ^6 _% v5 V7 Y* n: S
status_a2=0;
6 G0 x# ]. R5 o0 U( {0 _2 e status_a3=0x01;
0 v7 Y \/ b, } }+ M) B! }$ e7 E) c* c% i3 k
}
/ b8 @3 r- R1 q3 S if(status_a3==0x01), B4 h. L$ ~( k5 ~2 P
{2 F- V5 a4 S1 j0 r
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS); o* N* D9 P( E+ h
if(a[3]=='N')/ [' Y" N+ F0 E5 {1 n
{
$ F+ T# P$ }" ?: L4 d4 R$ m4 v status_a3=0;
% I( J: D: ~% H( z6 W; i1 D! t. o status_a4=0x01;
* D* `' n; d" i% C4 z: F }8 e' E: E+ k* u+ s) A
}9 V- K: `: `) u
if(status_a4==0x01)# ]9 I1 \' T) _: i' _
{
( t1 q8 }+ w5 N* G r a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 A& V$ g W$ M, s if(a[4]=='G')! j, A, h/ V8 Z: P! I& H
{" d, f; A* z# m' Y/ M
status_a4=0;* E$ Z8 L2 p5 R- a3 @' g
status_a5=0x01;
! m0 I+ w; X; _( _" s" ? } h7 V/ E0 o! r
}
1 P) q( _8 M$ U9 R if(status_a5==0x01)
- w. v. q7 U8 b! O, p1 d! f3 [ {
9 I# p9 J7 _0 U6 B a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 V% r) x( ^- W if(a[5]=='E')5 w/ t% A' R! `" z# V6 y3 O4 E+ Z
{
8 k( ^' B8 t. S* @ status_a5=0;
6 o) t0 L7 X6 C6 X+ ` status_OK=0x01;6 s4 C; V& r5 v
}
$ l8 J+ i0 A0 M }
' [& I) s0 L7 f0 S if(status_OK==0x01)
. b X$ k* |7 P& J) D$ q {8 w5 [* g4 o4 z; i
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, c2 M. J1 O. G4 w/ c, R- v6 _
lengthrx++;
* Z1 T, _ ?9 o( l, o! n1 X if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
' i* y& O* C/ k5 k1 h {
) \( z/ a4 g& U RecState=0x01;
) m8 ~3 \2 ~5 m6 r }& n& S* i' C: ^( Q6 I/ w: s& i
}6 K9 J2 u, a* F' Z/ M( r" R+ g: D
8 E. H! p5 B* S$ g }
% R# c0 A2 }3 t3 n3 O+ u8 k% O ]" n
// 接收错误
2 ^7 I& Q8 M/ W0 o9 A if(UART_INTID_RX_LINE_STAT == int_id)
A7 C% j/ R" m4 B% h% t& B {# j. H# [! t8 ~+ t4 H' N
while(UARTRxErrorGet(SOC_UART_0_REGS))
! w3 M7 n8 ]1 y {, {9 w9 c5 @! e: V3 y$ o7 W6 w& m( U
// 从 RBR 读一个字节! D k) a0 F- ]1 F- l
UARTCharGetNonBlocking(SOC_UART_0_REGS);# U% r; ?8 x' |4 a
}
( J C* V( w" M' Y8 b* l1 {1 v }
2 D5 n! |6 p7 k/ {1 T, y: E" k: }- e- B8 p( Z3 B
return;
$ b6 F' [- {! w9 g: `5 Y}: }7 n: Q# A7 K4 J% v
2 h A; l. Z% ^. d9 U1 B9 {. Z
# w% \, x: m6 x- W! j, H& i
" |* H; ^. E1 v5 U1 g6 e |
|