|
OMAPL138双核通信,现在需要DSP核中的UART0接口。# O% ], s, _: H. u
我是在DSP初始化这不太明白。4 y5 j) _' Y: s- w8 L/ Y1 Z1 Z
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。% ?8 w. j" u$ ^0 x! j, v
) N# U" ]9 _& `$ ]( G. {
& G7 C/ M# R8 z g1 Z) S0 H
首先 PSCInit();//UART0使能
5 y) t+ Q! I* \5 }void PSCInit(void) {5 z5 c4 W& Q2 u
{
- ]4 w) X D" g // 对相应外设模块的使能也可以在 BootLoader 中完成- S6 r9 J9 q u" ?) ^0 j8 @
// 使能 UART0 模块
( l) R) o$ r3 L1 n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
; e0 s1 p ?" y4 d9 S% ~2 T}# j* \5 H! `! O( E
/ J& }: \8 }( E
+ }, C$ D/ `6 b& s
然后是 双核通信的初始化 AppInit();
5 O9 B' d. F+ T5 C& H, H! }void AppInit(void)
7 ^9 V0 v6 ?8 J1 o6 I: k+ Z{* g) d2 {+ c& @* q0 R
/* Structure to initialize IPC (see Ipc.h for definitions) */
& N, C5 `! S5 X/ g( r8 c( d4 M struct IPC_cfg ipcCfg = {2 l5 G; t3 `0 L% K! a: f
IPC_DSP0, /* local processor Id */
, |# F: I7 e$ |, { IPC_ARM_HOST, /* remote processor Id */
; {' S0 m: W. e/ F( a IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */( |" [6 d* s3 v6 A+ c- r) ^, `
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
7 O( R- G {' }" I NUM_MAX_EVENT, /* maximum number of events to be created */7 n" J) h9 L% c% g" |: w
&ipcPvMemDsp, /* local side private IPC memory */# ~$ V' q) s P o
&ipcPvMemArm /* remote side private IPC memory */* W0 Q0 K6 s1 W( F, g* w' t% X
};
1 Z' i# X5 ?# O/ V IntDSPINTCInit(); Y, _ G3 J$ l
IPC_init(&ipcCfg);
! d* y% m* F) Z; g IPC_intRegister(C674X_MASK_INT5);
; O4 w6 q6 o- F" O4 P7 r" T iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
7 W6 {; Q9 A4 u. {# i# o: X/ D9 s5 ^# I T
/* Enabling interrupts for DSP C674x CPU */
3 {7 l) u( s3 Z) N IntGlobalEnable(); /* Enable C674x global interrupt */! V4 l+ x/ O1 v- d+ ^$ ^
iAssert (Notify_start()); /* This will enable IPC interrupt */
( {8 c( n6 Z$ a) B) r! k. n! E}5 C, e: Q1 Y/ p1 |% t
! n% |8 ]. F1 \! ]$ I然后是
. K( q6 Z9 Q! y3 F+ D // UART 初始化' k& ~0 P! q6 i- {, w
UARTInit();
' G2 {4 k# ]# j2 B7 c3 d
3 b. z: O% ^/ w. p // UART 中断初始化
& W# n( c% p! D+ b UARTInterruptInit();" n& u! }. [) {2 }4 M
# ?, ^. m4 k1 K; p& V& F3 n
3 ~$ i% i/ b4 S8 s0 z7 vvoid UARTInit(void)
w" @# Q O: |. B% i{ a) U" [. n3 g! n
// 配置 UART0 参数+ b7 g, l. b: t+ R
// 波特率 115200 数据位 8 停止位 1 无校验位$ ?2 H& X/ p8 g7 T! g: }3 E" C: I
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
0 ^* l% z+ H' N UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 t- }& c: j# c/ A' S: x, O* {/ | // 使能 UART0
6 ^+ g8 m- K2 D: C' }. O UARTEnable(SOC_UART_0_REGS);
/ F/ T8 J G2 d0 G* V
& z# K/ K; i, @ // 使能接收 / 发送 FIFO0 w. A O/ U) ~ {
// UARTFIFOEnable(SOC_UART_0_REGS);
, N) Z- p% @ H, b% | |: t3 {( X3 C! B- O: R4 }; g
UARTFIFODisable(SOC_UART_0_REGS);7 M% Q) o! E M5 {
8 j$ i. c, x: T1 f // 设置 FIFO 级别 接收FIFO的级别
]% a, j& W( D* X; s6 x3 A// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);5 U I3 c0 e3 H4 B, \
}
7 O& R0 T2 }5 ^; M$ S. y
* x, ^% B9 ?, b0 J+ Q( K. L; i$ L7 q% o( Y
void UARTInterruptInit(void)
! w3 i, g1 s, t{
* ]' J8 l. W. S IntRegister(C674X_MASK_INT4, UARTIsr);% s+ r- k) `& f. i2 a, E
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
5 \ m6 x7 ~& S. \% T IntEnable(C674X_MASK_INT4);
/ }! O# [- h: M; a# p/ F. v- X7 m; ?" f O- J+ D# ?/ {% s Y' E
// 使能中断
% x+ J9 m1 [/ V; s unsigned int intFlags = 0;. G5 n4 U( x( d1 `
intFlags |= (UART_INT_LINE_STAT | \
; q# y7 @. C1 R6 K( g, c6 k UART_INT_TX_EMPTY | \& V( Q4 V' b2 W, X
UART_INT_RXDATA_CTI); G0 N5 L2 a# F
UARTIntEnable(SOC_UART_0_REGS, intFlags);$ a- R/ W0 q& V; I* ?1 V
}
3 g c5 P& ~: o& v; `- `' j u$ @# D" W
, n9 R/ m- w/ T" f
void UARTIsr()2 a2 e7 v' S6 n5 ^+ x
{% j( r1 d, Y8 D
static unsigned int length = sizeof(txArray);; l+ ]& ^7 ]6 w& ?
static unsigned int count = 0;
3 c: t3 E4 x, H* q$ X2 O unsigned int int_id = 0;
/ g' n/ d4 i V( B% W- z9 Q. Q
! h) W& b& R. a; f2 q
3 p! o1 d3 z1 V! O8 A% k3 ?/ [" s
// 确定中断源
' J) h W( `- y9 q! _) B9 D9 F int_id = UARTIntStatus(SOC_UART_0_REGS);0 c! x9 _' _% e, T7 j
" @% o* r# D7 E" A" V4 k // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
* j+ R' G2 M' ]. \, ]4 o5 w
3 v- ~) n4 a) m. A8 ?
$ d7 |. T# V- ~3 ?/ u // 清除 UART2 系统中断7 m% r: g+ e% [5 `, G/ H
IntEventClear(SYS_INT_UART0_INT);0 e. v% {$ I R `4 w& e9 w7 `
' I9 O9 c3 c8 Y // 发送中断9 T2 M2 M- B$ l! I6 ^; `0 [6 H! s
if(UART_INTID_TX_EMPTY == int_id)9 M7 u0 n. F0 N. X- A* C: L( z
{
, k% ~* c7 `$ { if(0 < length)
" i7 `' ] \8 j: z {
3 D! N" ?+ Z' V: g/ M' [! ^, q5 o // 写一个字节到 THR* c; x5 Q; ^- K3 d7 {. B/ W1 r+ j
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
- I6 N2 v; H/ u) p0 C% ]* z length--;$ I# M/ E# n3 E: H5 `+ G
count++;
% ^5 |8 ?/ I4 O7 V5 g$ z }* M- z" l, {: u3 G' ^2 y) ]( v
if(0 == length)
$ W8 ~- V, u5 z; k( q {
/ g# m R. W/ q6 q // 禁用发送中断# \; ~' ^+ Q7 g/ y
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);9 l% {+ x& ]! ]5 y2 D, K
}
* y2 P4 ~7 H$ p; W! w, J }
8 ~* H* t: m: E. Z, u
* z4 `+ H! i4 d7 [ // 接收中断
9 s- I @& {8 [9 m1 R if(UART_INTID_RX_DATA == int_id)' P2 S. Z0 ?, n) Q5 }
{
/ y" r# l( {" }; I. H if(status_a0==0)
# G& y$ w$ U: @. \8 S: }% @, J% l {
2 g4 f; |! h! O Q% N# k a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);+ p) F1 l; p+ }" {5 m
if(a[0]=='#')
( G( W6 \9 m/ V$ ] {2 x6 Y; X {- w, p. t# J* P6 T
status_a0=0x01;
: S3 C: Z7 \* S3 K! _ status_a1=0x01;4 g- A' q$ @( A7 e+ M# q
}
k6 T- v I5 M5 [ }, }& G% Z1 S/ [- y0 i
if(status_a1==0x01)
3 V: e6 g1 a) e9 b* m {
- D) N P% [( D8 w* v# Y a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( k. H% A/ a7 h6 Y; ]8 T+ y8 Z if(a[1]=='R')9 N) @8 R4 ~; l: G5 K2 D0 j. F) o) d* `
{& O/ r) O' l2 O- N& @3 i9 g
status_a1=0;! i% |8 J$ B: k" `5 G p. X
status_a2=0x01;" j+ r# S( N' w6 m& E6 z
}& ?1 p/ w7 M0 N0 ~6 ~' ~8 x' s$ m0 @
}' G4 T( } k3 v# o0 h$ j& w
if(status_a2==0x01)
4 l6 ?; ^# Q6 R& Y7 k( x {
6 J2 g+ Q2 a9 V a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 b& m1 Y( n/ g' K9 O if(a[2]=='A'); z+ j9 g9 j9 i2 a# U
{
$ Q7 A0 |' n# q" b8 S1 ]3 p6 r- h( v status_a2=0;
1 K( V6 T- Y- Q) U0 Z# |$ k6 Z8 J status_a3=0x01;. |6 O0 j! a$ w& L8 K$ W- [
}- u; C0 `0 Z7 R1 `9 s) |
}6 {& z2 E8 h4 {) J& V
if(status_a3==0x01), K, W+ ]1 a$ ~. q1 W
{
4 e/ F! P* }. r: a! k' u8 B a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 l7 G6 j% V8 r1 u$ ~ if(a[3]=='N')( n& p8 X3 `9 | ?8 `, i- L
{9 P+ j E$ k G% T
status_a3=0;7 Y8 D! u* F! @0 l$ j
status_a4=0x01;0 _# I* ]; H3 \+ v# A9 w
}
/ u0 f4 j C7 o; M1 w( x }
* @0 I. ~, y' v0 @0 Z; P! W* p if(status_a4==0x01)0 Y5 i3 w& f0 N
{
0 C9 w1 x4 C1 q+ R0 H! |9 @ a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# e' n, S5 n4 d: o
if(a[4]=='G')/ l- Y# e6 Q* x R& f+ G
{/ H. T- E. y0 o9 J/ y! [% x
status_a4=0;
. Q" T; |' |: `9 a# J i status_a5=0x01;
$ t5 e( ?! z9 Q" ?8 o }% O& F! e5 j+ ^; ^1 ~4 u
}
0 n% S' _, B" y% x. [( R# `, x8 y& } if(status_a5==0x01) k; _$ B/ G! [1 R9 V
{: p9 {; J' R$ U8 [! I/ c
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 D/ p; T6 R5 B
if(a[5]=='E')8 }% r9 D3 ^7 `8 m- p. j) s4 X
{
7 |. v5 h7 Z; y9 P" P6 Y status_a5=0;$ }9 v! Q3 @+ q4 _# |
status_OK=0x01;0 {1 e$ F4 ^% Y' u) m! y6 J9 Y1 A
}
4 d( ]) ~1 b; x8 A7 ~ }
$ h4 ~) I6 |; O# s) g' C if(status_OK==0x01)
, q$ {; P) | `$ E* j* s/ V {
) ?7 q9 [ L+ D rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);/ c$ c5 N8 k0 Y# {. h4 E
lengthrx++;
( U9 F! ~$ \( w7 R4 y if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
& u7 U) d1 ^ M {
. g5 R* K3 b, X: x# q RecState=0x01;: ^( O6 o! W6 R. f q% l
}) t9 h0 h: k& s: ^+ U
}, o! ?. ~) f5 _$ r o# @* _- m& ~4 D
0 {. M: _) D, b
}% H. w: o2 r1 R8 U9 E% q# \
! v7 b! ?* x3 R; \- A& {
// 接收错误
" B" O4 y% G! M4 w: k if(UART_INTID_RX_LINE_STAT == int_id)5 _( L; r0 `' [
{6 K: w5 n* f% u, P9 |, V
while(UARTRxErrorGet(SOC_UART_0_REGS))9 N0 d: i c$ W7 k, D3 b
{
' m5 P- Q" I X // 从 RBR 读一个字节
* g* v3 O5 F' y x. S, q UARTCharGetNonBlocking(SOC_UART_0_REGS);
% h+ t( K/ G+ {, g9 u }; s+ g5 `9 h& ]( Y c% P
}
a' s* F/ [! P; J7 n0 `
6 ?% d* f2 j2 W# b return;
* Y$ _2 q" G' I) O5 L' X}+ v3 P+ C$ q9 o C- f
/ @5 ~: r2 |; P4 \" c: C) `$ |8 W
. _6 `3 m* }4 ] w! y4 r. B' Q
: M# Y( Y, F8 l1 U* t7 C- V |
|