|
OMAPL138双核通信,现在需要DSP核中的UART0接口。- P3 [: _; c0 L
我是在DSP初始化这不太明白。
$ ?: ^4 I. K' P% C$ m' [. Y初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
' s4 Y$ R! O: G/ T' Q
# _3 f: e. |) ^6 G8 s | [+ j$ @# f5 _! X) s f
首先 PSCInit();//UART0使能
! y; W8 @' }- v/ z4 _void PSCInit(void)
8 h6 ]9 H/ O; d3 c! g D{
4 e3 o2 ?9 Y$ C' C2 ] // 对相应外设模块的使能也可以在 BootLoader 中完成
; a/ v/ }8 ]1 c; q/ [4 F5 O4 E // 使能 UART0 模块! o; m5 d/ z; [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- I5 B, p) v9 h9 F
}; l0 M7 J6 T2 R8 c7 R7 Q% U
* n& \1 H( l3 W* `* `
; ]2 V# X' W) H( ~1 I2 P然后是 双核通信的初始化 AppInit();# ^( ?& y) Y# n' Y. G9 E p; m
void AppInit(void)# r# Q( R2 B4 \% [* e7 q6 R
{% N% k, W) j2 Y1 u }8 }* n
/* Structure to initialize IPC (see Ipc.h for definitions) */9 M4 s8 A" A' Z8 S [
struct IPC_cfg ipcCfg = {' w; @$ T' |9 U0 B. u6 {
IPC_DSP0, /* local processor Id */
7 {$ a- M! Y X- Y IPC_ARM_HOST, /* remote processor Id */
# Q. c) j3 O* W3 ]" ] IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
* M, _0 {$ t m o$ l IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
( e- S: q2 E. W' v2 W$ P/ D NUM_MAX_EVENT, /* maximum number of events to be created */0 n, Z8 R" r/ B3 {
&ipcPvMemDsp, /* local side private IPC memory */
: ^8 |+ ^& j4 @ &ipcPvMemArm /* remote side private IPC memory */
' {( R. v \0 X8 K9 V };
1 Z0 ^8 U, T) z% w/ z" v: C3 b IntDSPINTCInit();
+ W8 g, z' X- S: b- Z* t: @ IPC_init(&ipcCfg);
8 T9 O, E, E+ E+ q, d9 S IPC_intRegister(C674X_MASK_INT5);" m/ V5 D6 {: u, h, A
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
# S* [& n2 A* G1 t# _3 h5 G
4 E: ]* s9 Z* h6 Z% K" x. P# v! T$ N /* Enabling interrupts for DSP C674x CPU */. l2 y' s, x/ _0 E; ]
IntGlobalEnable(); /* Enable C674x global interrupt */
; k" l: w c' E( p: t. @% q iAssert (Notify_start()); /* This will enable IPC interrupt */1 y3 I# S. \2 b8 ]9 g
}
/ z7 c \/ W4 V1 e7 G3 R* A* A0 S! B; c
然后是
, J R+ t$ V& a0 c // UART 初始化) C+ d9 E! Z+ ^! ]+ v5 ?
UARTInit();
7 H% ~3 `) g( v; A3 O
! h' _2 n( b/ w! V4 ?* N( z // UART 中断初始化 B: Z4 t# Y# {8 ~9 i7 t
UARTInterruptInit();1 f9 H( M) i# d4 C
: Q# C9 b" U6 C J- Y
7 I! y' ~/ s8 Y" ?+ Q0 c# m* nvoid UARTInit(void)
2 Q& D" r) c, y- P1 ~/ ?. D{
, u" c: X6 x4 }$ A3 I // 配置 UART0 参数* _7 F8 \+ a5 s( O2 W$ v* B
// 波特率 115200 数据位 8 停止位 1 无校验位6 w+ W4 V- s) C( B
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,, S& t# G' Z0 B, k0 w8 x
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);7 `0 D) Z; z0 a; @# P( z7 T
// 使能 UART0
3 N5 r7 ?" f* I5 ?* S$ j UARTEnable(SOC_UART_0_REGS);
( j/ c( _1 a5 C! f3 W2 E- C; T7 N- }! x5 k* w
// 使能接收 / 发送 FIFO5 ^# L3 H( S2 Y& ] D/ ~
// UARTFIFOEnable(SOC_UART_0_REGS);
) W X9 q; t- n2 X5 d, O
% p; M! E4 \) s8 \, }$ i, e b UARTFIFODisable(SOC_UART_0_REGS);0 U' N _4 K+ ~5 ^/ J
' |7 L) I* ~8 K! b7 ]7 U
// 设置 FIFO 级别 接收FIFO的级别
( o) |+ f* j) r7 R// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
) k9 U' ^5 _% M* O9 J* V; Z# o}
@0 f- p+ p3 {% {0 z6 x' ^; X2 g) u) Y7 M. a4 u" q9 r- C
2 Z( m7 F: M( d9 ~; L
void UARTInterruptInit(void)) @( ^ n* i U5 r# b
{
) v& ] F. K Q0 V IntRegister(C674X_MASK_INT4, UARTIsr);
$ B- M6 A% I- x. V. L. s% ~# q IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
: P( Y2 `( l$ m% ]7 B IntEnable(C674X_MASK_INT4);8 j4 z9 T% o) g) ] o M8 z
/ t/ k" a& ~0 W& X& l/ P // 使能中断 s3 v5 _+ s" }& Y' S! ] _
unsigned int intFlags = 0;
8 w4 D6 d0 h; o intFlags |= (UART_INT_LINE_STAT | \
( a% u" b( ^6 @* {, V' Q UART_INT_TX_EMPTY | \
. ^% J5 z5 @2 I2 Q8 T* S! R* y UART_INT_RXDATA_CTI);- |$ p; Z( c# D; e o
UARTIntEnable(SOC_UART_0_REGS, intFlags);, W8 M2 n0 e! s7 Z% f
}: V/ B! E3 d5 p/ w
. k5 g/ T9 G" K! h" P2 m0 v3 C" g! U, V' C' C3 \5 |9 Z
void UARTIsr()
" S5 j* H/ x7 i* u{7 V1 u" B) l1 w9 f4 ]1 M
static unsigned int length = sizeof(txArray);" ]: ~2 O0 z/ T4 S) j" |
static unsigned int count = 0;6 ]% \+ p' j* A; N; H9 ?; X
unsigned int int_id = 0;- G2 M+ `) B, R; ]1 C( G0 d, v C
8 d9 @1 q( g8 q" `9 ^2 _/ f# {
* t+ S: C0 \) n
9 Y% k2 Q# b! j. s$ B5 v
// 确定中断源5 p. @: [3 @3 t0 E5 o
int_id = UARTIntStatus(SOC_UART_0_REGS);
8 e6 M' x4 ?, Q, g: L3 S6 u( R# V: Z1 E9 L/ z
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。- I! \! ^5 S' f0 ]( y+ Z
4 K( H+ N( L: Y4 B" l, _
1 w% l1 c) \5 z0 `, @4 ^8 l- k ]
// 清除 UART2 系统中断5 o* Z. i/ @. B' x$ q
IntEventClear(SYS_INT_UART0_INT); @5 S- W# r/ H3 j8 Y; w* G, r
0 O! C+ w! \0 N
// 发送中断
5 y& N# C( n ^- u if(UART_INTID_TX_EMPTY == int_id)
: }8 p ?! O+ A. }" N {
8 [* L2 R" S# ?" N! O4 Z/ u9 A if(0 < length)
, d" O+ f9 n: F3 T7 Y5 k& T {
0 m i! O$ o6 G+ _) F0 [. r+ S // 写一个字节到 THR/ O$ O6 j4 X9 c, L( F* |
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);4 E% \: q1 K" F. j% H! q
length--;
1 a2 F0 R* t0 \. C2 ` count++;
- k( ^* f: K) M4 L- L" r }+ b- M" @: w. R1 u8 }
if(0 == length)
! z0 u4 `2 N2 [- ~% Q {5 W7 E1 Z% x# {, R
// 禁用发送中断/ o$ n$ J) A4 ]( v
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
& u$ \) a- }+ S9 V }
2 Q$ O: _6 q8 ?& R) r! o a }+ L. x- `; n* k, d2 I
) o3 n$ l! [0 J% Q [ ?
// 接收中断
* H# ]" ~, \, o9 |5 @ if(UART_INTID_RX_DATA == int_id) Q$ z N7 m# }+ W8 ?
{
/ [6 F& K C; K/ U Y( X if(status_a0==0)* z+ U1 p' j0 K4 w
{
1 A' h( Y/ x' J9 ~* S. x a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 I0 B! |1 B% ~8 z/ q: r. a if(a[0]=='#')
4 i F/ N9 Z; m {. y0 I8 O4 `. @4 m7 ~! C6 Y
status_a0=0x01;9 n' ]- B. ^( }$ F# F
status_a1=0x01;; Y8 E% } l8 }7 x
}' C3 e8 j8 S% u4 u
}
5 |# T8 R3 U9 {7 s if(status_a1==0x01)- e* n, G6 Z( E# H! W# A' z
{& a; g2 z. _5 W( N2 O3 _
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 e* f1 `/ @0 F: } I3 x! o if(a[1]=='R')
* v7 e/ j$ w9 j: T$ u. c0 S+ } {
$ h4 `$ v1 l$ x9 M }0 b( t status_a1=0;1 P$ f# L1 R) {( Z
status_a2=0x01;& s6 s* `1 }! d; J6 r+ y% u
}. T: \2 w9 _0 H. G8 R' {2 O
}0 w' r9 S2 v- x l* n, {
if(status_a2==0x01): ~/ h7 q8 R) f' b
{
3 [" Q! u" A1 \, q; Y' Q a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% h# a) I5 D; L) [+ T; G1 o# ? if(a[2]=='A')
) Y$ ]% ]6 X; S {: d' c r! ]! r& l1 q
status_a2=0;
: l$ ^& l1 r/ M# w+ U3 k status_a3=0x01;
# }/ Q% z7 t# q/ m+ O }: L8 |% U' @: I q
}
- @2 t& Z; _+ x: [' {. [ if(status_a3==0x01)
, x, M8 e$ k% U {0 ]+ G% V R1 C" G. R' n# I) `( ?
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);4 J4 r( r( ?% P- p" g
if(a[3]=='N')
8 L( m: |2 c7 x& U {
7 @/ j+ y+ k0 p0 B/ Y; q5 {2 t status_a3=0;7 t( S. R3 }3 r! x
status_a4=0x01;- ]/ C T! O* p9 L: `0 A$ n9 n8 f
}
* Q; N% K- k7 x0 O3 s" z0 Z$ H }
/ C( p2 w% j' W6 V' d if(status_a4==0x01)# R4 l8 Z$ O: H; w5 S% [
{9 f/ g2 H7 L4 a& K
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ S2 a. s) d: v0 C; \# S2 S. n2 j# o
if(a[4]=='G')4 h$ `/ d1 [- O6 S Y, y& \
{1 Z3 ^! W" ~" W$ d% [5 x% X$ i
status_a4=0;7 R+ w7 z3 P3 H+ }2 R3 l! ~3 s
status_a5=0x01;
0 v, Q8 Z7 s& ?: ~6 ` }% m! Y3 w' R) ?( S3 `4 l
}
5 h O; {1 ^$ S* B# }- e- o. j if(status_a5==0x01)- M' n ^1 o) d( f3 p
{! c |" T0 c1 i" }& m9 A, n
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) I% y1 \* R3 n) K if(a[5]=='E')4 ?0 U( Y' S( F. j S
{4 x j! s5 B$ [$ J$ m& F$ R
status_a5=0;
& P0 a/ `. h; \" r" @5 L status_OK=0x01;
0 _9 m* r/ {- l1 M2 o9 {) ^ }( y! H: }# K" J6 f; d5 B' V3 u9 N
}
L- {) B, Z1 p, W, Z. P8 p if(status_OK==0x01)
8 P8 i' M+ q0 K/ M; a2 I {0 R' A3 o5 ?2 D' ^- C; F
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% W1 q0 N/ ]8 ~3 r. X8 O lengthrx++;
% _* |, ^7 ?4 X' q* p" W; j if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
! V4 N g' }( p( \: u N; y( ] {
# E8 m) G: h' H RecState=0x01;) V2 i N# G; T6 o4 [! O% X
}% ]- v1 a8 Y3 z3 I% w; O! A' G0 z
}/ t' ~- v4 s x1 O1 g7 g1 v$ N
U, T+ d @0 [7 ~2 v
}2 R/ W, [8 O: S7 L; S
+ L. a h) r( \5 [6 w // 接收错误
* @3 w- C# Z/ y$ V% P! L if(UART_INTID_RX_LINE_STAT == int_id); |# `( \; |; d* \) N" a- L
{
& h# m& A" c l while(UARTRxErrorGet(SOC_UART_0_REGS))* M9 z: V. S! ~
{
! W Q( p6 k0 k8 b/ L3 x8 ~8 \ // 从 RBR 读一个字节
! }1 H/ ^/ P% O( \/ P UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 T. [- ~" u: l6 G& a }5 o& |0 {+ _8 I0 g) a* o
} G6 V! Y8 P6 f
9 o2 k6 A+ |8 @: H+ x
return;- Q' d3 C5 { F
}0 T$ ]$ a0 |) I7 K' p! G. \9 |
$ n8 X' `4 Z$ J( B, o9 { N( E3 d
5 f5 R$ j' c" ?8 J* d
$ {3 }7 X9 v! M8 B |
|