|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
* N& G/ a" `( d! b L% e我是在DSP初始化这不太明白。
; a4 z+ e y- }# j6 Q初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。$ I% ?6 c0 S5 n( C
2 p* g3 F% G/ D) C+ V
* b( A3 ^( P7 {* r
首先 PSCInit();//UART0使能- f# L- v8 o2 K. a E
void PSCInit(void)2 V2 V" f2 ?9 b0 E- }( [: b- f7 A
{
% e6 r C0 A2 C7 ^ j- J9 ^ // 对相应外设模块的使能也可以在 BootLoader 中完成5 |+ P/ @. r9 k; C
// 使能 UART0 模块$ {7 p5 `' C1 g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( }) S/ \" U- h+ F: K9 \! j! F6 I
}
1 b M/ _% x, T$ b* ~& \
! B' q/ t( D2 y: `) Z9 u
9 \: I1 {3 `$ F; T" }1 ^然后是 双核通信的初始化 AppInit();- q% p* s: e* ]( Z% ~, f
void AppInit(void)6 |$ P& W' b2 y4 s
{0 B6 O6 i1 C4 i' i8 C( k
/* Structure to initialize IPC (see Ipc.h for definitions) */! G3 ^7 S$ M* v
struct IPC_cfg ipcCfg = {
, F) j; h- G& ~* d7 u3 f IPC_DSP0, /* local processor Id */# K: q1 L* q# D
IPC_ARM_HOST, /* remote processor Id */+ ?; z4 I/ T2 y/ I
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
9 l2 s' z9 q# G4 I# | IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */1 J5 z5 g) V' {$ t* g/ _) E* w
NUM_MAX_EVENT, /* maximum number of events to be created */' k3 z6 ]& n6 _/ a: I/ y
&ipcPvMemDsp, /* local side private IPC memory */' J4 x% l4 m: d/ Y' f' g
&ipcPvMemArm /* remote side private IPC memory */! V% x5 ^) c9 x% s; ~8 n/ y& j
};
* s0 b- I6 Z7 L2 u$ T5 K9 j IntDSPINTCInit();$ {2 m$ N) C/ V T
IPC_init(&ipcCfg); R0 q, o0 g* D4 O& M8 l3 h4 N* Y4 m
IPC_intRegister(C674X_MASK_INT5);# Z! R9 f7 }/ U, G- q
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
" Q8 \7 v7 e; i2 {
- I2 Y& L& d8 j1 T9 @. o$ m7 Z6 \- f /* Enabling interrupts for DSP C674x CPU */
% k1 d' c3 c3 c' i5 k2 a IntGlobalEnable(); /* Enable C674x global interrupt */! _" F x3 w" e& f4 z [! w
iAssert (Notify_start()); /* This will enable IPC interrupt */
) }# l" n9 X/ H& y}
$ {* w1 R% u9 Z3 Z) } r8 ?
3 P2 g7 W: a1 c5 G1 t) J! C然后是
% q& ^2 z e: n0 F: f // UART 初始化
! O, r: X$ T3 \ S+ A1 n" H: |. B UARTInit();% x9 K( |# V- i+ e
& g4 B P& C2 G! Q1 k' _
// UART 中断初始化
% D; \1 c y* _ q- j UARTInterruptInit();
+ T3 u8 N9 {& n% \5 b) \. Y6 z
+ E: m/ ^' O/ H* D' N( m8 y6 p6 f# D' R) N& Q" F
void UARTInit(void)7 S) o5 Z; a) _0 Q
{
& T2 L' v& k8 j& M& E0 K3 w // 配置 UART0 参数
5 u+ T0 C( _: @ // 波特率 115200 数据位 8 停止位 1 无校验位# v/ I* q! ?$ a% J' {' E% |# F
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,; E$ y9 \# R1 |0 h
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
8 p$ S% f% T* A7 Q: z: i // 使能 UART0+ v% k& m9 p; C. J
UARTEnable(SOC_UART_0_REGS);& w; j# ?+ B2 U& ]4 d
* k V# {2 P. ~$ `
// 使能接收 / 发送 FIFO! \0 N$ R9 q- L- s
// UARTFIFOEnable(SOC_UART_0_REGS);% e& F( t. U9 ~9 J2 J0 u$ ]
- s9 C. q$ U* ?- m: B, K
UARTFIFODisable(SOC_UART_0_REGS);; y! ^4 o% d ~7 u
+ n" g: e9 q( i+ P2 E% i; o // 设置 FIFO 级别 接收FIFO的级别
/ w X/ s7 y: \// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
; b7 e: L2 V% c0 t6 u+ u, | E}
1 F4 e4 M; ?: Z- R+ n1 y& v q* \: l0 O$ a# s
% J: G* C( h c# `+ Q
void UARTInterruptInit(void)
4 x$ n8 j, ^) H0 `; [{
( x- h0 ~* F- D7 d2 ]% Y) E( K+ l. Y IntRegister(C674X_MASK_INT4, UARTIsr);
6 Z7 H/ U0 b- V, J* H IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);: |+ q) \" J! n0 K6 N
IntEnable(C674X_MASK_INT4);
6 C5 {) E4 A( ^% k }2 ?: B7 j" V) |) m& d
// 使能中断
2 R0 n: R8 o V0 J" }5 g+ j unsigned int intFlags = 0;0 w# J9 |0 e8 j/ W; g0 z
intFlags |= (UART_INT_LINE_STAT | \" {) W, p- C$ N4 K% X' y1 p. K
UART_INT_TX_EMPTY | \8 ?8 H6 E- T* P4 d# R6 h) e* B8 z! t
UART_INT_RXDATA_CTI);0 m/ `0 r, _' ~, A. M2 i$ R
UARTIntEnable(SOC_UART_0_REGS, intFlags);4 T8 C' f0 h( ]( p
}
. z. Z9 u/ w, I H( m' j: Z9 w" V3 i# q$ Y" {. U/ y& c
0 n! s1 w/ d/ O; p2 ^9 I" [+ q
void UARTIsr()
0 e7 d& W! c; l6 v) U6 P( E{
! d8 ]" z& i+ J% K+ ~ static unsigned int length = sizeof(txArray);
+ Z" b( ~/ n0 b) P& G static unsigned int count = 0;0 B, i4 U( h! u P
unsigned int int_id = 0;
, @, \! G0 g# c5 `
" c' f6 }9 M( `4 F" V) }3 K& _+ x! o
7 ^6 M5 b# D3 ^ // 确定中断源+ f! M3 F2 W [9 N
int_id = UARTIntStatus(SOC_UART_0_REGS);" {, M; h8 F; o0 B
$ j3 i8 s4 v1 ^' I% U
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。1 ], |0 F0 v9 ?2 p+ S/ U. K/ \+ v+ z. H' {
' t T& K. M& o8 j, m3 Z* C" q6 w3 H$ n
// 清除 UART2 系统中断/ F% Y) N2 U e) O0 C% j
IntEventClear(SYS_INT_UART0_INT);
+ Z0 P/ C8 C9 m4 i' v- w% `
. X! @# i6 O) E0 I b8 q1 E1 F3 a // 发送中断/ l0 a! Q% ]: I7 r/ V( g) N
if(UART_INTID_TX_EMPTY == int_id)
" [2 b+ C$ M, s9 A1 X3 A2 f {) d# q# M4 V8 p' {. `. D, l" N
if(0 < length)
( _2 E0 }6 _% `' Z% {# C$ N {; n; z5 I, S; x2 |/ q
// 写一个字节到 THR
\" k2 [* S( G2 u8 Z UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);; `7 D+ P* n p: H* \7 R+ {
length--;5 c* f& e! w2 v& d& A- g8 n
count++;& m" l) D0 ?- b0 l0 p8 w3 c: [
}
' J2 d7 v2 _7 O if(0 == length)
6 r$ l+ ?+ L, Z8 d2 _) z) t4 Q6 c {6 O* J* J% ^: C) _+ \+ E
// 禁用发送中断, M4 `' m2 U2 b3 l3 l
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
6 z2 ?, W9 ~4 P0 ]# x& P7 b. f }( U% E" ~# w2 s
}
% x& `2 e4 A" _& |9 k- U6 d' k4 u8 T0 g/ E- e$ U0 Y
// 接收中断
/ `4 J9 a5 V8 \! x7 [ if(UART_INTID_RX_DATA == int_id)
/ w/ z) c! i- Q d9 ?9 N {7 S0 E) G, C* B2 [7 Y+ s
if(status_a0==0)
" Y, Q. Y" T3 O& |" e( C& ~* b0 v {( Z M3 q! o* N6 c2 H2 Q0 B
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% G* F! T# u4 b if(a[0]=='#'); L; }" T/ z" f
{
9 o$ w% J. O' Y! O& n$ Q! X6 ^ status_a0=0x01;
( Y3 |! U& y: e" T/ c) }! T: s5 E+ B0 M status_a1=0x01;
# G$ ? [. k. N7 g! R }
: V& s! @& w+ @. D6 X1 y5 L }% ^/ q" F. o& B+ R9 Y" A1 w/ g
if(status_a1==0x01)
4 R8 n7 p, f5 `# K+ `, I5 N1 p2 z {( [4 B# W3 H5 A8 D3 J
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, q) v; r) X3 Q# O
if(a[1]=='R')3 N+ B( {$ I+ l& p
{
9 S2 X) }4 f5 u! d status_a1=0;
5 H! s, c& b* `" m1 x status_a2=0x01;% V2 L2 } u8 ]- U- S7 P `
}) i. M' p- B) v; L h
}; F/ }$ T" [: `5 C0 z( t" D
if(status_a2==0x01)+ |, a* c+ P6 J* d
{1 A4 X- Q/ ~! I4 s/ h
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. Y. L: a5 B% q- p$ V s0 | if(a[2]=='A')2 g; |' v# i% _0 c1 b$ h
{, ~2 m. u+ Q. C, P
status_a2=0;
1 y4 U+ }. y! N% J1 r7 D% | status_a3=0x01;
5 j5 S9 v# l% e+ ~ }
4 Z5 n* f) j8 j: e }& W$ F2 u; Q: C0 H7 F
if(status_a3==0x01)1 l) V/ f5 P2 v$ s+ N
{
- p; j5 Y; X5 l; _! _0 L a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* m. {8 z. K! H: q V) \4 t+ ` if(a[3]=='N')& }' B J, l1 U Y# P% h8 W
{
. Y- v9 E! X+ L2 V1 e! _ status_a3=0;- c6 Z' V' p$ b ^9 ^( N# M* B
status_a4=0x01;
; [, d m$ f2 N3 T }$ H4 G" x; C( i; V3 y
}
& \+ s( F! x5 ~* v if(status_a4==0x01)
3 A) y: c2 B4 Z$ L+ x {3 y/ j" ?! @3 W! F/ l
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( `! j" \; i/ v1 l if(a[4]=='G')$ |3 o0 x( v+ S/ \
{ H1 i7 e- u$ _% Y1 v" R! T* }
status_a4=0;, L5 o; m9 l5 _' D' d
status_a5=0x01;
3 U; s k" p3 D1 i5 J* Z9 \ }: Y- B) |7 T5 f& q" s; O
}
7 K0 T2 X4 v* i7 X if(status_a5==0x01)
* C4 \5 B6 l' o9 y$ z {
: n. ?3 X8 b9 J- r: I: E7 s" N* H a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- v! Z! O' Q) {1 d
if(a[5]=='E')
/ F7 G- P& m6 V# {2 G* k6 |2 P4 H8 ? {5 L5 @$ _: _3 w5 z4 r/ V
status_a5=0;& B" L- U8 f1 q& Y
status_OK=0x01;% {6 w+ o. m1 X) b
}
* m. h( }$ _+ Q F- ?" \2 I$ ^ }
4 w# b j, `! P' c if(status_OK==0x01)/ ~* V; F; Q/ x2 r
{- W' s+ z, j7 I! j |+ ~
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 N: Q0 B' X+ G- @7 L lengthrx++;4 E& b9 n/ M, }3 V) W
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
5 j7 ^6 r5 I9 Y$ h1 z6 z {
+ }2 n8 I- ]- M r RecState=0x01;: u$ h. ~: t. e5 R( r
}
# }9 |4 }0 s* X5 \8 {' A }9 I: ~- `, I0 v7 u3 H6 ?4 X) `8 `
5 I8 `* }; d& s& M1 {7 x+ A6 r }
q- l- \5 c. m% j) [# u4 S' K# T% |2 } v) y9 U( z7 V6 M
// 接收错误
1 v, d) h- O9 W4 B6 {7 k if(UART_INTID_RX_LINE_STAT == int_id)1 O: d8 Y, d6 v$ d) t1 N! X
{
4 g- e" |3 N9 k9 N) v while(UARTRxErrorGet(SOC_UART_0_REGS))
l. n7 j& V5 X; q! M$ R {3 g0 Q- l; J$ C) ]8 i& a
// 从 RBR 读一个字节9 n3 P& ]& K" ]* ]! T
UARTCharGetNonBlocking(SOC_UART_0_REGS);: R% _7 Q" R% k) ^4 C$ o
}0 L& y0 ` Y0 u' F! n4 m, O( ` l
}1 P& X# A0 m3 P2 E9 `
% C+ S4 o+ `; H% B9 }" K* \8 K return;+ b; A/ e5 ~0 @
}* s; ~5 J2 ]$ f! i" `
* O9 E8 W, }! b# ?9 P) s: @& [8 |& O$ H" Q, T
! t- l* R% G6 o9 |% {2 l9 t$ ^4 ~ |
|