|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。4 ]; f8 I/ a W$ p1 t
我是在DSP初始化这不太明白。
' ?5 |1 M6 Z; \! f* u' B; D. Y初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
2 b. V" N! m/ }. E) U/ ~1 s6 w8 X H* n1 q% m, z
; F5 i0 k3 P8 ]0 K- E& N
首先 PSCInit();//UART0使能$ ?6 j5 D5 N7 l8 Y5 I- x- Y
void PSCInit(void): c8 c4 {5 o1 S% ?
{
6 \/ F& A$ F7 j/ V2 H9 a // 对相应外设模块的使能也可以在 BootLoader 中完成2 l8 S5 q# ^* { _7 ^3 o: `
// 使能 UART0 模块
% g: J% r- G" v1 z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
! R. z, h2 T8 f4 v& K7 s; f, s$ k}8 E7 G4 n, B8 T7 A
1 Z! |& ]8 d' x& w' b. w, k7 U, G7 C9 x
然后是 双核通信的初始化 AppInit();
( Z/ x5 a1 w2 P. F1 y9 A2 jvoid AppInit(void)
1 @/ F$ J, `4 ~' I) t* p, c3 W- X{; w J2 c5 o8 G, o9 K8 E
/* Structure to initialize IPC (see Ipc.h for definitions) */7 ~$ Z' \0 g" V E% A; S) n# S
struct IPC_cfg ipcCfg = { P$ f' J1 a- {# y3 d+ V
IPC_DSP0, /* local processor Id */
/ l# H+ {4 z4 D( e8 ]; E$ H IPC_ARM_HOST, /* remote processor Id */
8 @* i' I, r. E. G: a1 J IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
& A( _; w* n7 C5 e1 K" F5 x IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */) Q) |: S8 F9 U i
NUM_MAX_EVENT, /* maximum number of events to be created */* N$ H# O, b$ g# ?! Q
&ipcPvMemDsp, /* local side private IPC memory */
5 o. [. n6 y% s' K k &ipcPvMemArm /* remote side private IPC memory *// e. F4 X' `6 K; f C# T; q
};3 Z8 G/ V9 U# ^; L' |
IntDSPINTCInit();2 S$ P$ ~. v1 r& G
IPC_init(&ipcCfg);2 r/ o% ~# o+ n( d
IPC_intRegister(C674X_MASK_INT5);
1 |8 P& w! T& C5 A, h' k- R8 j iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));) v2 r5 @2 k) t1 F% K4 J& v$ A
/ I5 Z! O/ _, _9 V9 B$ t
/* Enabling interrupts for DSP C674x CPU */
- d- X, U6 Y# D1 P: F" E6 ^9 I' Y( x: U IntGlobalEnable(); /* Enable C674x global interrupt */3 l" j" C6 R4 w2 d4 B" U4 A, `6 \
iAssert (Notify_start()); /* This will enable IPC interrupt */
* u3 Y s5 G3 g1 I; J}
7 T% ^5 G- ^/ e+ B; W" J$ F3 Y2 M, T7 {1 e# n
然后是
" k5 M6 }! f" g9 f: c // UART 初始化! q5 m! l8 o/ s5 |
UARTInit();
& S' b2 f' Z n% v% K- Q8 L9 p9 e% M% [
// UART 中断初始化
5 Z; A3 K7 ]( q, T! A) i1 k0 w; C! R UARTInterruptInit();* V6 m, g8 s5 T2 r
}. `( C r3 s- k/ K) W( n( c2 _( z1 j
void UARTInit(void)/ |: H# q# f f2 C5 t/ \) z: w
{; }! [" o ^; c8 {
// 配置 UART0 参数- t& Y1 F6 Y/ u% ?) \* F: u9 x7 F* V
// 波特率 115200 数据位 8 停止位 1 无校验位
4 X/ Z* Z x: y$ I0 X( Y UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,' `8 G) w! T' C3 g) ^
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* f( g/ `' g& @/ I% U
// 使能 UART0; T3 K4 d( k* N: O! q
UARTEnable(SOC_UART_0_REGS);( ^' P1 C3 J: ?& M% G
2 w+ T2 ~ y2 t% n // 使能接收 / 发送 FIFO
4 @$ y# g5 @( _+ }! V8 `% m// UARTFIFOEnable(SOC_UART_0_REGS);
, ?! h6 C; H' }. E- V$ M [6 z
2 K8 D7 Q! ^* G UARTFIFODisable(SOC_UART_0_REGS);
; F# u+ {5 I/ t
9 {8 ]- @' _& `1 L# F4 q // 设置 FIFO 级别 接收FIFO的级别; w" m/ W3 Z8 w5 l& h/ D2 ^
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1); u& e' q5 n6 Q0 @
}
" j' f( K& l) v4 e0 L4 P; z" }
, @2 |. J. U3 [, v, I. E$ h0 r- r4 T) B* S, k: I
void UARTInterruptInit(void): b0 q: ~9 k+ _( M6 S2 [ r
{) r0 \% {, d5 o9 t& {7 D% W
IntRegister(C674X_MASK_INT4, UARTIsr);
) C& n2 [/ Z# A0 n& z7 F IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
$ ~7 Q! b K; d' D# X" o2 ? IntEnable(C674X_MASK_INT4);# F, T. I) C2 k! x6 R
9 |! f, d, Z* q! v: i3 B: ^
// 使能中断( R' E& y) Y" U S* C# R* V& b% h
unsigned int intFlags = 0;" D7 _, q. m8 X) u
intFlags |= (UART_INT_LINE_STAT | \
9 n# S6 L# x6 r7 S5 I0 r2 I; { UART_INT_TX_EMPTY | \
, f* k X4 q% ?: t0 c/ v UART_INT_RXDATA_CTI);# s9 o" R0 h1 V/ g, V
UARTIntEnable(SOC_UART_0_REGS, intFlags);
; e1 E# \, f# I8 S+ b+ P/ a}
# x9 J; d f5 F7 ?, J E; ?1 g( @. H* \4 L7 a9 j- s6 |
* K: X/ s" i* h' F( Ovoid UARTIsr()
5 j5 l* ^" ~6 |, ]: Z: u& Z7 |{" T$ S% a( W" k6 u6 P. F
static unsigned int length = sizeof(txArray);
# r5 m+ {* j: G0 Z% s static unsigned int count = 0;$ n. ^4 p( j7 j( w! j1 i
unsigned int int_id = 0;
) [5 ~3 N# i5 g5 G$ H" Y( ~4 e6 s7 D. {& D, B
1 I2 s( f$ c! {+ T$ f4 U! g
: w# I0 `+ i& S2 I4 P9 j // 确定中断源
* k0 h, W- W6 c: E. w int_id = UARTIntStatus(SOC_UART_0_REGS);
" u4 i* i% e* \5 I
+ N8 q8 _5 ~# N( i // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
, [5 q* I' }9 b& [3 {# K. ]8 L r+ s6 j% Z
- Z6 R* Z2 n( z- G; g1 v( } // 清除 UART2 系统中断
! a7 N# o9 T7 Y; M IntEventClear(SYS_INT_UART0_INT);
8 [2 A, g5 D4 t
: I1 C* t& }2 H9 ~) w( ] // 发送中断
4 S' B5 w( Y | if(UART_INTID_TX_EMPTY == int_id) ~$ A3 B5 T7 z# ?6 B
{, I8 B1 B7 Q7 @% J M; h4 [
if(0 < length); J" l: e3 `5 m
{
, D# ?! x# ?1 I+ _$ ~ // 写一个字节到 THR6 L5 b* C( A$ i- w6 }* D' w& c
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);: n' e: o( Q4 M6 _
length--;
5 d; {! n1 V, W- d3 r count++;) u6 s9 f0 R, Z$ x: O, h2 H V) _1 O
}
+ k9 E# {3 r1 u( A! ?6 g if(0 == length)' \9 U$ H* d+ H7 Q! F/ E/ s
{% q4 Y) j8 b. H- ^
// 禁用发送中断
, B& R& n1 v0 z6 Y. Y UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);3 J/ Q+ C6 v' P& C. S5 P) f
}; D& @, D# A6 }8 v5 Y
}: `8 D$ v" f0 _+ W( M
3 |& J; ^& a4 M# o! E$ Q // 接收中断
/ l$ T; s( N! P2 Y! J. t- c1 h if(UART_INTID_RX_DATA == int_id)! [1 |$ V) z7 @3 o' Y9 u0 B
{9 R1 e4 f/ [% M: D! g' Y" D; N
if(status_a0==0)
5 ]$ n2 s, y! S }. D0 r {: D& x5 S7 D7 ~2 t% _
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ u1 ?& D z: M \( a- m if(a[0]=='#')
7 O. W. Z2 B, Z1 Q% H- W+ [ {
8 @; ~8 v( r+ w7 C. q3 a status_a0=0x01;
) u* ]/ T% S1 A% b b0 N1 [ status_a1=0x01;: ?) i# K& b; }% h @5 b
}
, q4 g+ V: t# h/ m* t# I; q }
+ f3 B! a: H6 X- {" [ if(status_a1==0x01)
& x L1 g' @0 B8 _# i {
1 p9 X; Q; P7 ~9 g; a, i" Y a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& ~1 a. y, U* P: o% K if(a[1]=='R')
/ j" _: D/ Z% _9 W# T; { {& N" J4 z( F$ a, u$ g6 P+ J+ o
status_a1=0;
) @) J+ v" `* Q8 p6 o) z status_a2=0x01;
% ?; o7 @. t, x( ?. E. w& e }) d. A/ ~- G( U' f/ e1 L2 F
}; }% S0 X1 G6 g2 M0 Y
if(status_a2==0x01)
# K+ p; ?" ?7 d. P {
# O( t Y/ m$ i& f a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: M$ q! N$ `" s% c1 Z
if(a[2]=='A')+ d" ?6 w% N# U5 Z, R% _7 c
{6 z# W( n6 W; U2 A# D
status_a2=0;; M+ ]& Z4 l1 b. M: g- P
status_a3=0x01;' o, \7 H! D: j: W) i1 p
}
9 e* t( B5 M% r/ }; u% Q, f6 x }2 j! T" S: W$ l. \( O
if(status_a3==0x01); ~) A$ w# [5 `" c* E- k
{
0 q0 s2 ~% r/ y( t e! H+ _ a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! p0 q$ G% A A; t1 q: q) v0 P. Z if(a[3]=='N')
( x, L6 _9 G! _% ~ {5 ~. R2 H+ W! D5 t+ ?% ~
status_a3=0;
; V0 E. I& O# e2 u! u6 A" Z2 {" d status_a4=0x01;) W+ L- b- C5 C! S
}
- N* R1 z" c5 z$ u' j }& Z2 z$ k8 N3 H8 D8 Z
if(status_a4==0x01)$ ` h5 M0 p# y E3 B( @
{- O! P, O1 D7 C$ e S' S
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! B( Q# b2 Q: Q4 u if(a[4]=='G')+ y7 F7 P2 z" s% L) A: a
{+ R: E6 w- V, k z9 `
status_a4=0;
! V9 j, b) r# Q. F' f status_a5=0x01;
- _9 ]0 a0 A6 D& A& s, T$ Y }' n' r }
5 O9 G* ^3 P" W" V. q( ^% Q }
( X& ]6 f' x; F; s* x( M- j& f if(status_a5==0x01)% q7 G. ~" [ c8 N; k0 V
{
B L+ [* K# C& x a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" H+ W" I7 j* h3 g6 J& Q$ X9 s. V% u
if(a[5]=='E')6 r( U3 S3 K% X# i, @7 X* d
{
" Z( G, X3 E g5 Z5 m status_a5=0; r9 b& u \$ p. \9 K- T
status_OK=0x01;
( C' `' M8 s6 a! v% a! Y% _ }
; n1 y5 f0 L6 \6 ?- m! A- w% U7 E: N }
3 l5 o% {# Q6 u' r. h if(status_OK==0x01)+ d& U/ H! p% f, E( \: G7 C
{3 ~, L/ X5 u* J
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- S$ ?( U' a- c lengthrx++;( i4 m; U+ v/ ]) g
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)/ C" A: _2 w; N- H
{
9 X" {/ t7 u3 d b RecState=0x01;$ @8 V$ W" r$ T8 ^
}
. y! E) c$ z) Q }7 A* D/ |5 ?7 B
& x6 r: q* S6 Q( m }
# k9 W$ _ E! l0 ^3 q
% v; A* V/ d B2 d$ l6 c7 M // 接收错误, \6 U5 c: _' B6 p |- Q% w
if(UART_INTID_RX_LINE_STAT == int_id)
2 F0 } v: e2 W0 D8 [ {
" q) y* h( x, b/ C/ U while(UARTRxErrorGet(SOC_UART_0_REGS))" W6 }" M0 Z& b5 N$ q" L1 A
{- w; `* S7 }7 U4 y* B
// 从 RBR 读一个字节
9 ~' t& f# R5 ~ UARTCharGetNonBlocking(SOC_UART_0_REGS);) }, v" P* r+ N9 E
}$ n" h* D q; [! ^
}
K; `6 t& G. s. C( g; e6 w- K: m. `3 @& w6 B
return;5 m" m2 N* {; ^
}
2 y* f7 b' @5 \/ o4 i$ L N6 {2 ]5 Q T
/ R% J8 E! _& Z5 F# s, X
$ w: e2 a& l: `# m5 {. J |
|