|
OMAPL138双核通信,现在需要DSP核中的UART0接口。' |; G3 _& n7 f
我是在DSP初始化这不太明白。) D$ D$ B% ~7 \6 ?/ H9 t( [
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
$ ]% ~9 j1 h, ]! e- s" s
+ }- v; u) T1 {4 C! {" x6 `
' W. W/ Z7 h) ?1 j5 O! W首先 PSCInit();//UART0使能. E+ A6 g& {4 I" b8 ~4 H+ X
void PSCInit(void)) [4 {4 _) C2 _! n
{
v+ g% e( P8 R z$ P. { // 对相应外设模块的使能也可以在 BootLoader 中完成
8 a( |- T! O, O+ o& w5 l // 使能 UART0 模块& q! v4 F' o$ b' O( S4 d% q$ P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 u8 [! B s6 X) n. V0 \& p}9 {# u+ g7 w+ ?( f( m
* {; N& G: e9 i) l
4 x& L v4 V. q然后是 双核通信的初始化 AppInit();/ L% m X3 u. I9 g& T' S" i
void AppInit(void)# t2 [3 P4 s, b+ Q4 w' C" i
{* S5 g5 g9 a2 Y7 J
/* Structure to initialize IPC (see Ipc.h for definitions) */0 g6 X2 {3 I: V7 T/ m, W
struct IPC_cfg ipcCfg = {
( \* h; Q) v" ~ IPC_DSP0, /* local processor Id */- U3 e9 F& A5 Z* f. G, {4 x
IPC_ARM_HOST, /* remote processor Id */
+ G2 T, j$ m+ c& d; q4 `5 b t! l$ D IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */7 k' M& H1 `7 \! n, `8 ]- u7 z
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
6 O/ y( C. s4 K NUM_MAX_EVENT, /* maximum number of events to be created */
# _& v: B' o( [- ` &ipcPvMemDsp, /* local side private IPC memory */2 c* Y. [! @* z* Z2 u' h
&ipcPvMemArm /* remote side private IPC memory */. p% \3 R2 w9 L) m% y$ I
};
' [% @8 r: K5 D0 o. t IntDSPINTCInit();
& r j6 R( {, s, u7 A4 n$ h9 b IPC_init(&ipcCfg);& {4 c2 c: q3 s4 j" U3 O5 E7 F
IPC_intRegister(C674X_MASK_INT5);" k: v, a0 b0 t: P/ S* d w
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
' c9 \" \2 o2 W
4 q: n! |; g' q! [/ [0 O /* Enabling interrupts for DSP C674x CPU */, ~0 s+ `! O9 c$ v* `
IntGlobalEnable(); /* Enable C674x global interrupt */
/ K) e# Q; P6 [ iAssert (Notify_start()); /* This will enable IPC interrupt */# L4 v9 z& K; @1 J, n3 z- y6 \) `
}
. E2 p7 K) r$ D2 o6 e3 ] X5 |+ W& h( b- ^* w
然后是 # P; `7 s4 @# s v* W$ I# N6 I
// UART 初始化; U' c- m: r& Z' b+ U
UARTInit();7 K- t! J7 g, j1 i6 B
1 K$ ^( ?) B4 u) J8 K$ F1 G& E // UART 中断初始化$ D- Y3 ^6 M- z( @& G/ C8 P
UARTInterruptInit();
2 e- a8 f' z: O/ _9 S# H* L$ m8 e4 l5 e* ?: `, \
5 k. t8 G0 P7 _2 J* q* }9 Ivoid UARTInit(void)
. }* m' |- d8 p1 W+ ^ A' k{
- ?0 ^& X$ V6 W // 配置 UART0 参数
; Y# D7 M B: O1 x // 波特率 115200 数据位 8 停止位 1 无校验位
j) O4 s, ]; B UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,) w! @4 E" L2 Y7 P% I5 s/ ~$ y
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);( c+ |8 `8 g+ |' {' Y0 v5 ?
// 使能 UART0
2 D# W4 G: O! ?. K1 l UARTEnable(SOC_UART_0_REGS);4 K9 c6 K/ c6 O# ~& P5 y
# x: W% I# o$ I7 v8 v
// 使能接收 / 发送 FIFO
$ H; m: I' J, Q3 `' X. D// UARTFIFOEnable(SOC_UART_0_REGS);8 g+ X! T. J9 D
4 p. ?; n! _# o( d- s UARTFIFODisable(SOC_UART_0_REGS);
! f6 O n4 v, Y# {7 E6 b7 R' w+ r: F6 e3 \$ O: X
// 设置 FIFO 级别 接收FIFO的级别1 Z) F& s0 T9 L( e3 ?. M4 a, {- W
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);, J8 j& e/ n8 y9 h% o8 l
}
: ~4 V* ^ U/ D* d
1 A. T+ O1 O% h! z% T# H0 M2 G2 D2 |9 y- x
void UARTInterruptInit(void)
- b/ y s* U- q& o7 K{
$ U! L4 @5 J, a1 o2 ?. L* h IntRegister(C674X_MASK_INT4, UARTIsr);
% T" c2 v$ n P5 P# X) D9 ~8 {7 u IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
8 h- G4 ^! ^* f0 |6 M k IntEnable(C674X_MASK_INT4);! N, |) y$ g ?
! C, |/ k; l$ z // 使能中断" {0 A$ P* n4 h; C% u# b
unsigned int intFlags = 0;
' z0 u( @4 d1 v2 y- L- H8 J& [9 S intFlags |= (UART_INT_LINE_STAT | \( ]4 }" E) M6 b
UART_INT_TX_EMPTY | \
) n! h" H m8 q4 |- f UART_INT_RXDATA_CTI);
8 S5 L+ J( q5 `" x& x UARTIntEnable(SOC_UART_0_REGS, intFlags);
' y' ~6 p' ^4 V8 V6 v}7 E" f4 @( S3 s; q" J) s7 g
- S3 E" t* ?* ]! A: d2 @5 o5 V3 H# {& A+ j0 s
void UARTIsr()
6 t5 o8 H( o; c6 O{
9 C4 _( i+ n2 y0 `7 e3 z& e static unsigned int length = sizeof(txArray);
W. j4 N! d: x* N9 S& ` static unsigned int count = 0;
* b' I4 J$ R7 @, a& b) |, p( m2 L unsigned int int_id = 0;) A0 @3 Q. m0 w! q3 h' [
. |' @5 d5 e' o9 t. N' g6 w
' j3 x# Z4 u% u* `! T
& J6 i4 k1 P1 a' q H: Z( I' V
// 确定中断源
, F. V% e O" z5 z8 V+ Q- W8 ]& f int_id = UARTIntStatus(SOC_UART_0_REGS);! w! Z5 U- c" c/ A' V
. i* q; T. f ?0 @ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
$ f8 h8 W: n. p2 E6 l& E
, t8 X- r7 D! W" Y) \9 W
3 i; @/ Q& x" O // 清除 UART2 系统中断: }' s) p* h% q/ v8 V& }( ^8 y
IntEventClear(SYS_INT_UART0_INT);
Z2 _: U9 r" \; {
D8 [; r9 Y1 V+ f) F$ v, Y3 m // 发送中断3 _, B! f+ ~2 g+ M
if(UART_INTID_TX_EMPTY == int_id)9 `$ y& S" y5 ], Q1 M
{
( i) y& U0 W* E! n+ Q* q' B0 X if(0 < length), w2 L/ N! K' E
{; u) n3 p( U5 b; T) h& ]
// 写一个字节到 THR/ i( m# O) l0 q* [
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
?, g1 j9 ~5 W/ Z length--;: X, Z5 Q5 x+ Y8 d: w" E
count++;, l, q; R$ A I4 `
}
$ K' Q8 F! z) |. _) _ if(0 == length)
% \1 P* `# y8 t. u2 M {
: x- {- |/ A% N0 y // 禁用发送中断
: y; K6 ^9 j1 m0 g% A( b* `9 X UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);* ^8 z# I: K- ?
}5 S2 ^- `& t# j" y4 c7 c+ N* t
}4 k" Y' _, z/ p; l* A
" Y O! ?9 Y1 y. l E# [# M
// 接收中断
7 G! I; f, N) a if(UART_INTID_RX_DATA == int_id)- ^7 B7 }2 P O" P4 y1 e6 R
{
, ]& N; P" ~& V, S" U if(status_a0==0); @) n: I* P9 {2 P+ ~) }
{ p6 [: R. X( f) j# S" w9 H
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, Q" l0 K- w$ Q% d" M6 S* e5 v$ ^ if(a[0]=='#')
/ H7 b: x( |$ h" Z& v: A {
/ }! }' Z9 G4 x' Y' A# n1 K. G status_a0=0x01;
2 Q9 ~& {4 U4 K+ H8 J: M% T status_a1=0x01;. P: v! U# c- P) d
}4 N y( l* v6 J+ n
}
2 K# E5 G( S: {& E6 Z4 h if(status_a1==0x01)% _4 V8 Z' n, k# H, g8 ^8 B8 |
{* c0 ], O# v0 i' c
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! W+ I# H: l" T v9 c: O1 q if(a[1]=='R')9 h7 C$ u% e( [% s- h/ @/ v
{
H0 S8 c5 W, |) C \ d status_a1=0;
! \, a$ k: w [& n. o status_a2=0x01;
* D2 l( a. h2 k/ U& j6 _ }
: B0 E- }9 l5 g" @0 X }
3 h2 }- N4 @( a% o- Y9 X if(status_a2==0x01)$ U, w/ M2 b( {
{
# R* `( r) t( y a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. o/ q/ T$ p* @+ b9 o% @ if(a[2]=='A')
J# ?/ [- x0 c' f) N {4 b2 t O8 x2 ?9 U1 D( t% ~
status_a2=0;
\9 `6 O H7 _4 K- X& A status_a3=0x01;1 X6 F1 r; i E# E" F r
}5 d9 g% Z! t G) P. ~. y: Q
}
# g0 }: T# n7 L' c* ] if(status_a3==0x01)6 h& K. d. m- B' G; t. R
{! w0 f- f7 ^5 n9 w- [# _. r9 B
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) q: `; P( v. @+ @* l if(a[3]=='N')
: S P/ L! J: I; X {- t a. m- B# Y7 r7 ~
status_a3=0;
, f1 |: r6 M$ H6 y; h# O( n status_a4=0x01;
' j2 j0 c& O$ w& h! ] }
! A1 U( ?, G( h" s9 S5 H }
' A a0 I5 t* S9 U; g if(status_a4==0x01)% y* W5 n: g4 U4 u- `; S
{
/ T+ M4 x3 E2 M a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% m9 {/ Z5 E$ g. S) v1 C! ~ l
if(a[4]=='G')
1 K/ v5 J% ^; l: U2 d4 j7 ~ {
) L: A7 u5 t% C8 b! x& G; r status_a4=0;
) X" K' |2 [( K/ P/ {# Y! \: F status_a5=0x01;
5 ?3 q" x6 E P! K: m$ ] }4 j9 I7 {0 p% Q3 `+ C& J7 a
}
; u. k& o$ M- A6 p* o" ? if(status_a5==0x01)
! A9 M6 x; i8 E* c, H' A {* I) [' m$ m! _ v( Q5 `
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- t Q1 q; O0 p, i. @1 y: X
if(a[5]=='E')
: [/ k( y, f1 }' B3 o* C {4 }5 ~8 x8 O" L
status_a5=0;' w0 I7 h) {2 c: v9 d& q+ e( H
status_OK=0x01;
$ p5 W! [& j/ | }& o3 O% |* d' h0 R2 `
}( H! g7 B E: L
if(status_OK==0x01)- I6 q6 W) `' ~( C5 X# s) p
{* \2 s: H# c# ]3 X- t. v0 s9 k
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 {/ J! I6 s; W, S0 u/ m
lengthrx++;
, H3 Q: [/ q, x" c* D if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
- c" w$ L7 E. G {
" G7 V! v5 y Y; F# I5 T Z& b4 w RecState=0x01;
, e( b3 F! a& b( O }
. q5 ^( M6 C) G W- a* V }
# K$ y% ^6 W6 z. |2 |# p( |" c5 h0 u p! |: f! M8 O
}
# B) \' z: g! o/ a; v
5 O0 r7 k3 R5 H* ^& F( e; N // 接收错误9 L2 G+ d- G7 B5 |$ M: w; v: {
if(UART_INTID_RX_LINE_STAT == int_id)
* |2 n% o! K2 R3 O- V4 h {& o1 _1 d+ q, L: v/ `. y- `4 |2 i w0 d
while(UARTRxErrorGet(SOC_UART_0_REGS))9 J$ a7 ~! V9 [0 Y/ {
{' X5 }: @& Y9 @- S/ f3 q
// 从 RBR 读一个字节
2 o, u. h7 a9 N O1 u UARTCharGetNonBlocking(SOC_UART_0_REGS);: z+ n# {- b# e
}4 G# l. J; c8 h) N
}
3 ?" H& D9 x ^ d7 X
. o5 v2 S) |# b9 ^4 B, t/ L, D return;% R }! f! x# |
}
( d" r4 T5 }$ r7 M. _. ^3 G) Q4 ~. P( C
; M1 N) v6 H3 y+ O* E( ~, [$ d& M/ v1 S; V x
4 M3 C* } c0 p" r- q9 H7 R- D" o |
|