|
OMAPL138双核通信,现在需要DSP核中的UART0接口。. Y: s9 s7 |; D; f* f7 V
我是在DSP初始化这不太明白。 b/ S# u m6 J [' m4 t! r7 [
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
( |( u, K2 d) S/ P7 {; p
* I* r& i# @' u
: ~ ^: I0 L0 i: j5 G& ]首先 PSCInit();//UART0使能2 z9 f2 O m8 I5 s7 m6 G1 v# a- X$ |( P0 i
void PSCInit(void)
9 ? t2 c0 [) P, [1 h9 w: R{
0 l8 z6 P2 t9 `+ _3 d // 对相应外设模块的使能也可以在 BootLoader 中完成6 Q/ ^) p4 a: l8 z2 w1 d6 s/ a+ U
// 使能 UART0 模块; a# h0 W0 \2 z; x, {4 X$ y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);7 I5 a& W) c0 P! u" V5 d
}
5 R+ L+ D3 a. M+ F, M
( C/ Q7 t, y1 {3 [6 e
2 P& E6 Q" k2 k6 m5 U然后是 双核通信的初始化 AppInit();$ m0 W. N+ S3 X: H6 r
void AppInit(void)
; Z$ Q& B) |' h8 ^- C" f" r{0 F5 A: X3 x7 U5 j9 e
/* Structure to initialize IPC (see Ipc.h for definitions) */
8 [- D$ y% O4 B- F/ n \5 K struct IPC_cfg ipcCfg = {# g1 @ ^! k1 G$ d$ a2 e
IPC_DSP0, /* local processor Id */" _9 p. m3 l$ R1 K- ?& B4 Y
IPC_ARM_HOST, /* remote processor Id */
5 E: j2 I1 U- x2 p6 C IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */! j; E$ t8 p& c3 w
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */% t6 a% {/ A' \* q: p X
NUM_MAX_EVENT, /* maximum number of events to be created */
: q) D4 ?. n8 J% B1 _ A3 z &ipcPvMemDsp, /* local side private IPC memory */( c8 h7 m5 a1 f; p9 q7 G
&ipcPvMemArm /* remote side private IPC memory */8 K/ v$ R) ^1 F- |2 y% A8 Y
};
8 |1 l1 b" k6 R1 Q: V1 f IntDSPINTCInit();
* Y3 A7 r8 c, x% T5 U IPC_init(&ipcCfg);6 K. ]( t H1 n/ L- |
IPC_intRegister(C674X_MASK_INT5);% t: u' B+ \4 N v
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
* A8 L' z9 v N- R- J* h# M! w% ]$ o- D0 _+ f2 z0 }
/* Enabling interrupts for DSP C674x CPU */
- h# k) Z b/ {* J- u IntGlobalEnable(); /* Enable C674x global interrupt */4 t+ i- S3 F4 ^7 n* ?
iAssert (Notify_start()); /* This will enable IPC interrupt */" ~1 C+ ?7 |. B$ u1 c
}6 {6 Z5 m S9 E# E5 t
3 G7 A% t/ l9 D
然后是 ! V' y. ~- T9 {' [' g L0 f5 l
// UART 初始化3 ?0 R% o- d# m9 V' @3 W ]/ R
UARTInit();' @& w7 X4 S6 N. B, T
3 m4 s T3 _ O& U3 `6 y: C) E7 f( Z // UART 中断初始化
% G5 c/ ~. u3 P1 N" |% j UARTInterruptInit();, p3 T l9 W; `. O5 ^4 G0 K
/ E- o f. q* G9 h
, \! b0 k, R8 r* F3 ?+ ivoid UARTInit(void)
8 t( J. ~; I7 E7 @; {% }{
, s- D' y' r8 E0 s3 s L // 配置 UART0 参数
, W, R- |+ ]# o2 @5 v // 波特率 115200 数据位 8 停止位 1 无校验位
7 ^, _! B7 ~. N UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
# r' \" n" a( w1 ]6 O0 ? UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: m: ]3 t+ Q0 ^
// 使能 UART00 u% Q: [0 U2 i
UARTEnable(SOC_UART_0_REGS);1 q! F( y1 V# O5 K8 S- a8 z
; K1 a4 S3 _# B# h2 @ T1 d
// 使能接收 / 发送 FIFO, @4 ? n, t0 g8 _1 v! w
// UARTFIFOEnable(SOC_UART_0_REGS);7 ]; ?2 H }' d
2 t6 p+ R8 n4 t0 q- N
UARTFIFODisable(SOC_UART_0_REGS);
; F4 w9 u( V5 p9 w, |% v5 x) ~' R3 r3 A5 Y
// 设置 FIFO 级别 接收FIFO的级别7 h$ b5 Z- B- h: r" q
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
2 B9 q' n* f* w6 P. H1 ]7 g/ c' Q5 z}
$ w: F5 n2 G& y. F e8 C3 X- p/ @) r
4 l! q6 q" Q8 _" D7 O: q, h7 R! G
4 H7 Z4 M# d3 Cvoid UARTInterruptInit(void)
2 G( `6 \2 \ G" k: k{! S6 ^% }3 W% `9 H8 T; L- ~# {
IntRegister(C674X_MASK_INT4, UARTIsr);: S6 c# j' ]0 i8 Y, L0 o& b& ?
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
! C6 S( n$ S6 S- v. _* Q IntEnable(C674X_MASK_INT4);( G: Q4 M" d! D+ a/ ~* `% G, {
# G6 t' Q* T( B2 x p; n% z( I // 使能中断- Y2 [8 q! Z2 W+ G, w( Z
unsigned int intFlags = 0;8 `# `7 T, u: M# ]9 n# G: Y; |0 M
intFlags |= (UART_INT_LINE_STAT | \
7 l6 m# j# V/ n UART_INT_TX_EMPTY | \
' V3 w: C3 A$ k( G* p- I* l# T6 A. h) m UART_INT_RXDATA_CTI);" c3 `% _$ c3 n T& S
UARTIntEnable(SOC_UART_0_REGS, intFlags);7 P5 Y/ e3 K# \
}
) H: p0 i; ^3 f' X( t! j! U( e- e8 p, m. V
% \8 }. R$ ?& ]& w3 p) v4 S, \
void UARTIsr()
' Z* V% D& W, b$ `{: ^: G; D4 h: o& p
static unsigned int length = sizeof(txArray);% `2 _) G; H: R2 \# R; D
static unsigned int count = 0;
% @. {( a8 `% y% c unsigned int int_id = 0;
4 e- @. n& {8 S: [' ` X7 U! B, y
! e8 M p: ^! I* y
( |( C$ _5 x9 f, {* b# `
2 L9 S \, A* Y1 v8 b // 确定中断源7 g# c- L9 Z& I4 B% {
int_id = UARTIntStatus(SOC_UART_0_REGS);* n, X0 N0 d4 [2 Q( Y$ p; d
4 i4 w# j6 U8 w$ G; q7 B // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
- b& R7 m p, Y. A
6 J5 g: V- s# n% z/ J0 D- R* ^6 J5 v1 S, L- f; Y
// 清除 UART2 系统中断
: B$ R6 x: J) {: n L' {4 B IntEventClear(SYS_INT_UART0_INT);7 Z3 \7 l: W2 {% H+ m2 S
9 h) _' N) F# H. K8 K3 S1 q0 x1 q
// 发送中断$ H, ?7 i* U& n% S/ L
if(UART_INTID_TX_EMPTY == int_id), k+ U0 ?) p3 ~' p
{
0 w) s" B. H5 v9 \! y- T" \ if(0 < length)
; M' z6 g& {/ O# s* V {* s2 I" X' q2 e0 K9 K5 V7 R6 n
// 写一个字节到 THR
$ y+ O* n9 @# ^. n UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]); |& l! K3 P6 o. y- X3 g
length--;4 x7 I7 Y5 r1 W3 A( G$ y' [
count++;. C' G, n+ i; l0 Y( B# H
}2 e5 F$ j8 z- M/ e% p- A- O( U& X
if(0 == length)* D( |' \& Y. V9 {' k8 [3 v7 ]
{
+ l+ X, e: e( o$ g# X // 禁用发送中断
; T( [- ]" @7 }) n UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
3 \6 D' F# o. t& o) N }0 R( t! Y3 n+ J3 {" p% N7 a q
}
2 _" K4 N# `; I0 G2 S4 G
7 `1 U) W( m8 B8 v+ v1 B // 接收中断 z" E# \ A1 @7 W: {* F' k4 B. x
if(UART_INTID_RX_DATA == int_id)
# \, \+ M! ?- Q3 f7 H5 G2 O {
- e, D# [+ y) z! d5 s) a7 h& V if(status_a0==0)3 p4 ?) r2 v+ z$ J- B' i! T! l
{2 {' Y6 |$ ~0 D
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( I7 j4 P Y& C$ a; O
if(a[0]=='#')+ A, \& `- z8 ^6 n- v
{- h# E3 K# n5 Z$ N* l) s: \
status_a0=0x01;+ y& y0 d; m3 S0 ~* I
status_a1=0x01;
1 Q3 |+ U. e2 b" \. }! \ }
, ]6 `2 q" Q' L: W' @ }& j* i& _/ n C- c6 ~
if(status_a1==0x01)
3 H- J6 H9 S8 h3 Z {" @, R6 W# {5 y- O. |
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ [7 s+ A! F+ p! ]) u if(a[1]=='R')
& t! X0 B0 `% D! x9 a1 j j# W {
6 w# K9 `* l, k x. S4 B0 c, U status_a1=0;' Q2 K- I% \# y
status_a2=0x01;
9 j/ p& m0 |; M5 R }
: I8 }0 Q* j! r. `3 R, m+ {5 i2 H }
$ e. G1 T' N2 Z% ` if(status_a2==0x01)" r1 K: x1 {! _" U
{0 [) X7 ^! ?+ p
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 X4 R: a1 @0 f. w& i' J, `- J7 J" ~
if(a[2]=='A')/ J$ M& a4 L; R9 R
{
& M" m" j9 W& y. i6 @! Z$ b! v status_a2=0;! w" u) H* u, S
status_a3=0x01;
2 J6 b( I% g. m- }; w, x }" _% W% F) w6 t7 {7 e
}: I7 ^7 @/ T0 X
if(status_a3==0x01)
7 S" T' ~+ I. C D {# y1 V6 l4 t o& y; _# v
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; j% J5 t! I: h* Q4 {: ?6 }" y
if(a[3]=='N')
" Y/ `# R2 L1 D7 R3 H2 _ {, w- m( [- |4 s) ^- R9 A* M. `
status_a3=0;
6 T& J9 g. v8 r9 a5 c$ q status_a4=0x01;
" @" P& w& D8 U5 v/ q$ x }6 m8 s1 i& z" h. I Z4 T. n9 Q
}/ r0 ~- t+ `. F: b
if(status_a4==0x01). b H2 `9 _0 ]0 ^; x# z' U0 n, g$ C9 {0 l
{) @% c, n/ Q8 C5 L
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ R z6 ^6 h% V2 Y$ M if(a[4]=='G')
, T; {* l/ c* E7 W8 U/ @ {
4 h% m+ |7 z8 O( `2 O { status_a4=0;
5 v6 ]5 w* U. e9 f6 K status_a5=0x01;
# u( ?6 M' W& S; q( |" Y n, v }7 x; I. z9 {; S+ i8 w
}
; ]- m( c# o; e! J5 B1 a k if(status_a5==0x01)1 s9 G5 a6 I$ P( |+ L
{
0 b2 r2 o T6 X a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; M9 T1 s6 N3 t' c3 m if(a[5]=='E') T D0 [( z3 y, d
{3 D9 r0 f+ ^* S+ A! o x
status_a5=0;
7 L Q- U0 c7 J; o6 @* f status_OK=0x01;; b: @0 m# L; |4 o
}0 U9 H5 x1 L2 u; J5 D# p- W
}' v# k' \6 ]9 _2 B2 s2 B
if(status_OK==0x01)
; d' O( q: w3 F8 X8 G {: G, g: {0 [3 [" T0 `7 P
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! j+ O2 S" F1 {
lengthrx++;8 _6 P g$ j2 k9 r4 U+ s8 p1 e+ X
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值); m/ G9 [8 d$ q( J3 S1 w3 j! i
{
! e d* P* }; D* [- M# I$ `* L: z( i RecState=0x01;
8 ^- b) [2 _' K. N% y0 @" B }
W# T" r3 q3 F8 s, o }
( }$ i- j* O& n' p% y& t; Z1 B; T; c( `0 B+ j" m h" Q
}) {& ^# J" G2 E2 z0 g; m4 ^6 e
. w: a% `6 o8 `# L // 接收错误
9 Z8 K1 M- q2 R( f if(UART_INTID_RX_LINE_STAT == int_id)9 d5 [0 l( B! T4 ]& P9 H- {1 [
{
/ h5 O: h; t' W6 C* X while(UARTRxErrorGet(SOC_UART_0_REGS))
" e* F1 ?: S! u: J9 w7 P {
3 } a) e& R& i9 F // 从 RBR 读一个字节
. t2 a) T' j6 c" H4 q, f UARTCharGetNonBlocking(SOC_UART_0_REGS);: x }2 n! n. u" f8 ^" v L0 ]
}) b+ T/ O6 D0 }! v7 V& Y
}
3 M/ H& G2 q# h
- J' H: v9 B2 p* V& l return; O, |1 X! {+ R
}& o" ?: K6 X* I! m# k9 {, L* _
5 w. m4 z! M4 `% R+ `
5 f# _/ e* c/ e
$ ?4 N+ R' N! Z) T% D |
|