|
OMAPL138双核通信,现在需要DSP核中的UART0接口。6 z" ^: i( F/ A
我是在DSP初始化这不太明白。
4 P& C3 g) _ n* }1 R% [初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。; |5 t7 q8 l' A3 J/ _) k
; ~ e4 i" y1 N( {$ \3 P# G. }* x3 _$ H& X5 l1 \
首先 PSCInit();//UART0使能* O l3 w; k* E' I! i1 p
void PSCInit(void)+ |& e8 i; t" d$ i) w' t* v! c
{. M# J6 d( T6 L0 G' K' Q" a! y
// 对相应外设模块的使能也可以在 BootLoader 中完成% U! {/ O3 A0 ^' |' w0 c/ _8 Q
// 使能 UART0 模块; a3 c1 ]7 w6 S9 Z9 T) k! g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
8 @5 {# c \% V6 P( t. z}$ ^- I. z1 U( r( {; M& M
! p p: s' w0 m) I& L! n8 n5 Z- z
* x8 j3 o" @% P0 q( |然后是 双核通信的初始化 AppInit();
2 V7 T$ y2 J0 B: ?void AppInit(void)- H, o8 H: e8 y! n$ w2 Z
{
: N0 V# J; f1 K5 l /* Structure to initialize IPC (see Ipc.h for definitions) */4 e! S+ l& G2 B# h2 f: n- f, l
struct IPC_cfg ipcCfg = {
9 U5 r/ O2 c! B% o: X* y IPC_DSP0, /* local processor Id */
8 b# q) \8 j8 {* K4 e, A8 @! ~ IPC_ARM_HOST, /* remote processor Id */
9 g) L. L' O# O, V6 s6 E2 x1 B IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */& R, g0 a2 f9 S+ e# c
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */1 `, [$ j. O) G1 @+ ~' {" {+ ?8 W! r8 ?
NUM_MAX_EVENT, /* maximum number of events to be created */
f7 Q7 v) f3 r$ |' [ &ipcPvMemDsp, /* local side private IPC memory */9 S: y% l9 v. c! ~; c
&ipcPvMemArm /* remote side private IPC memory */
* |1 o2 N- k3 |; b };
( Y& [4 U0 ^; I4 ? IntDSPINTCInit();
r: @0 Z0 P3 D. T/ T1 \; l, C IPC_init(&ipcCfg);& C4 g+ a( a' Z$ J! ^& X8 [! F
IPC_intRegister(C674X_MASK_INT5);/ J& ]2 }5 j. T+ L; u3 g3 [
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
; s7 i$ ?% b4 ^$ i5 l! a4 j: S w5 l% O: t# M+ M9 c5 |9 l
/* Enabling interrupts for DSP C674x CPU */
8 r; f( t, e2 s# B9 T$ _& U IntGlobalEnable(); /* Enable C674x global interrupt */
% B* Y/ I& v% E/ S0 B2 q% { iAssert (Notify_start()); /* This will enable IPC interrupt */
8 H2 C7 m3 V1 Q" v P1 Z$ ?}
$ `2 r1 c' V/ i2 H C8 ?( O# {+ D" X% \! C- q
然后是 ) m b6 J G) ~; \( X6 f" r
// UART 初始化
R; |- E4 z7 ^- Q6 ` UARTInit(); v6 }4 H; G `4 y- j5 A. f
9 _5 c6 m8 l* A, W1 j4 B" A // UART 中断初始化6 `) v- U" s$ v4 j& _
UARTInterruptInit();
" Z# G' n0 J6 H9 y
/ N. _+ I# b# C: Y% q- m2 `+ Q9 [
void UARTInit(void)4 [; q9 ~* {) Q1 v+ D# R+ u
{
7 [3 R+ D0 x# o8 ]5 f9 R6 g // 配置 UART0 参数, p. s) u& o- {8 f" q
// 波特率 115200 数据位 8 停止位 1 无校验位
8 c0 t- I2 v* Q. z7 ~ S UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
! B) V8 |5 l! E- w @; k UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: z' ?9 |; y0 H& S N
// 使能 UART0
+ S1 v K& z7 W* t UARTEnable(SOC_UART_0_REGS);
7 m% {- z$ L- O6 |2 @' U! x) q7 b; {4 o, c! D+ {: y) {, P
// 使能接收 / 发送 FIFO
' w4 k/ i" S' v// UARTFIFOEnable(SOC_UART_0_REGS); b* |# \) |# u& G" t# M; P
|# _% F# X- W0 D
UARTFIFODisable(SOC_UART_0_REGS);; Y5 ?6 `% `, e2 }
( ` v8 v$ a. z: | // 设置 FIFO 级别 接收FIFO的级别
2 ?5 w# V0 H' ]// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
+ @, n' D: a' S7 `}
. G! v& H+ j$ A/ I9 {) y
7 h: V, o# w9 c7 X" \& P; Z
" j: |2 D% o. Yvoid UARTInterruptInit(void)- V4 C0 t# l; m
{# v% e9 m" M3 Y0 H1 C( j; T1 w
IntRegister(C674X_MASK_INT4, UARTIsr);
9 s8 N4 j6 c. J( T IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);0 i$ S' l# ?6 L l3 X7 {
IntEnable(C674X_MASK_INT4);% g5 { |4 W2 i E6 c# S
6 @/ p; G/ z) X1 R! N4 g/ ~6 e/ L* y
// 使能中断
$ e$ s8 H! A6 J" K! c. | unsigned int intFlags = 0;
* Q9 J, w$ A( c9 V intFlags |= (UART_INT_LINE_STAT | \
. H. g- {( ~$ b" h$ b6 L, ]/ O0 x UART_INT_TX_EMPTY | \* x; h5 Z# ~) f4 K2 u, g
UART_INT_RXDATA_CTI);
- U+ u! b1 s8 a: P5 a1 t s) i. c UARTIntEnable(SOC_UART_0_REGS, intFlags);
4 F$ P+ u/ b5 N. ~7 }4 G& H S}
7 H U; w& S) Q3 }& i
6 R* Z2 E4 @4 `0 I0 e( O3 k! P: r$ ^, f! V$ s* @
void UARTIsr()
$ z* G `: ~1 Q7 B/ P{
3 \# E2 u0 K: t) Z" x( H static unsigned int length = sizeof(txArray);
+ n6 I4 v# p& x5 B2 \ static unsigned int count = 0;
E) D' x! `- z {5 Z! {+ l unsigned int int_id = 0;7 G" q6 r' Z: z4 {1 Q8 H6 r
I1 D y: C+ O3 T4 J# v4 B2 \) G
' H# z, X$ j! p2 D& B( ^. H4 U
// 确定中断源
+ A3 @: L2 x) o) y! g& X int_id = UARTIntStatus(SOC_UART_0_REGS);: C# U3 L H, J( U* G0 c
D+ q* X2 i& W- D
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
& \ A$ x/ }7 y9 h, x) U8 S4 G8 O; b) a. w4 r5 B" k, v4 y+ M
8 B# J( S- }5 E P
// 清除 UART2 系统中断
9 e. {0 l( ]0 }, Q& M IntEventClear(SYS_INT_UART0_INT);
" S" D; _$ O4 J3 X/ j
2 S! Y! U, H0 f0 n( N // 发送中断% X% K$ W U* `6 k' O/ c9 k
if(UART_INTID_TX_EMPTY == int_id)2 x8 }+ U U1 ~9 L( G
{
+ B( u A7 G1 e* c4 s" d2 C if(0 < length)
" q! A! S+ o4 d9 [" i7 b& L, H {2 b; T6 e% ~2 a9 h _
// 写一个字节到 THR1 c4 t" X0 \3 X* s5 r4 H
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
3 N" C8 Q' B& Q6 ^( R7 P length--;
& _$ I! e0 z# ^$ b% q: b6 Z count++;3 |1 Q% V: g6 ^, V" `8 ]! _" ~
}) e! o5 ` e7 Y n- q0 H) V0 N
if(0 == length)
/ J3 r# O$ T& W0 y {
9 y8 P9 N) q% [: o" H1 {/ P // 禁用发送中断
; X: K* t+ Q9 C UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
/ _4 E+ _# Y) P3 \ }8 N7 s. u' ^) u; `2 q8 O; L. o
}4 L5 `1 J9 s5 g( ]6 M# I. `
4 j ], G) l, @! A7 M' I& u2 ` // 接收中断
7 o6 t1 D; @9 t7 u% d) T if(UART_INTID_RX_DATA == int_id)
. ^5 e1 ?( ?; d) ^; t" w' { {2 @0 O. f' O# V& A
if(status_a0==0)
. w( l2 W3 _4 p) Z" L2 w" W3 W [ {, p( o( E* p8 P2 I) ]
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 R- [1 C( [5 }% F0 } if(a[0]=='#')/ P* {9 m$ N! ^- m
{
7 b, z4 _* j$ g# X$ P status_a0=0x01;
/ Y. {+ k+ _; d8 c1 j5 k3 ?; C status_a1=0x01;1 B& w5 E+ E) s' V
}
8 C/ A" Z$ |3 _, P* \) _( W% |9 w }! V( W$ N) n5 G, M: |5 N
if(status_a1==0x01)8 F/ K" r6 w+ z' _! _
{
6 D2 ^: [- w- f1 b5 q/ M g a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, t% w F0 l/ X( G) d- _: q
if(a[1]=='R')3 D2 e3 ]; h5 N' N# h. z
{' p" e. y/ l# \8 ?1 y. t- P
status_a1=0;
+ \! T9 ~) _8 m) p5 w% _4 K t status_a2=0x01;* V( R2 A/ w2 |0 T, {6 z# y
}
/ j' b9 K& J% c: U7 F; S }
) X5 {7 F3 Q6 H6 |( M% O3 U2 F if(status_a2==0x01)
# _0 _* z. C6 F" v& T, i. D {
8 G1 h- E" K0 t& I- _8 g4 R a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, L8 Q7 h6 `8 O/ V/ J3 I* G9 o if(a[2]=='A')8 ^2 [; {6 ^8 _: }6 W
{3 j( e( n" f6 L( _
status_a2=0;
- `# o+ v4 M( Y( r status_a3=0x01;
2 p* |: K2 u/ m7 C }
# ?, m* K! n( G0 L }
6 g4 g4 Z5 F2 _ if(status_a3==0x01)2 p9 [. q) I/ F. `) l
{
7 ^6 v2 g: [% k0 J( q a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 o: G- g# S: C5 [ if(a[3]=='N')% V! w/ _, \1 H
{
K b4 b* k2 A7 Z+ H8 Z status_a3=0;
. ]. t) |5 X& }- t status_a4=0x01;+ U$ ] F9 U+ U" ~1 b4 j3 ?. `; E
}
2 N+ Y# u J% u* | }
! L0 L [8 [+ v7 g- E if(status_a4==0x01)
7 \' y5 M3 t& ^+ n6 g9 v {
, ? V* L4 r( T3 r$ v3 R4 |* c; A# s a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) i: ]0 S5 p* n5 i* B
if(a[4]=='G')
# ~" i8 r; C9 ]/ @- j+ \9 S$ J; M( i {
9 m8 e, v- P( p9 k1 s' R status_a4=0;
9 y2 c% M5 U8 N status_a5=0x01;. q3 G2 }5 I! j9 p: f
}
1 c; I" h' m, ^4 i! ] }. e6 }+ f! ~# ^+ n' k
if(status_a5==0x01) m- T" t0 R: R9 K
{8 e, ~0 F( c0 K3 C9 P
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* u% w! L3 n/ P8 A& y if(a[5]=='E')2 o; n& g6 ]9 H, Z/ [. G: i
{
3 ~& h+ S. y, U" P status_a5=0;3 `% \5 U. ^6 D" _. m2 V, p
status_OK=0x01;
; K7 B6 g" V6 S* f. P }
; o; ?$ f( x! \ }
6 _8 s6 @8 y/ C/ @9 w, [; ]& w if(status_OK==0x01)
3 I9 `% N3 |, y7 ~' l- R% d7 _ {+ X4 U$ u0 U: s6 X6 ~- L
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 X' n) @, m) W7 j3 `
lengthrx++;
* s# `! V4 \. R1 m, c if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
6 v- ]9 A! O+ I' R) T+ z5 C {
7 x0 W+ p: b1 r5 s5 z { RecState=0x01;& C0 _, }! p! P& Z$ }$ O) j3 _
}+ j: _2 M' H- K1 Y; S! ?
}! S4 i, a: g; s1 E4 n
# j; F6 w8 z; g$ M! N/ n; O/ F. b
}
6 `/ @1 L; M8 p5 ^$ t# X% x k8 I) `7 M- l9 y) p
// 接收错误
4 J6 T. q. c, J4 L/ w+ _; y+ N if(UART_INTID_RX_LINE_STAT == int_id)# I6 `% U4 r. }, f1 N
{
$ k+ `! _# h, F2 d while(UARTRxErrorGet(SOC_UART_0_REGS))
% b% D) q M: `: W& [. Y- ~+ _ {
2 K. t5 O2 @4 i // 从 RBR 读一个字节/ D! n; A& v/ B I9 M
UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ a8 v1 S: h1 h' K: a8 C }3 D; v+ Q I! Z
}
- R) F. V Z0 S! O4 p- ^( m
' i9 K2 W1 W( k" O; u+ ?. _. n' H return;+ L! P: V1 C* b2 H. c6 I
}
1 E' k U: U) M: M9 w7 h3 {
5 E2 L, a' c; W/ n) D- M& Q9 H- o/ k- o
' Q( _* ^( i0 s5 i$ f3 s
|
|