|
OMAPL138双核通信,现在需要DSP核中的UART0接口。1 i8 A' P! K3 Z1 ^
我是在DSP初始化这不太明白。
. f1 L5 k6 ^4 u: {9 I8 z) ?' l初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
- {- c4 |' \' ~5 H; {% d% a, |6 f6 c; a2 p6 Q) h: d A2 Q
. y# S0 U2 s% L# \* @3 j0 P, w首先 PSCInit();//UART0使能
' F7 ~( T0 t G. j* }void PSCInit(void)
0 }* j0 n" V- J) m; t+ v{
3 O/ D! O* t; ?/ w' N // 对相应外设模块的使能也可以在 BootLoader 中完成6 R& C$ u. Y" |- d# U+ a W
// 使能 UART0 模块: L( H. R, G O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" ?, [: n9 I5 I( k6 Y4 X% O, G
}% w3 h7 }3 x6 V, H. l
6 t" V. x6 c( F/ z* q. \
7 `8 j8 `3 r* n$ E然后是 双核通信的初始化 AppInit();7 ]: { H1 i R0 C
void AppInit(void)
' T' @" Z% w0 C! a0 \* o( \{
" q! b/ u2 H0 c5 A4 g1 ^ /* Structure to initialize IPC (see Ipc.h for definitions) */+ Y6 s' `) Y5 ~; L* p) Q/ O) [
struct IPC_cfg ipcCfg = {
R0 J' p* \; D8 i IPC_DSP0, /* local processor Id */% r7 ]& A' y' B. v/ |
IPC_ARM_HOST, /* remote processor Id *// p: z! d, }, i( {" D, C Y
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */* x! f. V; d- {& O# B2 M" V
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
! E8 M$ M8 z/ u) ]: {! |4 Q. L( A NUM_MAX_EVENT, /* maximum number of events to be created */
3 F0 | }: }# I# f; t) b &ipcPvMemDsp, /* local side private IPC memory */
" ^6 ~! Q) n! }/ n' H &ipcPvMemArm /* remote side private IPC memory */
0 I0 k! b- B# h: z& {; V$ c" K' L* P };& ~! E( m* A. q) c- e
IntDSPINTCInit();
+ ^0 m T1 N' o IPC_init(&ipcCfg);
5 i. x! p" _- Y# X* k2 S+ u IPC_intRegister(C674X_MASK_INT5);2 U a3 a7 k' [! n
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
8 m; E# f0 E4 C9 S7 i7 ?/ b4 k+ V$ L8 _( F
/* Enabling interrupts for DSP C674x CPU */ Y& }( X& p, M7 u
IntGlobalEnable(); /* Enable C674x global interrupt */- G) C& ~) t. ~ \$ r5 p
iAssert (Notify_start()); /* This will enable IPC interrupt */) u# }9 U v+ C5 a( m
}* s# b+ P. [$ G$ J
! p7 O$ w) ?: u
然后是 + w5 }) S$ b& v% \- j; ^$ E3 n
// UART 初始化
$ z* ?) } O$ r+ t UARTInit();& L- b& K# b1 m1 y: v+ W% G: n
. C$ [6 l4 X9 E- V
// UART 中断初始化( M* D! {/ j8 s4 P( q' H t
UARTInterruptInit();7 O' ?; T5 _1 a& l' I- q! N5 f
8 Z) R c6 d. X) [1 k# H5 x
% e0 y2 N" Q' P! b* svoid UARTInit(void)
' R4 F6 L7 O' [/ g4 w$ O{4 E7 y& O5 Q; N. i, V' l8 x7 I
// 配置 UART0 参数) b! }+ L1 l! m4 r2 x K2 o$ k
// 波特率 115200 数据位 8 停止位 1 无校验位
: e$ w! |% ]' F: d UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
3 b$ J- F" [2 p UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 J8 I" _" B* a // 使能 UART0
( u% l& l9 l# m' G UARTEnable(SOC_UART_0_REGS);: W' [% @5 c3 D* R. \
* a$ n( p: I% l- Y* V0 w
// 使能接收 / 发送 FIFO
) [! B; s, V/ @8 c8 E7 d7 X// UARTFIFOEnable(SOC_UART_0_REGS);
# B( m& K. p2 q+ G9 }# z" h3 b$ d& \# v# d
UARTFIFODisable(SOC_UART_0_REGS);
( M0 j2 J# G5 ?7 k" N
8 j' |+ L7 R* \5 ~, _ // 设置 FIFO 级别 接收FIFO的级别
9 c" L; `" E- U// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
3 g1 L7 ]0 @2 i& ^! {- l}
1 J! B3 V. b& N8 ?( g; X- ?2 e7 {+ Z1 Z
, k) r$ w" q5 }0 X: y+ C- h! bvoid UARTInterruptInit(void)4 c) F: _/ I- j, i" a" [
{
. n4 i8 A5 g& Q; q IntRegister(C674X_MASK_INT4, UARTIsr);
+ j8 b4 g2 m% E( p; v; q9 ~; B IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
. W2 v2 e. \5 f+ X8 Q IntEnable(C674X_MASK_INT4);
. |* a: r* F- p/ }( b; ]
2 R: H' u8 V+ C4 v7 B* ^ // 使能中断
. [/ O$ U8 t. K( P& B6 S unsigned int intFlags = 0;5 o& n) r6 u2 z
intFlags |= (UART_INT_LINE_STAT | \
8 w ]: ]( `% B' Y8 b; M } UART_INT_TX_EMPTY | \
/ [+ P; u9 ]1 R4 P9 K UART_INT_RXDATA_CTI);1 Z! B( I8 Z5 m9 C
UARTIntEnable(SOC_UART_0_REGS, intFlags);
$ W# y% Z: w2 c" W2 {2 E7 R}
, t# f9 g+ A" K" f
; c4 v3 o2 d8 D+ ^/ g) j- k+ P
7 l/ X2 n7 q" B! f& bvoid UARTIsr() G# g8 S2 g% t6 Q K5 ?
{' p9 C3 K; c ^" H0 [
static unsigned int length = sizeof(txArray);: ~) p3 d0 b0 L* k& x
static unsigned int count = 0;
: ?2 q) U8 E) w4 f; A7 N ] unsigned int int_id = 0;
! q6 Q* W3 t2 u- O; ^4 }- i7 d8 J% t# Z6 z# n! b9 |
" c u6 m% L$ j" l
( J" e$ I# Y9 B/ ?8 Z/ D! W( m; Q // 确定中断源. T- k+ k1 g; R
int_id = UARTIntStatus(SOC_UART_0_REGS);! t' e# j8 k, y( _/ b3 J/ E
7 v( a) K% R/ H/ v5 b! c
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
0 o0 a0 m) j' |3 d1 _' w
% a% {+ T) f f8 S5 |" T
- p. A5 t# }; h9 R' J // 清除 UART2 系统中断
, ]1 o+ b. w9 _ IntEventClear(SYS_INT_UART0_INT);
8 M) X- [; k7 u- O7 y# w2 z; n& x" c) t
// 发送中断4 I# G- I7 x* X" F
if(UART_INTID_TX_EMPTY == int_id)
9 A( p6 e" q% `# u+ f {
) j) }5 r& e m9 u if(0 < length)" F6 j) O9 y, o8 Q& n
{
3 r/ M3 h- V) o) I% }+ Z // 写一个字节到 THR7 F# s/ |8 v) ^# c+ Y' o4 R
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
; X- Y+ o) x5 f; N5 ]5 t1 h7 M length--;
$ t; \8 x7 ?4 G/ V. N6 l count++;$ B; C$ c9 a/ w3 ?
}
4 z" }1 [" h9 x if(0 == length)9 Q& z9 g" ~- ~" Q
{" j3 y9 L- W9 w
// 禁用发送中断
& N' v0 q* ^: S g% ?; i5 U UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
: R3 s9 o7 @3 I7 M: r }
. _. @, x" ]5 A" b% U+ T) G }! t% A5 I0 }" y$ T/ a. z
4 y1 X" k% l) j( j0 V: n
// 接收中断; v$ i# K! u0 t7 {
if(UART_INTID_RX_DATA == int_id)
" l6 k! [0 h4 A: O1 p* [ {
) I& H/ K: k- }7 n/ g. g if(status_a0==0)6 k. d5 Z1 }, R
{: B) o( Y+ {8 C
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 b1 B+ @# ]9 t" I if(a[0]=='#')$ D1 s7 u# N" I! a. u
{
) ^9 G+ @ ^* F" m status_a0=0x01;
8 K. q' W2 r) S, }0 K. @ status_a1=0x01;
6 ~" Q8 W+ `# M% g }
2 j$ B& H3 b+ M6 r$ S }
5 n+ O/ a+ P7 R. ~, a$ c6 [ if(status_a1==0x01)* G. H" d* [# n' ?/ x i8 n9 j
{8 o0 y$ l- {8 A: N8 D- M& H
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' M( X$ v5 A: L
if(a[1]=='R')
) u' }7 ~+ f) K i- e$ P {
3 k& l: i: k. t; F, N( j ?- X& ` status_a1=0;9 \3 m* ~7 B8 Z; ?) T
status_a2=0x01;
$ v( M7 {2 d& R- c& p) _; b0 a }! Y3 G5 v( L$ E
}; A$ r3 X) ?- j* N0 X9 X
if(status_a2==0x01)
) c0 M4 v% ?$ `' T {1 O. {2 M1 z; Q! y1 V, C
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& L: A; V, ?6 m) F8 j1 ~1 z8 i$ ?
if(a[2]=='A'), J0 x0 q% J+ b) \; f; N7 h
{
/ U+ s# m& p) n: e$ n8 M0 ?! f! J& j* B status_a2=0;
9 j8 I; ^5 M3 Y" u/ x, ^7 b6 H( r status_a3=0x01;; T) F. h. N. [4 Q- Z
}# V1 j* J7 E9 r- \
}
+ c8 V5 J% |2 A! P; \ if(status_a3==0x01)/ T' {* i8 @& Q) h0 s r
{
1 H4 J* t1 w" ~7 P a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 x& U% H7 h' X4 F& f4 N
if(a[3]=='N')5 j2 |: ]) h. _8 N$ U$ A
{
; ~+ U% H/ r) w5 Y& o7 b status_a3=0;
" Y j: p) M: j status_a4=0x01;
6 N; K" N7 x# _9 m0 @7 T0 Q1 \. A }2 D# o" T5 w+ c! _" b' B/ r, v
}% K0 N* o9 ]" @1 K2 ~
if(status_a4==0x01)
% D' S; Q( R4 Z9 v. I1 H {% n- d1 P! x* M& Y9 H& S! c
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 \& `6 U9 J3 \) i6 d9 C if(a[4]=='G'): v' S r1 j j9 C3 l- Q; ?" n5 V
{8 M& }9 j1 y% c8 y9 K5 y" O
status_a4=0;
& e& U$ T9 c% z/ e8 C1 Z status_a5=0x01;1 S: D# S3 N& H2 F0 s: }% y' k
}# N3 B; u+ q# d/ l
}
' F' i$ ~+ U/ } if(status_a5==0x01)
! Y8 {6 s3 v4 y! K7 f {
4 C9 v) Q- e$ r a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ s G9 n9 v* A( M+ W+ Q8 k5 s if(a[5]=='E')
) m! V- o. [# K3 F& {- p4 ^2 R8 X {7 E2 |0 h' N {# ^
status_a5=0;) z# R* ~% b- F! j
status_OK=0x01;
% C7 l. ?) i _" f& E, W }2 o3 K+ O* W' a1 X* Y
}7 u3 H0 R- L/ O0 e' h1 v3 a' W
if(status_OK==0x01)( O/ O4 f6 M" x5 ]# R
{
/ s. ~' { g' A, B6 n6 |4 E rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' O M6 o: j* f/ O3 Y3 D% A- O$ n; l9 @ lengthrx++;
+ H; [* L1 J# k: V0 f if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
' W9 o* O5 K" K0 ] {
( h$ |7 S5 M3 Z6 h RecState=0x01;0 W0 Y* C1 y9 w" s- v a6 r0 a: |2 Q @
}
- z9 M$ l: p4 M: Z }
( A! A: [" p3 d8 m
4 n/ L' m; @9 t- J/ V9 G }
1 f, Q0 x3 r( b0 r6 R9 J8 d: s0 S. _* f' M( _: E/ e. \# o' P
// 接收错误
# k4 \$ Q8 X$ T b if(UART_INTID_RX_LINE_STAT == int_id)
$ P7 e' F0 w. a& w0 s9 j {
1 E. }4 E" }0 ?2 o while(UARTRxErrorGet(SOC_UART_0_REGS))
/ E; s$ p! h, u; Q: A7 e0 ^ {
: S" c, B( D6 Q2 @% w3 Z; A% B3 S // 从 RBR 读一个字节: p2 G, c/ I( _2 j4 T* U
UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 M4 Z7 e5 v* B$ M" F( m; n3 A }
3 I& v- ~& R$ }2 f5 B }+ ^$ [& R. S9 P# p1 G- M
! `# d. q# p6 G$ z
return;9 V# Y6 V& ^& V% L
}
& ^& f( e+ ^2 _* u; r( j! D6 ?
% E- d* a1 l; c* ~0 D0 y( D8 A" u [3 ^0 x# d: ?
, c* z, }1 Z7 o6 \
|
|