|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
- h6 @2 f' r2 z1 l我是在DSP初始化这不太明白。! D8 O: V# `+ H
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。+ h+ ?- j4 G% j% |: t" r
5 `% z1 `" g. G+ _ s8 S/ ~9 O6 u
. x. X; ~; ?5 B4 K. r首先 PSCInit();//UART0使能
$ C! Y+ J9 ^ t; F' L- Vvoid PSCInit(void)
7 ]8 ?; u. P( A r1 N6 [{1 G6 A/ d% |6 S: k
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 ~1 g% F* a% w9 @" e# m! _( L // 使能 UART0 模块
+ _- T" @- N1 C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* \" k7 ?2 E5 x8 q6 B1 j3 l}! b' S f) c7 S
2 I V3 E/ _$ [; ^& g. m" f9 k+ E) P
3 U& M' H a" B1 P% l i1 o7 M然后是 双核通信的初始化 AppInit();
7 H2 c! Z. N# R7 ~* rvoid AppInit(void)# |) Y- Q8 S5 d; k% m9 G
{
1 I" s6 s; p ~ t$ x2 Y /* Structure to initialize IPC (see Ipc.h for definitions) */4 [' t" o$ |' @8 ]' V7 a
struct IPC_cfg ipcCfg = {3 d$ a$ g I6 i
IPC_DSP0, /* local processor Id */
9 q- L. w1 C# y% Y( L IPC_ARM_HOST, /* remote processor Id */. W- j A2 M- `( J1 K5 ]) s' h
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
0 @# G$ L3 S7 l2 U9 i H0 ~8 ^+ J; B IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */( |5 {& @! x" I8 c$ j! J
NUM_MAX_EVENT, /* maximum number of events to be created */- f. i1 R+ Y F1 y `9 O
&ipcPvMemDsp, /* local side private IPC memory */' I7 Q# A: B; Q- F: h7 o/ D
&ipcPvMemArm /* remote side private IPC memory */3 @) B7 H. B9 ~# \9 @8 s! P# l
};* `, ^9 z6 j1 y. `
IntDSPINTCInit();- l3 L$ x$ ?+ [1 _
IPC_init(&ipcCfg);
" O9 x6 I1 T% V. @ IPC_intRegister(C674X_MASK_INT5);. _4 H8 a5 n1 w" J
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));- J2 G+ _2 T" S# ^* v4 p
4 y0 H' c& j* W3 p' r /* Enabling interrupts for DSP C674x CPU */. M' s N D9 E0 e' ]2 E8 N& w# u
IntGlobalEnable(); /* Enable C674x global interrupt */
7 z- Y5 B' x S! j& U: X2 s iAssert (Notify_start()); /* This will enable IPC interrupt */8 M4 a2 R. G$ _ E. b& w& a$ A
}
' I0 D' d1 m) C! j% t% y( S# c( Q+ N0 h
然后是 $ n/ b6 o- ^" q, `
// UART 初始化- T$ y! y6 Y1 ]1 Q+ b/ j8 M
UARTInit();
. ?, M+ g6 m( Q7 B6 A* v1 t1 O/ H# ]) G
// UART 中断初始化
' ~/ p2 E2 H$ s9 i7 ~1 i6 A# R UARTInterruptInit();5 V. C2 p t; x: ? ?, ~
, {; _ Z s: Z
4 x. l( a" ~0 \: [1 _void UARTInit(void)
! C2 S' J! c2 C S{! I* d% u S6 V- r! K
// 配置 UART0 参数! a' r6 j) i2 \& t: j0 N" q
// 波特率 115200 数据位 8 停止位 1 无校验位. Y1 Y. H6 q, N5 K
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,5 q* j) E- i+ z7 H5 S$ ^
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
B L+ j X& a8 F. }3 J/ R% H // 使能 UART0" t" V$ d. x2 W% [6 A
UARTEnable(SOC_UART_0_REGS); v) y+ L' o3 c2 X) V! U, m
! {2 X: c3 b0 Y, ~5 } ?0 H
// 使能接收 / 发送 FIFO& C6 E' S! S0 b; ~
// UARTFIFOEnable(SOC_UART_0_REGS);
2 c# r/ J9 r9 o! o$ b3 r l6 Q" X% J2 V4 a
UARTFIFODisable(SOC_UART_0_REGS);
3 N/ h( H: h; _: N' n2 F7 }, O, t# S) _4 U- N& Y/ n4 J
// 设置 FIFO 级别 接收FIFO的级别
/ D, o. l! Z! y6 F' K$ H// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. N# C, u1 Z$ B; i/ v/ E3 x
}. a* F6 u% _" `+ M7 I( M9 B
. T5 i7 t1 d4 r0 O" C
$ _: q& _2 h7 o# m% v, Kvoid UARTInterruptInit(void)
# B3 O- I+ U$ h5 n% z{
5 ~* i! q. @. O IntRegister(C674X_MASK_INT4, UARTIsr);+ I+ F' r1 n) P0 }
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
! I- S8 X# [7 H7 J IntEnable(C674X_MASK_INT4);
. o/ v. a5 ^1 r) ?) w( _, S( h# ]
9 e% Z0 I& ?1 h, T6 A8 S // 使能中断
: z0 G$ A( }! w unsigned int intFlags = 0;2 T0 O$ K% a5 o @9 u6 V
intFlags |= (UART_INT_LINE_STAT | \
. q" l) N4 D- o. i$ ?( G- M, Z UART_INT_TX_EMPTY | \
9 Q% ?6 P% K8 l/ {4 E) {% B3 v UART_INT_RXDATA_CTI);2 z S% X- p. ~0 K/ N9 Y$ Z# ?
UARTIntEnable(SOC_UART_0_REGS, intFlags);. ?+ h9 L: @; o
}# m) ~2 m- h1 U
3 {1 L7 r' `- J8 t" ], e- x; w' o
- W5 H; i/ Q) I
void UARTIsr()
6 w) B9 f7 v2 K) e; M R{
5 x$ q5 g, c: h& ~ static unsigned int length = sizeof(txArray);
8 a' n+ \% [$ Q+ a0 h) }. X' ` static unsigned int count = 0;" y' c* H1 m# ?2 P# E8 }
unsigned int int_id = 0;
9 u R& N9 ?0 s3 Z" o: K+ K1 H2 m) Q- N
2 `$ R, A/ I1 ?' E+ w* C4 j5 t% L
' V, ^% g" b! s/ u7 |" }
// 确定中断源
' c3 F' g+ H3 `1 O6 N int_id = UARTIntStatus(SOC_UART_0_REGS);
& R0 p/ {: e( u6 D T* j1 E7 ~$ t1 t5 g) D
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
4 ^. @2 y- r$ v2 g
3 ? @1 F( y6 l- }; G8 j, q: J; {# i# d2 D( d
// 清除 UART2 系统中断9 O& O' {6 w0 i7 O' R
IntEventClear(SYS_INT_UART0_INT);5 X$ U) [2 ], d1 L
6 g+ f ]$ a5 V+ Y5 s6 N' f // 发送中断
( k! C9 h$ ?! Z* B if(UART_INTID_TX_EMPTY == int_id)
3 \$ i. A; H. p8 `( F {
/ ~/ q8 I/ @, d. }. W if(0 < length)- A' Y" N [8 K% q) d, M7 [: S4 |
{
+ S% J3 ?+ B, A$ m6 Q0 D // 写一个字节到 THR- }$ O" v5 A+ c% z& v# U. }
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
9 l7 O6 F! p( d9 Q; j( M' p length--;
8 a1 i4 E* W: m7 v1 v count++;% q7 ]% V* z# q7 r- ?) z
}
. A( X- `, ~' D, S( R" b1 @7 h if(0 == length)
/ L) t. W' E3 \- P/ @; b {7 G1 |9 \+ ?$ D3 [1 r d$ s; b
// 禁用发送中断
( x( ]/ F! f9 l. u# [5 I5 b UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
; N# J/ t1 p; Z, Q5 c }4 w% y6 z7 a$ h8 d! h2 F: L
}# Z# {7 v" j" U) r7 {
" b& F3 {* {! Z4 G+ `* r: V" E
// 接收中断: q3 @/ k( T0 c, u
if(UART_INTID_RX_DATA == int_id)
0 s8 ~5 ]; X' L' f3 Q {
" n- a; X9 Q: W) y6 A) R. w if(status_a0==0)
" t, o3 |1 p, e! k/ `' I U" u {
$ E1 m2 I; t$ l! |) a- T9 S& a a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS); P1 X: Y' Q# ?( c3 M- B/ l/ p
if(a[0]=='#')
/ ^7 w- P6 G! {$ I% L {2 a R7 e$ W! ~. e/ {/ I ^
status_a0=0x01;2 }* F( o8 \! |) l7 |7 G# h9 U8 L% g; Q
status_a1=0x01;' W. d9 U5 n Q# G# D, T( @
}
* @& a" W: j! A0 b4 N }% t* t6 y& E( p2 G# k% |& Y
if(status_a1==0x01)
4 z. i7 j0 y1 C& N {
4 c0 I8 k7 b6 B7 T a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);. \, b' \: G2 ~3 N- I: Q
if(a[1]=='R')( n( r$ H" X! |! T7 g- J: o
{1 k( X- o0 ?# b; \" R& S
status_a1=0;
4 d' y7 e. P3 X# s5 ` status_a2=0x01;
4 Y2 t9 p$ A5 G6 a: l }
- E$ o- a1 C2 ]+ O6 G4 S }
6 `% D4 t _4 h8 |4 R if(status_a2==0x01)3 z/ p' X* z* y. L# c
{
$ D0 ^) N* l2 F5 b4 e- e a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- d! V; l/ X& A( }1 A5 R) D8 a
if(a[2]=='A')
1 j6 x4 N6 n: b" Q P {
7 `+ Q) Y9 |$ v5 D4 s. | status_a2=0;
' C0 Y& V) P {+ a1 f! V& }# S status_a3=0x01;* i) t$ ^$ `5 m8 e( T
}
9 ^7 ^- E9 S) V }. G s9 i: N6 S* v1 k6 X G* t- F
if(status_a3==0x01)" R1 E3 O: J- }6 [
{
$ ]( b- z( H& [ a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, r; R0 F$ I; }8 s
if(a[3]=='N')! j; f! T" [1 e+ V9 h+ M& s: t
{7 w' O+ t5 q( n! q& ]" D. v3 C
status_a3=0;
5 r0 F6 d; c/ _6 V4 C9 R; k8 ` status_a4=0x01;
; U4 s0 O5 f! O+ k2 ^ }
/ G3 g, W3 a: Y) U4 P }
/ P$ S9 [- t* {& l4 }4 r3 G if(status_a4==0x01)
. n: z+ i9 @* f: Y {
' n9 U( m8 X* n/ U, d a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
P K6 P3 J4 z if(a[4]=='G')$ M! k& ^7 Q* k2 v" T
{* x4 P" b; A( {4 G+ l
status_a4=0;& r6 _* _' W9 V, O
status_a5=0x01;
' ?5 C7 ~8 l) @+ Q- X3 @ }- V; ?' }# R4 v. Q/ \/ v( D' ]
}
4 C9 h* q" V& x3 T4 V if(status_a5==0x01)9 _" M$ R3 d& I- F
{- `& {: ]2 ?, q* m# |
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ z. z4 E0 u9 s8 `* ^
if(a[5]=='E')* D2 V7 E- k4 o5 w2 ]8 Y
{" k. y t' T" C& J0 r
status_a5=0;
. P. |$ x; E& \. @. j: Y, J0 R* ~ status_OK=0x01;6 M$ q6 J- a6 E
}
* L# b2 y5 ^4 d/ W O }% ]) i3 e' v* Y+ ~6 n# l' t8 y9 N
if(status_OK==0x01)+ D- G4 k3 \4 e' B
{
5 K2 N- i# a7 e3 V4 M/ {/ M3 I rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" t' ^+ Z& V/ n& E7 a1 [1 q/ z. X
lengthrx++;
2 q* n/ A& u; o5 Y# J. Y; O4 q if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)0 ~& B4 @6 N8 l' [
{
1 O5 x4 z0 w m1 q' W! |7 J- u* T RecState=0x01;
* Q" g* N& M! w( C `0 c }
% ^; i' r: ]7 d, U' _8 ? }7 ?% m, v; N* p6 R+ Y
5 ]2 H7 M. f& z8 c$ {* o
}( F; P! q ~- ~5 Y$ R
% G+ e, W) b A) a1 q // 接收错误
/ D2 X' \/ n. y2 G8 k, Q& w8 u if(UART_INTID_RX_LINE_STAT == int_id)
/ ]/ g5 n u$ N& y {8 ^* Z2 Q! O& E) o2 ~
while(UARTRxErrorGet(SOC_UART_0_REGS))
1 F. x* ^3 N8 a8 k1 F {. s- @2 n3 e! t/ X9 G' x: |3 R
// 从 RBR 读一个字节
l! L2 k( j- [3 _# K UARTCharGetNonBlocking(SOC_UART_0_REGS);' g7 [2 g5 H; d% H
}
9 ]8 j: ]0 l( `: q }
0 N) l' j8 F4 E% {2 g
7 I# i: G& V1 X6 n: t/ T return;6 n( N* q# n" o! N. I' g
}; l* g& V* q1 R$ ~
i% Y) F0 X" F/ Z
7 ~2 C/ t- n9 @" s' z* _
0 h; T. p5 K/ r
|
|