|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。6 |6 n1 \& N0 Q1 j6 B+ I
我是在DSP初始化这不太明白。
1 n$ w- d: V: l1 W5 R7 u初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。; I1 { E, Q0 m0 r* F8 [2 K
, ^' c9 L1 i' e1 x) l! D/ w- }! T& B7 z) S1 U& Q$ i
首先 PSCInit();//UART0使能
d4 V# G% u+ X" x! Z5 @6 j% A: _2 Vvoid PSCInit(void)
A3 U1 N/ w$ v: |; v* {% `{
. E: r6 ^3 H0 w* E // 对相应外设模块的使能也可以在 BootLoader 中完成1 M' G! I. e3 S5 j% ^
// 使能 UART0 模块
) D6 c2 m# S8 S0 I) k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
8 g! X8 G* G" x' H! Q- _}6 Z& U/ g( k0 D4 S/ T3 W
J7 R( A: l3 ~7 W! J6 f
! V; j M( N3 ^; P }4 ]然后是 双核通信的初始化 AppInit();0 e$ `" A3 [( j" d& z" U$ ~0 x
void AppInit(void): U" u+ Y; I; G8 ?+ c8 ?6 }
{
, }8 W8 |8 S& E- n; F1 p# f! H8 F /* Structure to initialize IPC (see Ipc.h for definitions) */7 z1 Z4 `7 X$ R
struct IPC_cfg ipcCfg = { C3 g& r2 l. u0 ]
IPC_DSP0, /* local processor Id */
/ T w) Q( D5 V- Q+ G: u IPC_ARM_HOST, /* remote processor Id */
8 _. L0 D/ ]: O+ t8 o IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
3 o% c" C# h6 Z5 I IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */0 ~3 ]) g. C7 r
NUM_MAX_EVENT, /* maximum number of events to be created *// u" H9 f5 F; o; \+ d2 {
&ipcPvMemDsp, /* local side private IPC memory */! {* \/ l2 H" \% ?
&ipcPvMemArm /* remote side private IPC memory */
O; w/ F4 U' u3 k, z: t };
3 w# o3 w9 O$ f7 D* S1 c IntDSPINTCInit();
' B- F: d* b( h/ B, K, A t IPC_init(&ipcCfg);
3 t$ x/ w$ X5 \$ A7 u$ t IPC_intRegister(C674X_MASK_INT5);" Z9 J& T9 R, x' P4 k; {& G
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
8 ? L2 u# ~. W
' j3 U2 N* x! p; d+ x B; K /* Enabling interrupts for DSP C674x CPU */
6 B/ P. V% d$ r6 H# C4 N7 K, s IntGlobalEnable(); /* Enable C674x global interrupt */: X5 q$ |5 E9 I9 ]8 \: U+ G6 H
iAssert (Notify_start()); /* This will enable IPC interrupt */
% v+ H( B; A0 ]6 P4 f9 J* O9 \}% x# R+ k4 N0 [, g6 k
2 k7 X) P4 Q2 S- L) {' e然后是
( T' G) `5 z2 ~' A/ ^ // UART 初始化/ b: Y E) l0 y5 O* R, A/ Q. J* U) M
UARTInit();
( j2 q* A* O; D
Q4 n( l; Y: k // UART 中断初始化
" C/ }# a1 x5 w4 c UARTInterruptInit();
! ?" ~& ]' \! t. y* p3 R) q4 B# S: e
9 f$ {8 t/ D4 w& [2 Tvoid UARTInit(void)
; ~* Z$ V- y0 {. Z9 J7 b* K{
z) Q6 {: ~8 e! {1 e4 k* W* d# Z k // 配置 UART0 参数- H v5 S2 v5 K
// 波特率 115200 数据位 8 停止位 1 无校验位
5 x$ @/ d# g0 p _5 `7 _% N UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,7 F5 \! t, A3 A7 `$ m
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" Z# S4 L+ [; o
// 使能 UART0& ]6 s; x: O2 w& f
UARTEnable(SOC_UART_0_REGS);
0 W8 H2 y# \9 c5 f z- L7 C* C# k
: a+ e! g& M$ {7 Y. W) T // 使能接收 / 发送 FIFO- ?$ C* d5 j& _0 O" Q9 H" A e K
// UARTFIFOEnable(SOC_UART_0_REGS);
! O# M- Z# o3 f; m- s! N
( }# ^' b s) p) C/ M. g UARTFIFODisable(SOC_UART_0_REGS);& ~! K9 A3 V/ Y D+ \
7 b T& b' n! _& S3 p0 [
// 设置 FIFO 级别 接收FIFO的级别$ Y- h" K. W: I) |- X+ A) P3 L
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. q! Q" O7 v; @0 }3 D, z
}$ G, r. @, v6 u0 b
$ b* J5 r% A+ v/ ?3 b; V, f+ l7 `
0 j" t3 C6 U! @! O6 ]' \
void UARTInterruptInit(void)0 _1 _8 Y/ Y$ W+ C8 M# `
{9 u* j" _. I- ~9 g i' J: m$ r
IntRegister(C674X_MASK_INT4, UARTIsr);
* R! x6 B8 F2 M- ? IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
/ v+ e, c; V# o IntEnable(C674X_MASK_INT4);' m0 V v: B! |, d
& Q( `" p2 m$ w4 ]7 h // 使能中断
; m3 }9 r) A) |7 {/ [ unsigned int intFlags = 0;
4 i) ?, ^5 ?! e2 z* U! @4 K# D# n intFlags |= (UART_INT_LINE_STAT | \3 K$ C, ?- |) Z/ s+ v% }/ s/ T' ~
UART_INT_TX_EMPTY | \
' ?/ t% k5 b o& X UART_INT_RXDATA_CTI);
$ ?; [1 c" J7 p, J UARTIntEnable(SOC_UART_0_REGS, intFlags);" M: V% M- r } t3 d2 R
}
2 p( I; B* V: ^* G" u* v# W% i
# g8 o6 `! A& U4 d" e5 d0 l* T( [+ |0 z
: A+ H0 _' J2 C7 Z% ]' @void UARTIsr()5 W1 O. f/ ~; G
{
. n6 s+ \/ i" q9 }4 i4 { static unsigned int length = sizeof(txArray);, l7 I, p* W8 \1 f
static unsigned int count = 0;
7 P/ j$ L2 k4 D2 W- }: S unsigned int int_id = 0; N. H" w8 K5 }4 F+ |# _
& R; O* Y [ e2 ~$ ~% _
$ W6 {/ A- H% N5 T
6 F* r/ `" j$ B4 f, [' N
// 确定中断源
" U4 p: |& O1 P4 z/ D int_id = UARTIntStatus(SOC_UART_0_REGS);4 F0 f# M" [2 K5 I
' Z. M1 ?& e- M // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。5 X1 u! H: i- Z: u! N( w8 r6 F
- G/ ~5 V$ j. R; q
# ~- t( m& |5 J: x
// 清除 UART2 系统中断5 \% u8 B7 {' ]/ ^6 d: X6 @3 ^- Q
IntEventClear(SYS_INT_UART0_INT);
! z/ A' h' w3 A6 J9 V3 Z
5 q( z6 X$ m0 s6 m // 发送中断
/ a! V3 M6 O8 T/ P' w if(UART_INTID_TX_EMPTY == int_id)# c% o5 f; g9 W1 E3 n' x! e
{
) {; Q' P6 V% [$ S if(0 < length)
$ V$ f" T3 O( B; d; }* J# [( p {
9 a. ]: b0 h* T0 C7 p( q1 Q // 写一个字节到 THR
2 k' j: ]! M# g( c7 \; D9 d UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
$ q; r2 \, h( W+ t2 D% N% j length--;
/ E$ B: U! p- A# | count++;& P' Z) Y& W& C+ {% c6 u2 {
}
( t7 \/ B V: F" ^! H- B6 H6 I8 ~ if(0 == length), j1 p9 y8 M4 {+ e7 R- |
{: {6 j1 r- P7 a- y
// 禁用发送中断
/ t, F2 t& f" k/ F; ?- V5 l! \8 V UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);, q9 T* ^' @* V* x& W
}! J" h1 J+ D% u0 O6 ] g
}; ]8 w+ i0 z! U2 @- y2 Z( B3 M
K9 x) G# c" Q/ X- f3 H0 k
// 接收中断' L. O; C2 K& d& N1 `0 X$ }
if(UART_INTID_RX_DATA == int_id)
0 @6 f. d: j/ T$ q {
; }: Z3 s+ L [ h6 ]' D if(status_a0==0)# H$ r7 U& s! D9 G, c" g! a
{
9 P: }, G$ J$ n- L, I a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) I: ^1 Z( I- ]) s* a2 c: @/ X
if(a[0]=='#')7 N* p4 H8 G5 o) P, P" d
{
+ H/ O, C: r) O) v status_a0=0x01;% L/ K0 B- f2 e7 l. g
status_a1=0x01;6 n* u$ N; i* V& D
}6 }: t3 T* p5 I# x8 B
}) t6 |' E/ J! a
if(status_a1==0x01)
6 X8 L6 c2 D4 H+ [' _ {3 c0 K, j/ P0 x8 r
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# ]9 W0 \; Y4 \* y3 `6 d' f- f
if(a[1]=='R'). w* \% T K6 S* D
{( v. Z# \/ X4 D6 O! Q" ? d
status_a1=0;
% T: J5 K( q: L9 @ J) r status_a2=0x01;
2 q7 E/ K1 ~% ?3 y% E }; W0 R) @4 g! ]9 \8 e! s
}1 S1 x1 ] ]5 F
if(status_a2==0x01)
* s% J3 \2 l2 V$ X2 l7 O+ U% W$ j& ` {
: x9 P$ W: ?" X2 v. |# D! F( v a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 P3 `; [! \' T3 Q! F: l if(a[2]=='A')1 v1 `7 T3 r0 ]) x- m) L
{' i1 i8 D$ E3 g [1 a+ A7 n- q
status_a2=0;% h& y' g" A$ ?# G s
status_a3=0x01;" P# l S$ O9 n
}" C8 \! Q- j! C, L
}
2 E A! D/ H2 Q. V; J" q; _ if(status_a3==0x01)3 R6 b3 @8 E/ R d
{/ [) ]* ?; M2 I( O V+ r
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" L) B3 \) L* C7 A1 W9 x if(a[3]=='N')% C: v4 A* _5 S& C4 R
{
. K' j E) u+ ^) u' Y status_a3=0;
9 O/ L% S, r+ y: j7 l4 d status_a4=0x01;4 c' n$ ?6 G5 x3 r) P
}
0 _8 `" V" I) Y }
2 l5 n5 J1 I9 U7 R- m" S if(status_a4==0x01)
' U4 A* w5 a3 }6 f% P+ ~6 b: _( N( ~- Q {
1 _! w" _/ |' B8 o$ z/ c a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 \& X2 Y% [. H9 ?
if(a[4]=='G')
8 `, {3 I' W2 c" Q" ]2 Y! ` {
: H4 s8 `4 h$ @5 E$ P4 g! H status_a4=0;! f$ A5 V2 @- u$ ^0 m+ f0 r" W& T
status_a5=0x01;0 T. [0 A' [9 r& d& A) T* C
}" `0 b, _9 k& Z0 q
}6 l, C4 q/ }. N# E
if(status_a5==0x01)
8 T8 X+ x5 k& Z {) l2 H7 i* `% H
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: ]# U9 _' R! V0 R( y9 q& p% x0 U0 _
if(a[5]=='E'). g' O, A2 x5 o# a9 t0 G
{
7 U( t7 J6 r, B0 B status_a5=0;- Q& s9 X h" n( I
status_OK=0x01;
3 P; c2 n5 ^/ B; K1 A/ ^1 h" s& l }
( E/ i$ M+ c( d. B }6 L# }& m7 U$ U; p. i& C
if(status_OK==0x01)
( p/ e- J* o! m ?! @- Q {& G# X* c' X/ u0 J6 B
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ ?0 O1 O; R* a4 t- A lengthrx++;9 O2 E* h- O( z0 Y! |
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)1 ]! s& w( j1 b" K7 C- J: e( W2 {
{: `& ]7 A, A1 e# b4 i$ {, q
RecState=0x01;
% ?( w; t3 C( c$ y }
+ N& V# U1 B( y& E }
# Q2 d& Z5 f! ]4 n5 u% c8 _' i- ]. s" c% E* E3 x1 Z; [& f
}
: z, \' ~4 o: I4 Y2 U& [1 r3 M& K# Y% ?" s7 b3 f* H5 Q
// 接收错误' e8 v9 Y5 a4 x" ?
if(UART_INTID_RX_LINE_STAT == int_id)
% p' K9 h# y- p8 W/ B {
! K2 Q3 ~ E6 h" g2 X. p while(UARTRxErrorGet(SOC_UART_0_REGS))
1 i" r$ Z2 Q K/ u' d8 J {
7 U3 }7 ^/ y, j // 从 RBR 读一个字节
4 a# s5 U$ W1 L |+ ]* n6 R, p6 @ UARTCharGetNonBlocking(SOC_UART_0_REGS);, W. D& x! W. V1 F6 f; G
}2 @! A E+ W3 t; y+ j0 O$ P1 k: e3 ^
}
% n( i4 F' r$ d/ X! x! G! ~
% x0 { B( r; ~% s$ D4 U; p# U return;0 O ^9 J7 Y2 z+ i% D" X& U9 U1 f0 _
}
} g) `, I, \0 _% L! ?: Q# f
, H' L# x" U/ C+ D; _ R- x
# a' W3 Q0 J+ u0 l9 P3 r& w) r3 m0 H! m* y3 `: {, L0 h
|
|