|
OMAPL138双核通信,现在需要DSP核中的UART0接口。) Q! y* D2 Z$ U- l$ G. E0 v8 N$ y
我是在DSP初始化这不太明白。
" I2 ~4 p( H1 d6 Y% I: `% f7 b8 B9 [4 ]初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。. L/ D/ L* w, A3 z- t+ b
0 }+ Q3 y$ X+ ^" ?! S! r
8 f- e( y2 ^: l) s首先 PSCInit();//UART0使能, Q; t: A! a1 J$ Z2 p2 ^; W
void PSCInit(void)
' d6 X7 v2 t6 {9 o5 e: o. ^' Z{( u5 D+ n6 G- D0 R' z/ u
// 对相应外设模块的使能也可以在 BootLoader 中完成
& V3 J' h: J m: |( \ // 使能 UART0 模块. u+ X% F3 g# [+ a$ c/ X& K- Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' v. q* H6 h6 i/ P: ~: w
}4 A$ T& B+ \6 T% B/ _ T0 l
% K- Q3 R2 G& b4 D) |+ e1 A K( y
2 S2 S4 j2 X2 z$ U5 ^然后是 双核通信的初始化 AppInit();6 A- m$ [1 Z7 _) j. |6 R; F) E
void AppInit(void)2 L2 n" [9 V, C4 ]5 z9 |5 h8 Q
{
; z% |6 ?2 F; Y; w1 O% ~9 e( i. G: k: J /* Structure to initialize IPC (see Ipc.h for definitions) */- a+ x* i. p' Z$ N: l6 Q( v0 U' U
struct IPC_cfg ipcCfg = {( O1 I8 s! V# O9 z- D* L1 M
IPC_DSP0, /* local processor Id */2 [* N6 _6 S A9 P7 Z! `
IPC_ARM_HOST, /* remote processor Id */
. a4 s. } S& B) L8 V# @ IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
& u$ x8 w, i* u' m& O) c0 ]6 l; }- w IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
8 ]& S" \) r) L: q NUM_MAX_EVENT, /* maximum number of events to be created */ { \( x2 t# H
&ipcPvMemDsp, /* local side private IPC memory */
5 e8 z; W' {& t6 ?: f1 D" k- F &ipcPvMemArm /* remote side private IPC memory */
! I* h+ r3 E3 l: V* Y C# n };; h' P) y, {9 ?% e4 I7 S7 q
IntDSPINTCInit();
1 C5 @" H. E2 u. r6 ?, ^, ] IPC_init(&ipcCfg);
. r% U9 r: t' w3 R3 O IPC_intRegister(C674X_MASK_INT5);$ }, d# ?% [) b: Z8 y
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
4 L/ s8 w+ T. v) [! ~6 Q7 G0 {- g2 G' J6 E4 b5 }
/* Enabling interrupts for DSP C674x CPU */
& t4 U: `: ?) N& G9 D IntGlobalEnable(); /* Enable C674x global interrupt */
: W( k [1 m7 M- Z+ o9 V iAssert (Notify_start()); /* This will enable IPC interrupt */; ]6 |" @- Y. l1 [) ~1 c" F
}6 B1 t- U( i) q4 K( T* h
6 n! W% y0 M, j5 ~
然后是
8 u4 G; W$ }9 E/ C: Z+ z6 L // UART 初始化, Y* @& e. r! a# d5 I( a7 ^7 B% F
UARTInit();
O! U# k7 j7 J8 d3 ]/ d4 q2 t) T5 ]/ h, j- V9 w2 O- ~
// UART 中断初始化* s0 d, F: I$ N8 p
UARTInterruptInit();
7 t8 o$ _" }& ]) g- v7 Y9 L! A" U; m/ g9 U; x+ y
1 `1 f8 j) v3 w9 ~7 y
void UARTInit(void)
4 L' v3 R% D) E f, g{- J$ X' h/ u. w( J
// 配置 UART0 参数
4 I+ @2 K* |2 i" K! f7 m // 波特率 115200 数据位 8 停止位 1 无校验位
- c3 T1 x, T9 f" z* M UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,) R( B! f2 I1 ]2 z
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" |* f! P0 ]3 I+ Q) B2 t: Q6 { // 使能 UART0
1 C$ h" k5 T' C4 ` UARTEnable(SOC_UART_0_REGS);8 @3 k0 j4 t' Y! r) N/ ^" G6 P
' {1 y* U( _; k4 l6 G/ r( D) k
// 使能接收 / 发送 FIFO
: o. T, ~1 q# t4 H// UARTFIFOEnable(SOC_UART_0_REGS);
' b: t" n, I/ v+ ^7 H
) r$ ?4 E. v& Y UARTFIFODisable(SOC_UART_0_REGS);& P9 F' I/ \" W6 e7 K
: S, R; j* H/ S+ d7 U6 z& ]; M3 \3 w // 设置 FIFO 级别 接收FIFO的级别
) L8 ?$ U# Y$ g5 B" f9 F! g// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);) ~) d+ R" V7 i3 t; ~8 F
}3 X# w5 E/ W3 U! H
( z5 _, y6 P6 K4 w5 c
2 m% x" n" a. _# q7 j5 D6 C
void UARTInterruptInit(void)+ ]/ M3 `( `* T7 r- }. b% i
{1 S) ^8 c" t; I+ }
IntRegister(C674X_MASK_INT4, UARTIsr);; N: p' h: N: }( W
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
) C$ g: m! [, ^ IntEnable(C674X_MASK_INT4);
" D# R3 v5 z6 ~0 y7 D! o+ k& Z$ m8 ~; f- V
// 使能中断
7 ^, d) Y) l7 z# r8 H0 B unsigned int intFlags = 0;% Q6 c- a7 R' y! m" z8 Q
intFlags |= (UART_INT_LINE_STAT | \
$ ]; r' A: g7 q% V" [ UART_INT_TX_EMPTY | \
' ~; J- T, z' \$ F+ Q4 [- p UART_INT_RXDATA_CTI);, g: d* { f q- `4 g
UARTIntEnable(SOC_UART_0_REGS, intFlags);
: h/ T2 G1 K l% X}
1 O# S+ D5 {! y$ q8 |: ^
% Z- @# E. v( R" O
z$ j" X$ }8 w% X [1 {9 Kvoid UARTIsr()' y' p2 n" S% B* v& W8 v6 o |( v
{/ H6 n# e# h- D% u' U, J
static unsigned int length = sizeof(txArray);: F7 d1 g, G3 O0 h7 @! Q
static unsigned int count = 0;
- ~3 g9 q: J, c- J" q unsigned int int_id = 0;
1 C7 l* w* k( y" y! |. C; u- a$ m( U. \ W5 S
: S4 L A/ V# j" G _2 @
, Q% ]7 P8 k. l, U- ]# K& m // 确定中断源
: ~) N' X. c3 s/ @# u, c' ^- z int_id = UARTIntStatus(SOC_UART_0_REGS);/ J. {+ @" o1 t$ H7 W/ Q
1 s/ l6 r9 k. E& Y F) J- z( b
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
1 K# Z6 R; r: E
4 U ^# o: S& n4 d
" a1 x) ?5 U0 d- j2 `- d // 清除 UART2 系统中断6 s! M* }" G) }5 |$ ]) }2 i! S! q- A
IntEventClear(SYS_INT_UART0_INT);
+ }. D. h4 b; u% s* w
+ ^; |7 P* j5 h1 u // 发送中断
6 K' u. v- Z1 P* [0 o if(UART_INTID_TX_EMPTY == int_id)" \( {+ [5 J/ r5 `3 ?) a% w6 \
{
+ ?) N* u- }! @- g" Y. _" i7 J if(0 < length)
6 r7 k& u' m# _ I- y {
+ b3 N5 K# `+ M& c8 P. [ // 写一个字节到 THR5 e( y3 u+ B3 C8 I3 L0 Q4 R
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
! i O. q. I9 ]9 w& Q8 N8 n' d length--;
9 _: A2 {3 \) x' C6 e count++;
* `! q1 {0 A1 R }; M c! _- Z5 r* }% o5 q0 v
if(0 == length)( ?2 n: t0 [* m% ^
{
h- U: e" x, Q4 Y // 禁用发送中断) V5 e; Z0 b" E: b- G) Q- [
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);4 C) Y: K' i9 e% Q+ b: N
}
' Y4 `# I4 o' n" G }. P- E6 ?2 z& j, p0 m- L' p
' l9 k" }! `6 J- c0 {; U& D; r [ // 接收中断' J; N' l2 o% \/ Z
if(UART_INTID_RX_DATA == int_id)4 @' o% G* J6 m! J* b1 t
{
0 U$ \$ I3 X) ^# R5 G( B1 |% h; c- V if(status_a0==0)
( k3 l' Z( A7 ]9 X. i1 p5 u2 e {/ h* E: ~6 N0 x; p+ g* n& @& r) K- }
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 a$ W7 _( ~, S" }, R if(a[0]=='#')
( Y4 b6 T* w- r6 O {
6 J- c2 x7 z% T3 K status_a0=0x01;+ r' X- t/ q. P& K6 L4 {
status_a1=0x01;
3 {6 L1 S, I, M* y }6 a% S: v3 ]8 j) a
}
6 r/ x; j. k- i if(status_a1==0x01)
" g. ~ ^. e9 X* c& q {
8 F/ V! o* P p) W7 H a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 D5 d( }2 `* g" W) M
if(a[1]=='R')
: I% A5 C5 q7 N {
" m8 h7 A7 k: I( E9 z7 | status_a1=0;: W0 }9 E G# J5 O1 o' q3 L
status_a2=0x01;
8 ~0 b3 @% I1 v& @4 R' r }
0 M6 z: n4 p* S9 ?3 W }, j f1 k+ {$ y% X- ~9 G5 x
if(status_a2==0x01)9 D8 `( C p2 |8 l
{
$ r3 `, V# \8 T a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! t' Z- F. B6 o% ~1 k
if(a[2]=='A')
1 X$ f7 `" e7 _4 p9 S* O1 W3 L7 b/ B' e {& h) m& P2 y2 m. k1 y3 J: ?/ S2 A
status_a2=0;- ~0 z6 p5 i! ?9 b" R
status_a3=0x01;
) g9 N6 B) q. E+ |' g }9 E, N, S* I, R! U
}
1 t3 w) d' ^1 x6 C( x4 G# Q if(status_a3==0x01)
3 K7 M: }2 O* s1 q5 D {
9 n5 D( i" M6 R2 M6 @5 Y a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% e, ], j) ]4 _, A/ ?7 z if(a[3]=='N')
7 u# H$ m, \3 D# Z) C3 { {
& F& k v+ N; s( ^ status_a3=0;* ?) E6 I& `% a" o
status_a4=0x01;
4 }4 P) |& |2 Q% W5 K5 a0 ^$ P% m }$ V* U& E" P4 p
}
7 Q. c/ Y. L7 R: s8 a if(status_a4==0x01)
8 s9 {: Q; Z- L0 `; g7 g* Y {( s; c3 Q0 ^. q+ E7 _3 k9 G7 Q" _
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 d* R1 l# E& g, ?% ? Y if(a[4]=='G')3 L! A3 \- ^( ~; f1 ]* X5 E8 D% z/ q5 y
{
. g: d! _/ n" e! D status_a4=0;6 R3 h+ B' z! l$ x/ Y% k
status_a5=0x01;' b' h# x/ R8 |! I+ O" K; k
}
' u1 M) ]$ m0 C }7 f8 G+ F' p+ e% t' ~; Q2 O0 B" Z% K
if(status_a5==0x01)
; M( L2 ^2 V ?) ^* H {- Q8 M( e2 l9 }: R
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 Q$ P2 o# d& S# ^" }; H, ` if(a[5]=='E')' b" M. k; P7 L# Q# P6 x" t
{
2 C/ l1 K! f" Y! g6 R/ Z status_a5=0;
5 L9 ^1 `" ^! @ status_OK=0x01;3 C% K, L* o3 D* y! |9 \
}
" `. c* {0 b/ k9 m: D" w: }, g* A }' P/ N7 F$ X# M4 [ F' W/ R* s
if(status_OK==0x01)* @; G3 z6 W: A( T) S8 k
{
! t% g/ x& l& s2 i; X% i& i9 u& z; R rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 e/ y' G* i6 F+ }; L- G# _
lengthrx++;% i8 X/ R" d. ?
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)9 o+ m0 f1 j# i8 q$ o1 ~- {
{
3 t0 ]9 ?8 [) F3 W RecState=0x01;1 \$ a- @6 `; X% R( i& ~' c
}4 _3 P. B- }6 z
}. b. v# ~! \$ F" z* C. i0 h+ t1 f
D2 T$ [' m* ]" |$ z. M
}
8 s- v7 A2 W. B. s, B0 G8 k* O5 c" Q2 r# Y# r" \( x2 ?
// 接收错误
* ?2 o1 n& _- z- C/ Z- m if(UART_INTID_RX_LINE_STAT == int_id)
7 d9 z. p# u8 J; A+ M {1 [8 U- p/ F7 X3 M' L
while(UARTRxErrorGet(SOC_UART_0_REGS))
1 |9 V0 H S I5 x; ~$ U {3 Z; C( |) c8 _+ f6 b
// 从 RBR 读一个字节
6 {% u3 {+ @5 ~6 _3 m8 ` UARTCharGetNonBlocking(SOC_UART_0_REGS);% U+ B& H3 ^9 ]$ R+ l6 D7 B
}
- I9 b& ?- }% g1 M( n% y }# _; e' L' r1 g$ @6 i
" N0 J. a; n5 S9 f+ ]/ n- \* B return;
/ s+ C4 x" { `4 i3 L- ~# Q}
# ?5 F' M/ P/ j& N; v b
% A% I4 ^. v" A% Z8 a/ Y4 R |$ U( I& ^. D
q8 w3 m% |) L7 p O Q
|
|