|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
, j' i) x3 r" I# Y# _7 u. Y我是在DSP初始化这不太明白。& [* f) h. y3 E$ |8 q" h; q
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
- k. O0 {" J# P- [5 T
0 S1 W+ c1 B0 O, D1 Q8 B$ p9 x* f/ I/ w* j' |* U
首先 PSCInit();//UART0使能! M9 c5 K6 {. a( E
void PSCInit(void)" }% J+ ~6 @" {
{. H v% J( X. X7 c: c
// 对相应外设模块的使能也可以在 BootLoader 中完成
, }/ O% j' x. j // 使能 UART0 模块
- @0 l {) c; M4 r PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);9 a1 j4 K% O: a a1 x& i. ^1 u0 {; s
}4 m; b' Y: s4 W
9 t7 p3 I' V, o' i5 K& g# l% ]2 q& s4 T! n V4 k
然后是 双核通信的初始化 AppInit();) ]" ^" X, {0 ]+ x( u4 b5 v
void AppInit(void). n' B* X& I$ g2 [
{
& a" a/ s6 d1 t( X! M3 m+ C /* Structure to initialize IPC (see Ipc.h for definitions) */+ F# q* I& B# n" q
struct IPC_cfg ipcCfg = {
+ k3 \1 d( a: T4 g IPC_DSP0, /* local processor Id */$ Q2 i$ t! |$ ~
IPC_ARM_HOST, /* remote processor Id */( h/ L% Y0 g3 T% c7 `5 Q1 i3 U5 R
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */; Z1 O+ M% w6 U4 n ?
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */! `2 G' [! d) J
NUM_MAX_EVENT, /* maximum number of events to be created */
$ J9 Z' V3 o ]9 E6 | &ipcPvMemDsp, /* local side private IPC memory */
1 W( r; l5 @/ K, v3 Q &ipcPvMemArm /* remote side private IPC memory */
7 y7 |/ c2 o+ \( r9 t };4 ^: |9 l9 w- C, O/ V+ ^& m5 k
IntDSPINTCInit();
2 l3 A- r; `7 Z: b K IPC_init(&ipcCfg);, T$ [: @2 i2 S% f
IPC_intRegister(C674X_MASK_INT5);
4 t5 n4 j$ r9 J: v3 c iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));6 ]1 h2 t. C+ w$ L$ h
" R8 |1 P2 Q$ ?# w$ M- ^
/* Enabling interrupts for DSP C674x CPU */* _1 E: [8 U$ J# c
IntGlobalEnable(); /* Enable C674x global interrupt */
9 U! K* ^3 Y2 a$ O' a iAssert (Notify_start()); /* This will enable IPC interrupt */
5 Y! z% c( L T+ e1 m" Y9 V}' w; _/ Q9 V9 k# T& k
9 E% a* w' v. V, S" H' c2 |0 b然后是
4 A1 P! [$ }# [/ g2 X0 { // UART 初始化1 W5 G2 y9 t) M2 q4 h5 e
UARTInit();. S9 x/ a3 n! b* Y9 R- j! M
/ a, l9 n1 V+ s" T' ~0 u" p
// UART 中断初始化2 S; D H% i! t
UARTInterruptInit();: S( l; q/ f- M! O
* B. G. r L2 w4 I: b4 t, b _
9 z! W" ]' s/ {. S- J8 G- R5 R: _void UARTInit(void)% y8 U! f+ \6 }: F$ O( N0 t; R* v8 ?
{: e6 o' x0 p, E. x
// 配置 UART0 参数) f/ { u$ w( M2 s
// 波特率 115200 数据位 8 停止位 1 无校验位
* `& Z4 L/ F& F, m UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200," R. }- |7 \9 x! Z
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' ?# ?4 `5 e& J2 U: u. _
// 使能 UART0
I0 I* ?/ F- L0 e UARTEnable(SOC_UART_0_REGS);# t3 H4 [# J) L, ?/ J3 E9 F
) |1 }% O5 m0 V5 I) N' n% B // 使能接收 / 发送 FIFO
, F9 V- @" R: T) w& O3 G% f// UARTFIFOEnable(SOC_UART_0_REGS);
+ E" h+ t; m! f7 I N; m) P7 X: L8 {( C. h. ^; P/ j! p
UARTFIFODisable(SOC_UART_0_REGS);
y( {8 [; t; O/ z6 z0 r+ X5 f! }- ~( Z
// 设置 FIFO 级别 接收FIFO的级别
) L/ g0 I4 ?/ y' S2 E// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
: X% P& E1 F' Z n0 A}) x) A/ @( @ D$ o* O1 T
1 n' \' [: G1 s; V
Y' {0 q" {6 U2 l4 X
void UARTInterruptInit(void)% ^& T$ n3 Y) i- M
{9 y8 [* h! f* S9 l# s
IntRegister(C674X_MASK_INT4, UARTIsr);9 Y9 l" J/ d* f- ?* l6 d
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
2 ?0 z& p6 M; H2 m2 B IntEnable(C674X_MASK_INT4);/ X, ~$ S% R! q4 F8 L3 I
7 ~* Y) X6 ?% x& \* P/ B // 使能中断
6 X- Y- |4 k5 [ unsigned int intFlags = 0;* m; I9 \: r' D. P
intFlags |= (UART_INT_LINE_STAT | \! H: ` i' J [' g% p
UART_INT_TX_EMPTY | \
% K6 G% s- q$ U _, n& v UART_INT_RXDATA_CTI);- K" M" g, \% A2 n* [8 _1 @. R
UARTIntEnable(SOC_UART_0_REGS, intFlags);
- C' S; T6 V# A, k1 b! L}
3 c# }% v* g( M# S, R1 G: Y) ]- }" _9 ?3 I& ]- {# p0 F( {! }/ A
1 g' u8 t2 R0 v8 U' ivoid UARTIsr()- b, I# D& j6 D: q, ?
{; t+ A3 I2 X. D* s/ s4 F5 m
static unsigned int length = sizeof(txArray); o5 @+ c" h; Z& d8 u7 I
static unsigned int count = 0;7 G }- \$ @1 N6 K: E
unsigned int int_id = 0;9 H. \4 F* n! d- a9 Q
2 @3 }, r. d& l! Q3 D/ J$ a/ q- O$ X, p: C+ E
^3 W% ]( ^$ \1 P
// 确定中断源
' R o7 [' b7 k$ A( E6 m int_id = UARTIntStatus(SOC_UART_0_REGS);
+ p- H% ]- v; ^, u% f
( E% _: o. g/ N, t3 t // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。& S/ ~+ o5 z Z0 e b( s
5 ^# b2 O+ r9 q7 U
! c! Z+ V. u( J, X // 清除 UART2 系统中断& K" y6 y: W+ \8 L/ r! n
IntEventClear(SYS_INT_UART0_INT);
) N; h0 E+ L! f- ]8 \) J
, t& N+ v7 r* h( f6 H) W // 发送中断
7 P, J7 B- p: Y if(UART_INTID_TX_EMPTY == int_id)+ M1 n3 T1 y$ A5 q1 \ k
{$ J0 ]( v0 X! G4 X! {. Q
if(0 < length)2 q v2 n; q+ n. b6 H
{) i$ S# {+ ~: W' N7 q" {9 y! C
// 写一个字节到 THR8 [4 L5 k, `# i5 E' h
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
/ b- u/ h, F( D' H7 D9 y8 b/ K length--;
- W) s8 g% u% } count++;
; S( g T- e8 ]' t0 F }8 O) E9 o/ H8 M* A7 j! K& E }
if(0 == length)
3 W3 I! B' T. P) i/ l0 c) F7 c9 X {8 r5 T2 e3 g) ]- w4 c8 d
// 禁用发送中断
% }" _ ^2 ^) g. E UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
2 E) n6 J5 g3 M( U0 i l* Y }/ P4 \& w1 h2 P8 l6 F3 X: H9 r3 z
}5 \# E! ~/ {6 J/ n/ g- d
1 u# f, ]7 A$ C
// 接收中断$ c: l! v" y3 Z' Z2 m" H" Y+ B
if(UART_INTID_RX_DATA == int_id)
, H2 i4 s; D! c, @, R9 @ {! s& ?/ w$ D6 D5 {# A
if(status_a0==0)
5 w+ d f5 R- N- u) c4 R. ] {
' C( |2 B( E0 t5 b( ?8 p a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: j) q* a8 {3 \* C& _- ~ if(a[0]=='#')+ { f L# X4 \0 B8 D
{
6 V7 ~6 V3 r5 x6 F status_a0=0x01;" l# M- d. P3 Q! d4 ^
status_a1=0x01;/ m, w' k9 f+ O1 s: K2 a
}
1 Z. L. L+ q$ j7 S4 N" r/ f }
) m$ R% X. k* G; {+ a if(status_a1==0x01)+ H/ R- A; N3 c3 O: l1 c
{
& S4 k& C. r' ?- c% o( o) k& `4 R0 ^ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 ` b/ R& l) Z" ]0 t if(a[1]=='R')* P9 \. c" @; u- _; ~
{2 @* f+ s7 R1 A' N
status_a1=0;
1 G; W1 ]1 \% U9 h+ {. i- M status_a2=0x01;( x* R Z% r3 F: } ~0 T
}
. X# }0 D0 T; R$ S. g* ~0 s; M }
; w' R! t- I& Y3 b/ {, W. X if(status_a2==0x01)6 B# x C' k4 r* S5 f
{
* Y# K4 A( A0 W, ?' v a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 T" f% a; C( H) L. s1 |8 M' i if(a[2]=='A')
+ j" i* V9 N7 M9 e- p2 E {* k1 Z {
; X) e. Q. U9 r8 R6 K4 U$ O' [ status_a2=0;, Y+ S, C6 a% e/ y3 I& s
status_a3=0x01;
$ s" m! ]! g6 z' d7 T* _5 \* ?! C* B+ Q }
$ h0 K! |* L- [6 X: { }
3 m$ h0 H3 ~; w- w4 `$ }5 `% R2 { if(status_a3==0x01)
- p" L1 C, ^: A9 ]! z {
$ j( U C9 D* S# C a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 n0 m: u' b; Z7 y
if(a[3]=='N')
: d6 H3 v* n# B2 u5 k {
" k! {+ s$ [. U; { status_a3=0;
7 D* j+ w) |. {; ]/ E8 d9 D7 I# { status_a4=0x01;. s1 H! f: N- ?% z! @2 w; X7 \% @1 y
}
3 t$ ~$ X2 w7 h) j5 y }
2 _! A' d! D# t* B( b. d3 x. B! M if(status_a4==0x01)4 u; s5 [% l8 z K. z( u
{
( X3 \/ R/ k* N a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) a# Q, e4 U* z- Z$ Z if(a[4]=='G')9 u% t8 p% N. w" P5 L. R
{
; O& W& J2 a0 z status_a4=0;$ ~4 c1 k1 h/ g; I
status_a5=0x01;9 P# l0 b w! s- k1 j
}7 o$ t' N* c) I: {
}1 p; G, g- V& J, p. Y9 [
if(status_a5==0x01)
: f4 t3 \) {9 G7 N {7 D6 w" v/ r; y& \% D
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 F. ^1 w/ {- W2 W& G1 S
if(a[5]=='E')
: u: J9 f( i$ I/ f& w( s {+ K/ b1 e; L7 m6 S" V1 }* o
status_a5=0;, N5 g# K' v) ^' m A! ~* j# J
status_OK=0x01;# Y7 C- f) Q' X9 k" l. \
}! b: l+ i5 P! Z9 f2 ]3 ~
}4 ?# g4 ?7 J6 y7 H, f
if(status_OK==0x01)+ J3 m- }2 l) ~2 }; I7 q- f
{$ u, g5 Z' Y7 X8 R
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 T, ~( U5 x, e lengthrx++;1 t8 h# _$ P6 ^+ A7 P- U
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)$ s" `) Y8 k7 F
{
6 I$ V2 p" X% A& J0 c5 ] RecState=0x01;+ g0 z& S$ p' n5 `3 P
}
6 s- E8 c( F: u( c7 o }6 |8 U7 E( B. c
2 ~7 ^3 t7 a( ~. o, \
}
5 H* Y. u/ K0 K, S* e/ E
; X1 G& N% t3 C' N8 W$ V // 接收错误
' p0 N4 J( r5 E/ Z' @/ w6 P) K if(UART_INTID_RX_LINE_STAT == int_id)/ r4 N1 W4 v+ X& }, _3 r
{* T& k4 n, k, }* C" `! I, Q T- M
while(UARTRxErrorGet(SOC_UART_0_REGS))& g2 k- |0 k; a6 {, j
{
3 R1 z( I# O/ x% }# G# t // 从 RBR 读一个字节! z( h6 x' j* O$ f5 |! a- G+ r
UARTCharGetNonBlocking(SOC_UART_0_REGS);2 W! ]; w1 T- r/ }
}5 R4 o4 ^$ R: H6 w% }' q9 Q
}* `) S8 E3 ?+ [( F
! h- O w: F- h3 P9 H5 X( g return;! `9 o E, h% e" l1 V- \
}
# L: K* g* T R2 V6 R# U/ J* Z6 Z, f
+ z, n' U/ O' W" S% p
' @ A: R5 ] y4 k* M |
|