|
OMAPL138双核通信,现在需要DSP核中的UART0接口。7 v3 x" p7 @& O, J+ a& J- r
我是在DSP初始化这不太明白。
6 @$ r) c9 v" r/ Z1 C! T! h ^初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
+ j5 Y1 c( f3 H9 j3 m
/ k2 U) S4 V9 |' n4 e( ? ]
, b9 v0 v1 l: c& L9 p$ |) \# @首先 PSCInit();//UART0使能
) `# P4 P s+ V2 y+ E# pvoid PSCInit(void)3 d9 P( _1 c* ~/ @' O0 _; X
{' f9 ` p$ g% C
// 对相应外设模块的使能也可以在 BootLoader 中完成
k* t4 j: X& O% m$ b // 使能 UART0 模块* T5 ` f+ B% j h4 Y) P2 v* W. _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* }+ [( }1 P! a; @4 E* f' n) a8 y
}
- r, s. B7 N0 g& Z/ f" [
! H) `" Z- d+ Y: g; W" Y% `' g* X I) L- Q0 Z2 O9 W
然后是 双核通信的初始化 AppInit();, |; h& R( @' l7 z" D
void AppInit(void)$ s% S* N) o8 P' n
{
: F( V% i: ?/ P5 f- n& W /* Structure to initialize IPC (see Ipc.h for definitions) */
3 b( n$ H! n# ~/ t struct IPC_cfg ipcCfg = {
$ n5 j0 [4 d0 y! | IPC_DSP0, /* local processor Id */
2 M( \& j0 W9 c; S/ U IPC_ARM_HOST, /* remote processor Id */: \' t o; l) d6 V0 a k: _* P
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */. ^4 {2 Y3 t9 |5 |5 e' f/ b9 d* Q
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
' z% o5 C q4 y# _3 ]+ y0 z$ S NUM_MAX_EVENT, /* maximum number of events to be created */" I* {6 ]- \) Z
&ipcPvMemDsp, /* local side private IPC memory */
" N7 o4 L6 C7 n" x# B &ipcPvMemArm /* remote side private IPC memory */4 r! q9 ]; X; O% B
};
) K( n/ b y9 \" A: ?: `9 n ]* H IntDSPINTCInit(); `9 i6 ~. a1 f
IPC_init(&ipcCfg);
$ A* n+ V1 Z4 p6 j2 p/ b9 U! { IPC_intRegister(C674X_MASK_INT5);
% a4 ]( b- S( Q9 _& L7 t* V iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));9 f5 ]# x0 o% V6 F/ f& p
- {& [0 g; B7 n
/* Enabling interrupts for DSP C674x CPU */
9 ^% O0 E; y, h& m* J7 u% m IntGlobalEnable(); /* Enable C674x global interrupt */
0 B9 I J$ L9 i" L1 v6 i6 H0 y3 U( v iAssert (Notify_start()); /* This will enable IPC interrupt */
; A# ]. a# k, c, S. Z}$ C$ [, @. K% e1 w6 w5 W. g
& [2 Y# {6 i! d$ v; b8 v Z
然后是
9 h( n4 V0 c* R; r9 I0 d // UART 初始化% }2 n! C, [5 f- z" }
UARTInit();
6 {& B0 {8 X) @1 u+ X4 n/ O) _1 @5 C! m3 u) n! _( Z
// UART 中断初始化
s" w: r' V/ r0 k1 U UARTInterruptInit();7 T+ U- ], p9 v
* Z. O/ v3 ]. i/ R* ? ^2 x! v G7 x: j( d4 J/ L
void UARTInit(void)
* ^* X* J8 |! |9 D; X' a{
" y7 C" X) a% k; |4 d7 ~, O // 配置 UART0 参数
# ~5 U% f9 J" ?( v // 波特率 115200 数据位 8 停止位 1 无校验位
: F. R+ L8 P t UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,* q4 J' e. b7 y% ~
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: w, {1 g: k% E( e$ k // 使能 UART0, ]2 L3 _7 g4 G5 O5 I# t
UARTEnable(SOC_UART_0_REGS);
; F( [4 Y0 d& Z( b( Z) U# f. [! ~/ e3 e- w6 ?" p3 d3 x* G
// 使能接收 / 发送 FIFO
" Y- d; ]( s1 `/ Q// UARTFIFOEnable(SOC_UART_0_REGS);
" V# p$ @& a- v0 V( D8 a- Z$ y8 o) k5 i2 q/ r9 x) F6 L
UARTFIFODisable(SOC_UART_0_REGS);( U- a0 I, S6 E- t' B0 {
) o$ i# @; X4 J' x // 设置 FIFO 级别 接收FIFO的级别
6 p( W- p- X W N* [// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
$ |8 `7 Q1 t, Q& P0 T% K9 Z}6 t7 l# z% e" \# a, z
O O3 ~1 M5 {* M- E2 Z
# s+ l. h; r5 D2 ?void UARTInterruptInit(void)6 U2 x* W* M n0 X3 j0 A
{
# \4 M7 x! l7 t( b& ]- Q/ W IntRegister(C674X_MASK_INT4, UARTIsr);0 b4 m: J% t, L; I! g- q
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
( m {. q3 I( O) h IntEnable(C674X_MASK_INT4);5 a5 g3 @9 W ~7 d' I& r
' @6 z. g7 t) L/ v$ R+ K // 使能中断
" b! K$ ~; o' g. d% f unsigned int intFlags = 0;8 r+ N: `, O6 y: b" F0 v
intFlags |= (UART_INT_LINE_STAT | \
3 @. F& m9 J5 Q! U& | UART_INT_TX_EMPTY | \
% G% f' w4 ] Y4 p UART_INT_RXDATA_CTI);
6 J7 I( N, K+ C* e- M; K UARTIntEnable(SOC_UART_0_REGS, intFlags);, i; @% Q1 ? O8 q( M4 w: {
}
/ w; }6 X$ }; |6 o+ E Z
- X8 h; O1 M( S5 b, f' L$ A$ X
3 ?; n( h" S5 ]void UARTIsr()+ B* D* [) e) a
{/ H; t2 K& A) | j* K
static unsigned int length = sizeof(txArray);& @1 C. L- a* U# o
static unsigned int count = 0;
; Q5 o& n) `: n! x/ w unsigned int int_id = 0;
( O) m. _ O: W0 Z4 W& |: p9 ^9 A! o: ]9 i# k2 D9 _
3 f5 i+ Y3 }" R. u2 v& K! C+ H
7 p: ]* h" j( h+ ?7 P // 确定中断源
* z* u X/ y6 Y Y# c/ o; C' i int_id = UARTIntStatus(SOC_UART_0_REGS);
) {3 Y1 b* d+ G* z9 M/ f+ h
0 \* R0 X3 j; M5 x; i // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。& c8 _4 c. e+ V% ?1 @+ M. D
" b2 E( w! z3 w( }4 L
1 g: x8 ]" a/ H7 b" B, z' a9 ^
// 清除 UART2 系统中断9 ~; d2 m2 ~4 Y3 e J8 z0 i. G
IntEventClear(SYS_INT_UART0_INT);
# E& f( T( @4 s* a+ p
% i4 s* |0 r7 p4 L1 j2 Q9 s) r // 发送中断
9 H5 D: Q9 D1 e* z6 O6 g6 d o if(UART_INTID_TX_EMPTY == int_id), x. d4 i/ r- A4 Y
{
7 x, v! i# ^: ~; ~/ }1 o a if(0 < length), n- U5 N L; t% {
{2 Q/ {$ _! u) }
// 写一个字节到 THR
& K2 A* |7 m$ s2 E UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);) A8 _1 C& W, W5 {# Z
length--;
$ R8 o$ u" E2 Q! J count++;5 R N B( \& x5 I
}
& k2 H* V- A1 p: ]* Y J) t* b if(0 == length)
s4 x/ k- J Q% O {& B q |, y$ ]1 N# f
// 禁用发送中断
9 F7 e# G+ H, d% W+ d D0 x+ r: L UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
4 Y1 E$ k" ?, e5 E ` }
. H/ P9 g+ e8 | }) J3 c, [: K+ \ b7 `5 K
1 V( t& l5 Y' Q$ B; g // 接收中断! N$ y+ l- Y+ N& x9 S; o
if(UART_INTID_RX_DATA == int_id)) ^4 b/ R- l. l1 h- ^# |
{
3 a4 G; s1 g9 d0 h& P( g if(status_a0==0)2 D m& t; P& Q/ y% c9 L7 K
{
) H9 w/ E- r! j: l5 r8 K a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' \/ T( b+ ]9 X- Y7 n- O$ ]# W
if(a[0]=='#') X% `, @) q# e: a* L& \
{& e& |3 b( W2 D/ T, a: m5 P2 @
status_a0=0x01;
' P( H3 K; @' @ status_a1=0x01;' N% |2 ]! y2 A! u
}$ ~2 n+ f j0 l
}1 ~# h) u" ?+ q, v$ P
if(status_a1==0x01)" p3 c( ~% D; v& d
{
3 k) v4 k; h" K: l a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, f* v! o( r& Q) s ` if(a[1]=='R')- S& \* }/ T& X6 L1 B! S9 R$ w0 F
{, }; p+ M% b& H. @8 S/ Z
status_a1=0;
% {) L- |9 w8 b. T' i8 Y2 S/ G, u: e status_a2=0x01;
8 K- j7 {) K4 V/ t t' [/ g$ z- P$ W }( s# i+ h* y) A, L2 p+ k
}
/ L0 _0 N k, X# c: {- b+ U if(status_a2==0x01)
0 k) {, R& U6 K0 c& O5 V {
! L6 V' X# z% ?, U) ?. @ a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 x% Z9 r. S7 |, K6 K if(a[2]=='A'); _, [# [3 B! d3 k" H
{/ j2 S5 |7 H q' c- n* I1 v" \
status_a2=0;9 \& l! @) X$ T
status_a3=0x01;
* o( K2 K- p P* j- e+ J8 M }. T, ^7 i9 @5 M- K: A! Z2 b6 u2 V
}6 d% S8 n+ O3 p6 C+ A7 u
if(status_a3==0x01)
- L9 C- ^: J' v. W9 l0 ?0 {/ ? {
* \( R) P: n$ G f3 n a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 R: h2 ]4 n X+ J
if(a[3]=='N')9 F+ ~" V/ ~3 E, v# s* Y9 f
{9 }: q+ ?/ K. _% L- x
status_a3=0;
" i5 [1 a- o8 a, I4 o1 F status_a4=0x01;1 E/ ?4 i8 |( ^
}4 V8 f. S. A/ ~- ~( N
}
0 s1 G! A: R4 Y r& B. n5 k if(status_a4==0x01)
0 l* r& Z7 N1 Z$ i {
) w/ G$ O& r9 U, @' }+ S a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 E, M% i5 P O% H if(a[4]=='G')
! B3 d4 E1 `9 Q% ^6 ]6 R i7 b {# c5 D1 Y, t1 }3 f/ L1 Y- d
status_a4=0;% M5 ?; b" W5 P6 v
status_a5=0x01; J$ L2 k9 `' F \- p5 J
}. ~7 Z. h3 {3 A% u; ~
}2 C2 e3 b1 E( H8 n
if(status_a5==0x01)
. d# Q* X7 E- c ]# ~/ c {- [9 W" y- @ Y/ z
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) C, ?& n2 L! c H
if(a[5]=='E')
1 D) I/ I4 \( m; p0 o0 Z3 c {2 P3 l7 U- Z- x/ H3 E
status_a5=0;
" R9 j0 |9 _! U' X, ?- l8 ^9 K% S status_OK=0x01;* Y/ J8 V' X4 q% j; ?' O
}
+ v4 H5 y2 `% i }
. L% D1 L! Z# @ if(status_OK==0x01)
5 M! {3 S9 H X; a' G. \: g" ~ {
# B" _" _2 b. a( C6 z rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 Z: s; z9 b% M( |3 Z) j! W7 H! r
lengthrx++;
- v ?# d: V7 D5 u' \2 G, T if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
" d) z1 p1 y3 r" i5 j$ w( j5 S {1 u' C' B) n4 D% U" f& w$ s
RecState=0x01;
) `6 p- ? Z1 ?7 k }% g1 w4 M5 u; R2 ]" p% T4 k2 X
}) j M8 l" D5 B3 R7 N
6 Q9 p6 t. l/ E' q# _& G
}
% B! j0 w4 Q+ b$ d" c: ~$ Z2 O [9 D* U. x$ M0 Y8 t
// 接收错误
4 I) n0 K7 Z0 d3 k# |* T if(UART_INTID_RX_LINE_STAT == int_id)
2 X. K q" q0 T* s" f {
8 y8 h! [7 l# h4 \( Z% d U$ E9 y while(UARTRxErrorGet(SOC_UART_0_REGS))
/ u$ ^: f, ?( ]- I; v& {$ u {, n. \7 {4 b2 y! Y; `" V! A
// 从 RBR 读一个字节7 L, d: \ C* |
UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 ]) [& E9 Q2 Y. { }
; I9 Y* _0 x" n+ D- Q }! a2 K# v C4 v( s. F. Q$ n! x
7 N/ _% T9 [5 ]( t# X/ C. j
return;8 M! p, N+ \0 r8 @& g
}) V H* n5 c: X- [' ]) j0 w
5 ]. W+ h: B$ @4 c! Z, L2 H) r. w6 _6 q% @7 n3 L' s
2 ]8 S& e6 E9 D; Q5 t* o |
|