|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。1 H) ^/ B0 l& P: ]* _
我是在DSP初始化这不太明白。
. h' Y- w4 J! @; u+ \" I! X初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。9 Y6 q( ?+ r, j
; b, J' g1 U( b
9 M( M9 z- q/ i$ R首先 PSCInit();//UART0使能! N4 z' X* x1 o! C- s
void PSCInit(void)( z0 Z" ^: q9 m: d& y& Q
{
) m) R3 b, S9 S& k8 G3 k // 对相应外设模块的使能也可以在 BootLoader 中完成/ `6 F8 {. ?3 E+ e9 Q
// 使能 UART0 模块
( e. [$ M# n- e PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ l0 x# u) w$ t}
" J+ ?3 h9 S. F& M7 w
$ Q- B9 o* z2 b7 {0 ^7 W; ]
# o- j8 V* V) S% f. k* z然后是 双核通信的初始化 AppInit();
$ q4 v3 A! d: \1 z! G$ E# `void AppInit(void)
3 k2 I$ z" b/ \7 T{
7 i) D: v( R1 h& {4 B /* Structure to initialize IPC (see Ipc.h for definitions) */1 ?% Q7 k2 { f0 U
struct IPC_cfg ipcCfg = {
" \1 e& N2 o3 k" T: @ IPC_DSP0, /* local processor Id */
/ P& }; E9 \* p IPC_ARM_HOST, /* remote processor Id */0 l9 b& |: g. g& p$ k& y8 f
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */7 x: k4 T9 m+ G ~. N: F
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
$ ?2 c, a6 i) l) l2 o$ M NUM_MAX_EVENT, /* maximum number of events to be created */$ l7 Y, ^4 `, [/ J4 U
&ipcPvMemDsp, /* local side private IPC memory */& b' h8 u5 l) `% Q# f' _
&ipcPvMemArm /* remote side private IPC memory *// x$ |9 l" k( Q. X: }
};
8 ]' S4 N# ?; ]: j9 [2 ] ? IntDSPINTCInit();
) e$ G! l K1 x; X! c" F IPC_init(&ipcCfg);
" S: l0 _# i( c( `& e5 m IPC_intRegister(C674X_MASK_INT5);# J9 O1 }' @1 r% g% i
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
d. _# D7 L5 g: {. ?: L" a& {/ j/ g7 ^) c" Z# G+ J* f, |$ Q
/* Enabling interrupts for DSP C674x CPU */9 h7 R4 K4 Z. l5 q! q7 @
IntGlobalEnable(); /* Enable C674x global interrupt */7 |6 w3 R. b, Y8 W- f; k
iAssert (Notify_start()); /* This will enable IPC interrupt */; `* r: | Y9 X& s# {/ O
}. o+ C& H8 N. Y$ g0 T9 U
9 l$ N5 [4 {7 L `
然后是
# O3 w- S4 Y2 ^; f3 d4 k // UART 初始化
8 ~* b* S/ P, \- Y4 G UARTInit();$ V" u# c" p' H& l3 ^% ]
, b" n5 _' D7 N; i& Q. k& }# r) o
// UART 中断初始化
4 G8 {4 ~* I! F8 ]2 b$ { UARTInterruptInit();
6 n. B. W) O* o ~5 f
# r4 B8 I# G" V6 O) k, B0 v' K; e8 X1 I" E' p. L
void UARTInit(void)
! v. n' @. F4 l{
, _( D' C/ z3 o: v$ C/ } // 配置 UART0 参数
S c( t3 M- K // 波特率 115200 数据位 8 停止位 1 无校验位
+ v9 f$ H! R8 L2 Z5 G4 N7 a$ r3 \ UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
4 M; p. Y) g. ?, d UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 W3 A( V% L9 z0 h! V
// 使能 UART0
0 ?: j1 F7 b! X6 N: K UARTEnable(SOC_UART_0_REGS);% A" e: j! k$ Q/ L- e0 N' H
# [0 ]* Q1 ~5 K9 H // 使能接收 / 发送 FIFO
2 O! q6 T( U3 Y+ y3 |// UARTFIFOEnable(SOC_UART_0_REGS);
$ ?7 | R. d: N$ G7 }% D! \/ m+ {+ q9 ~5 P
UARTFIFODisable(SOC_UART_0_REGS);
o# q. [( D, Q. J, u8 r( o( b- X. D- Q: p3 @( V
// 设置 FIFO 级别 接收FIFO的级别
1 Y: {, [1 O( d9 w9 ^& m// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. K6 n( }# F- g
}
) t8 p: o. J! Z; @. c9 d8 l* T7 T% ]
% a1 I7 N7 I1 @) S* J
void UARTInterruptInit(void)! _( R& z4 ^+ [/ j g( J' f8 j0 l
{
0 \. x$ f4 ^* f6 I IntRegister(C674X_MASK_INT4, UARTIsr);3 q5 `. \3 A1 ? j/ q
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
3 q6 R" z+ f6 z; M `3 \8 v% Q IntEnable(C674X_MASK_INT4);0 V8 p$ c4 a% w9 z, ?; H
& r2 r/ k$ c9 `6 ?0 K9 `
// 使能中断/ \' u5 ` G/ S9 Q9 @4 N' Z
unsigned int intFlags = 0;7 Q; o1 k- H, A' c
intFlags |= (UART_INT_LINE_STAT | \
9 K0 P4 I' n) J( T9 S1 c UART_INT_TX_EMPTY | \4 i% }- p1 K2 N5 ~. K
UART_INT_RXDATA_CTI);
+ f' d4 n9 m0 b/ p UARTIntEnable(SOC_UART_0_REGS, intFlags);
+ \5 j; T- }/ P& d: l}! `+ Z1 q- _3 R% u: ?
e/ o1 @4 s$ P9 v* [# X3 _
* C- X0 m# Q( F0 W* v
void UARTIsr()
, N: m- E) z& o{; O) X! K6 m! R
static unsigned int length = sizeof(txArray);
' f. E) ]5 _ [$ F static unsigned int count = 0;
9 G6 a& M$ O4 S: n- V% I unsigned int int_id = 0;8 j! k$ A9 K ]! }, F
4 v0 b& ~' B* d2 k" _
, X7 N/ k, W D
, Z$ j( q9 r# z! K // 确定中断源
1 K; }2 O' B8 d" h5 b! O int_id = UARTIntStatus(SOC_UART_0_REGS);
" h0 ^7 Y0 J) c I: W4 x/ u6 }
( r( L5 q: r; m // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。# K# v& B2 X1 O+ f! H
+ Q) u4 a2 _* K( e8 z$ ]% I# x3 N' e8 P% @9 |
// 清除 UART2 系统中断
# Y# J3 F: L! R" G IntEventClear(SYS_INT_UART0_INT);
& K$ d. q5 u7 X8 g9 [! _1 x! v3 d! K" m
// 发送中断
9 ], z$ B |6 e6 b if(UART_INTID_TX_EMPTY == int_id)
0 p6 `( B+ t5 Y0 u {
# z4 W) l3 z, C( Y' q4 O) c if(0 < length)4 u; I2 j: C+ y1 l- ]8 T. |
{0 X7 P; d9 r2 h, X+ p
// 写一个字节到 THR
/ m% x- V; p0 _6 E5 g/ p UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
% `7 @2 H3 y' K$ k length--;
j3 Q" F8 a. i3 k9 v8 {! a, r count++;
- C5 O0 Y6 j2 K: |6 z8 T }5 q5 Y1 F' J5 y5 \. d9 a9 Q
if(0 == length)" r, x% L0 X: Y
{
, C p# N$ ~5 n8 t // 禁用发送中断
' C" y% l2 T. \3 r) W2 e UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);% w( c Y+ Q* t1 Z: f. ^0 C
}
2 ?( t }. `4 D2 @4 f( V }! |9 @4 t/ D3 r- @9 i% B7 D( w& P% V
+ a. T4 k9 ^! L7 p9 g) W // 接收中断9 ?8 X9 R* H: y% L$ p( C# r
if(UART_INTID_RX_DATA == int_id)
d( }4 [" m: ^/ b9 s" e. a {% g7 |( ~: ~; s( q- z( I( y: t9 z' ?
if(status_a0==0)
+ _; y: n) ? ]5 @4 s- t {+ ]4 H0 V. {- m. o$ G1 q
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, @' G W+ s8 ~/ ]7 T
if(a[0]=='#')5 ~) H9 X. i0 q' `/ i/ o
{
Q B+ J) r2 F5 E4 @( L0 [ status_a0=0x01;
/ Z4 x' x% [/ w M# O5 R$ H status_a1=0x01;6 h, t8 j& q0 ?/ v6 p: r4 \( t
}. U X6 x! Q9 w, W; f3 p
}
2 x' X2 u/ ~- W; d a# [9 D if(status_a1==0x01)3 ~+ h. Y, j6 Y
{
9 d6 G6 L; d% L& G" `# {1 Q0 N3 B a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, S5 ^$ b4 A y2 z) Z+ l: o; R) I
if(a[1]=='R')& g- T- x9 |; z
{
* A3 f; @$ A% W$ V status_a1=0;
8 z$ J# m9 D, x& V status_a2=0x01;) Y4 ?* q# S* k, [& C1 ?0 Z( I
}* z; ^3 `/ _% r" E B
}
1 T4 |9 |& \0 y/ {/ b* c. C% P if(status_a2==0x01)
; R' @7 v5 o3 w- X7 f; M5 J5 t {
. T/ g6 \# c$ M- U/ Y% s; ?7 e1 V a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; r Z F. y1 V# N1 n% ] if(a[2]=='A')
6 Z! b+ {1 t H6 b, Q7 F) _ {. ]2 d, P" k d9 P1 Z o
status_a2=0;* E& m! [" a* y/ N* l# l
status_a3=0x01;! Z! R, S$ S( I% N
}" z: B# Z o" `8 x" i4 u' b3 u
}
# t0 T+ C+ C3 Z9 ` if(status_a3==0x01)
1 ^( F2 J4 k# g {
& b G! n/ v( }4 U" f+ m8 T8 x+ Q a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 ?1 }. Q. H' h- t* g6 I if(a[3]=='N')8 A0 `1 H+ n. H( [8 [9 @
{
0 y3 b' M3 f5 {" l7 } status_a3=0; _9 }) c4 R" h9 y1 h
status_a4=0x01;* q+ A3 N' L M; ], S; P& ~
}
- b: d g" N- {- F$ t( N- V" y }1 e, z! j% T! N* m7 q
if(status_a4==0x01)
8 w0 I" g* u9 r7 @. K/ }3 i+ j- l {; Z" q3 W/ ~! @' E' x
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% Z0 ^1 V4 e( @" s, [8 C
if(a[4]=='G')1 v/ i) s2 d# o. o9 ?$ b. k) l& p
{* n& M v, }6 ]' N% p0 E3 v. g
status_a4=0;
4 B: @4 q: s% o: ]1 |& Q% ~: g status_a5=0x01;# {# E Z9 _3 j, {, C7 q/ @3 @- B
}
) E' n" M, C* Q! N: s& v }
5 u: w h; Y: P& K% z7 A" e- n if(status_a5==0x01)
8 K8 L# Y# J1 A5 ? {6 {: H+ O( w: S. Y2 H4 x
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 j- F' h3 c9 n5 p" P1 a- c if(a[5]=='E')
9 w. m! `2 p/ B) r3 y, m2 {- T2 ] { ]9 F* m6 p" }3 W
status_a5=0;
) H E1 m _$ r$ [+ ] status_OK=0x01;
: e7 E" @. c0 `/ u/ B# l. r- y }5 v* _% c |* B2 e
}
/ |6 {; }/ e+ n3 }/ K if(status_OK==0x01)& \! q2 o1 O* U- `0 U1 [: B
{% h5 l4 }1 p& }" c, ?2 K+ Y
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. U. D1 _3 a# z. M/ P lengthrx++;; R4 C. O2 Q! A0 `8 x A) }
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)" p4 ~( B: d8 u- m# P/ o2 R; C7 n
{
. L5 c! `. ?0 |/ Z$ X RecState=0x01; Q Y" w6 e/ @# P. ?7 b
}" y0 T. x1 q. u2 b! R" a' h
}
; v8 z4 J% p- u" @5 J8 ~
7 O& G* n; L5 R/ D4 b& p- u# m$ B }9 ~: f. u$ v, M% _% z' W* b; a( N/ Q6 K
! T) k |' A2 r0 L3 P1 Q3 f // 接收错误; s- w/ m+ x, a5 }
if(UART_INTID_RX_LINE_STAT == int_id)
; w) B7 \ [/ w7 o {
/ O3 r* ]" c: P9 _6 W3 ]8 @; C while(UARTRxErrorGet(SOC_UART_0_REGS)) q* s$ g3 i" f4 K7 E) m
{
8 m7 `/ _5 e7 `+ s1 x // 从 RBR 读一个字节
4 t' h8 A0 d. C" a4 U& q/ `; y UARTCharGetNonBlocking(SOC_UART_0_REGS);
. o/ t) ?- r: g* |+ B* |- P& T0 h }1 W9 I2 b& B R9 c$ T: S
}0 T; p( K" j0 N* I3 F+ J
7 L0 z$ m+ [- C/ J( [
return;
( i) G: A) c9 \* L5 p: r' [% @* g}$ i' v3 r8 y, J* R+ {
9 d. b/ S9 ]" K
% ]. g' q, H5 ]* s' I" E, D0 S
2 a3 b( l5 J" K5 z7 e- O
|
|