|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
+ h; [2 N/ ?6 h我是在DSP初始化这不太明白。6 u/ f9 R0 E1 U
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。; N' |+ s5 D8 @8 c0 _
' G* z9 \9 k7 o; C) Y/ s3 p
6 W3 ]6 J2 h( N
首先 PSCInit();//UART0使能2 b& p) _+ G& t) ~) w* B
void PSCInit(void)& R/ @6 @) Z& _/ R9 ^- n6 l
{
1 T0 l* O6 P; v9 f- p& z$ c7 d. q1 h& x // 对相应外设模块的使能也可以在 BootLoader 中完成
/ s6 i" |# }3 V) M0 M // 使能 UART0 模块
* w' l. `3 ^: P PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 S J' b0 U3 r( a}
* k' V( @" P" }: o9 p9 ^
( N7 S3 H6 ?6 f# i. w
* E/ R- R' u: Q; E* i9 h7 W3 G然后是 双核通信的初始化 AppInit();
3 U' J; O7 r7 Z: z- G7 ?void AppInit(void)
7 @% T2 C5 ~4 m1 g{, E C5 N+ }' I) \6 H
/* Structure to initialize IPC (see Ipc.h for definitions) */# x. ]0 R- G* n
struct IPC_cfg ipcCfg = {
% N: F, n. o% O) P& [4 n IPC_DSP0, /* local processor Id */
% A! {1 Q- g2 b ]0 L IPC_ARM_HOST, /* remote processor Id */
. D1 }* D# E" J a- v- K IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */2 [1 m5 H3 @! t
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */5 y) s5 e, q1 k# A8 J5 R7 T
NUM_MAX_EVENT, /* maximum number of events to be created */* C5 R) M4 V% b9 M
&ipcPvMemDsp, /* local side private IPC memory */
2 i/ Q6 d1 y# P, |3 `2 k &ipcPvMemArm /* remote side private IPC memory */9 ?% O7 h* y. i
};
2 \: T; R; o3 M4 g IntDSPINTCInit();# s0 r) W) s) R- d3 y% @: H' K, c# n
IPC_init(&ipcCfg);$ G( C: W% M$ D. v1 t0 \
IPC_intRegister(C674X_MASK_INT5);! {8 m/ O, `% M
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
; ~; m; i% s& D |4 d+ ?) L3 V, t( C. }
/* Enabling interrupts for DSP C674x CPU */
3 `: l0 m9 i. {7 G0 z IntGlobalEnable(); /* Enable C674x global interrupt */; Z! j/ ^- c' @
iAssert (Notify_start()); /* This will enable IPC interrupt */; O! T% |+ X- K( u' \3 g* G
}
; H- w1 g" T4 w8 P
d G) T# m" e/ ~然后是 9 A0 j. H( C+ w x& H# x
// UART 初始化! x+ z; } }# Z1 ]+ F5 D4 c3 L
UARTInit();9 ~2 I3 R( r8 `* ~' ]' i- k
; T* ]. w/ J7 D9 w2 o1 N* e1 Z // UART 中断初始化. y. D) p+ E( @: m8 ?7 M
UARTInterruptInit();3 y c) n+ Z7 V6 g/ o
2 [, l W8 Z7 C* g& X
7 }, g$ l3 t* s; A- O* V/ qvoid UARTInit(void)
- ]$ i; n2 J9 Q8 S{
2 n- e4 f" Z8 v. y // 配置 UART0 参数
4 G) r! b3 r( `& q! @' c // 波特率 115200 数据位 8 停止位 1 无校验位
; K2 w" ?: j6 a UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
$ \5 |) _5 V) d5 U UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
8 G7 A3 x; i% F( R, m+ z // 使能 UART0
3 \/ z( Z2 ]5 m J! h; f: N8 p* b UARTEnable(SOC_UART_0_REGS);
# y: _. N/ S8 l q: C
5 q& C/ M! Z% \0 q4 { // 使能接收 / 发送 FIFO! }2 H: b' B3 U) I2 s2 ~+ t9 e& [
// UARTFIFOEnable(SOC_UART_0_REGS);
. G8 ~& k; x1 J4 P; X0 y% ^$ T y" f
UARTFIFODisable(SOC_UART_0_REGS);9 s/ o0 I+ L. R
H# q W$ R! {7 n% }+ y4 N
// 设置 FIFO 级别 接收FIFO的级别8 }8 b3 R! `# n1 P( K8 o4 M
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
- Z1 e( x) T8 H' O G3 o8 m}1 P& @# @9 f4 N! B6 D6 y K
, e8 M& m9 @! u( Z
6 U& }7 ^; l3 U9 y
void UARTInterruptInit(void)
0 o( j2 A9 h; ]% M7 b2 \{" }0 _; \: X/ d
IntRegister(C674X_MASK_INT4, UARTIsr);( r$ \1 v6 k! ^+ q S! g: m
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
& J& }6 G/ v( Z& e IntEnable(C674X_MASK_INT4);2 |- Q" o! j1 w W( o: o
: Q% m( R6 W# P( @
// 使能中断" W- [$ P6 {1 i6 ~
unsigned int intFlags = 0;3 ?: c7 n2 {* z, G
intFlags |= (UART_INT_LINE_STAT | \ r& t3 a6 K ?0 i; Z
UART_INT_TX_EMPTY | \
& C9 [: [% i! j8 o UART_INT_RXDATA_CTI);
8 q- n9 q" Y0 K% o9 q UARTIntEnable(SOC_UART_0_REGS, intFlags);2 C+ i* r% a7 {: F8 k! H8 V
}# e6 z$ |, N+ x) I) i3 J' q
' e( ^+ {/ u4 x- r4 F7 y
`' N9 H: K7 \2 F& P8 }$ a$ H/ L
void UARTIsr()
! Q" _/ s4 h2 u. J+ k5 k{
% B( p3 R% b' m static unsigned int length = sizeof(txArray);; |" t! i# N$ N7 v/ S
static unsigned int count = 0;4 A, ?, C- W3 ~6 H
unsigned int int_id = 0;
+ C; H R2 C- A$ T/ c/ R0 s, j- l
+ Q: G$ X6 A" V7 Y: ~' `6 l9 a! W5 \2 Q( z8 R
// 确定中断源9 m3 A3 R$ G# ~. d% l
int_id = UARTIntStatus(SOC_UART_0_REGS);* `7 I4 j4 i- ~2 a" B4 O6 y
! N0 D% t1 Z0 E* j) | // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
8 W9 m2 b: ?( e8 N9 a2 M) J* _/ ?8 w3 m5 i6 A6 H
+ }" ]3 t# ^& H/ ~0 r6 t
// 清除 UART2 系统中断
5 c, a$ k) h. B8 P! K IntEventClear(SYS_INT_UART0_INT);1 B. }2 ~ v1 U+ P' O
5 e* |$ C6 R9 X$ }1 |8 A% Z& \/ o // 发送中断
, `, h& [! l6 v, Q if(UART_INTID_TX_EMPTY == int_id)
7 u5 b/ L2 q& q5 g4 O* G1 B6 T0 c0 U {
; `) E$ M2 j$ [ if(0 < length), X) f9 l5 o/ U
{
4 n) x Q& @/ ` // 写一个字节到 THR
; c- {2 [% k7 B, D UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);# l: u$ c4 S. E' n8 w+ ?$ z
length--;
% S( @- @3 j! m/ S9 e7 G count++;& N+ t8 T1 I' w# g( A
}
* ]. s( F. J8 L if(0 == length)+ d( @- V( b) y+ d1 M/ }
{/ X% A5 E" @* h) H
// 禁用发送中断' L8 ?- O5 c& l2 l. f
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);8 Z% X4 x+ X( |/ b4 j9 ]
}/ j# F. M( q# m; Q5 _
}
, g3 A% J! w* E, b. G1 A
$ d0 M# l' O. w+ y9 J' {% w1 ? // 接收中断0 s" {! M/ N( N. y8 K
if(UART_INTID_RX_DATA == int_id)8 i% {7 S( K5 t; n }' q/ A
{4 q: U3 r ?4 r& c3 j
if(status_a0==0)1 d; d3 T1 E' Z6 T, J
{ u% l& j7 B- S& k# e4 N5 |
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% |! ]0 a% V3 _) K* b
if(a[0]=='#')
2 @4 Z }! S7 O4 F3 Q, D2 Q+ Z {
9 U! c2 U: D2 ]+ E- z status_a0=0x01;
% i! A4 E/ a% J- h& j& f status_a1=0x01;0 r: y& T' n8 a5 d1 Z& {( q9 ]
}
" l" {! {, u( n0 W) e0 A3 F }
8 W" R! g! ]9 {# v if(status_a1==0x01)
4 D+ q1 g7 l6 G {) i, q- V: ^' ]3 [& N2 p* q
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 W- S+ l2 F6 k5 C4 ?4 g( K if(a[1]=='R')
" f% i4 L7 z4 @/ ~5 t3 A {0 f/ \ D+ O1 M* ]1 {1 X
status_a1=0;
3 I8 f8 T( Z) o7 j7 |! ~" r status_a2=0x01;
5 r. V) R/ }; t8 s& m2 ` }
) M0 i- x! o" t/ f( ~" m0 e }- O& q' }3 E; c8 _( n' v7 o5 q
if(status_a2==0x01)& G2 Q! u5 T3 F8 [% X
{
2 s7 F2 Y1 P6 K+ n3 D" S6 Y4 Y. E a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) w& k( C6 [2 ^" n% Z; J7 E2 t( `4 G6 y
if(a[2]=='A')
" e3 Z* y' I, b2 x {
8 z# j+ W7 n$ K9 F% y status_a2=0;
9 l9 K9 r* X; @1 Z8 K status_a3=0x01;
$ w* ]; |; I& z; i+ C0 w* o }
) a. u- M( T x; | }9 Q1 ^3 N c* k# q7 U% e- L B
if(status_a3==0x01)
% Y; E% ~! @& s8 O L4 L {8 \5 f: _; Q7 O& r
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS); k6 E% C1 R( U7 W! Y8 D& ^4 U0 e# Q5 L
if(a[3]=='N')
) m b5 a% @3 d {- l {# l' @$ S# c% X
status_a3=0;
7 Y, [! ~% U, u& ]6 g status_a4=0x01;2 E: ]. _5 | C6 i
}
( M5 |4 b' Z2 { |" Y }
! \ ]/ w" @6 d; h9 `" i2 u( Q if(status_a4==0x01)
! `* Q& Y- k! c {
9 L( @) ]; B+ u; [ a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS); i& B& j) j% A1 b8 T% I0 f- h
if(a[4]=='G')
% E6 D2 G4 P7 {( Y {
( d/ p2 |% d" C/ Z3 X' H- i status_a4=0;
) l! z' O: a+ E$ { status_a5=0x01;
h0 P9 Q) y Q0 } }
3 D9 |3 Z) {' j3 v4 s* J. F2 d }
) s0 L. E5 I: H1 x# H if(status_a5==0x01)- t0 Q9 x: g' \: v/ t: F& ?
{3 E% [9 P: }% f& L O+ H4 Z3 @
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 @1 i0 W( M0 V$ A; @: J if(a[5]=='E')
; y0 [& R" D G/ u* } {
! Q" G( e- H) U status_a5=0;$ ?3 a! h% v0 ]: u+ r! l
status_OK=0x01;
9 M3 `3 |4 h% y4 V; q- Z }+ }- Q" D* y9 _# V
}
7 F+ L# ]+ c1 G3 F if(status_OK==0x01)
, x2 m: r F* ?4 w8 ~8 @# j) F, `6 g {; v; ] o% @. w5 u/ K& w
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 i( J& B. B; U/ J% q lengthrx++;
6 e+ N: w& Z: b9 ~% d4 n if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
- `5 |4 |2 ^ P, ` C- A {
* J2 S' B! `" L/ h/ |3 W8 O RecState=0x01;( m( N$ R1 z) V" g; j! r
}
. K4 Q9 B; Y8 g4 a }1 ] F x7 |$ M. p8 H
, F8 a/ l5 J; B$ a c }, T, q: L* ^, O# C( p
$ g) V# l+ D' t! V1 x. \3 B // 接收错误
& c" K7 [; D2 ]! [7 } if(UART_INTID_RX_LINE_STAT == int_id)" c' L( b0 i$ A G6 ^" R' w- V
{
2 V3 Z( C. S4 ?+ h& r while(UARTRxErrorGet(SOC_UART_0_REGS))( `$ N& }5 S( _9 u) T4 U9 [* Q! P3 o
{
% M$ x/ h! r* ~* w+ r // 从 RBR 读一个字节
: o0 C! }) y7 _$ { UARTCharGetNonBlocking(SOC_UART_0_REGS);2 @* x- U- i" v8 e% I3 U
}
$ u) p5 U$ n7 P' t8 B7 D1 h }9 P# [7 S4 I, |, L) h0 t
2 ~& a9 B. [( ~3 Q9 v& T/ y, L. [ return;7 a4 z3 a4 ~3 k Y
}
+ G) d0 o6 e- P( j
$ C; _- L* C) n2 Z; ^& K' J8 ]7 @4 p3 N$ }! U
% D% Z/ Z1 i$ { |
|