|
OMAPL138双核通信,现在需要DSP核中的UART0接口。% D5 t w+ k* L$ N% C/ v
我是在DSP初始化这不太明白。2 O" f) l$ B! R/ M: `. L! j
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。! E' B! p5 M- }! Z2 t$ Z
& ~! L- F7 w: O
6 B- i* Y- o4 p7 T/ s首先 PSCInit();//UART0使能- t8 W) k2 y" D0 S- k0 ?
void PSCInit(void)
7 [3 X0 f' D3 J) ~{
! `" T" V, b e2 X* F9 Y! T N // 对相应外设模块的使能也可以在 BootLoader 中完成, X: K- ]: k/ ^0 g# C$ n
// 使能 UART0 模块
: X- F' k# @0 g! C6 p( @0 _: j/ X PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' c) f- S. m4 O& _$ }/ k8 g9 ~
}2 u2 f2 Z! | r2 M
/ T5 ?/ `0 Y. v- m
6 }' s) M, ?6 @, j8 Q! s然后是 双核通信的初始化 AppInit();4 F0 ~) z6 K3 x
void AppInit(void)
0 i" C0 J0 U3 g. c' @( p{" _8 Q* g7 ]; c3 L4 p, v
/* Structure to initialize IPC (see Ipc.h for definitions) */
, t) p2 F2 b ^, ~ struct IPC_cfg ipcCfg = {9 \' [7 ?& t: o- ?3 I
IPC_DSP0, /* local processor Id */
# H! j& d/ F( C. z: w5 G IPC_ARM_HOST, /* remote processor Id */
; R, e+ p5 H2 E$ m; ^ h IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
[/ M: r7 I# C3 u7 _; V IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
. D& ^: o( }( F b2 F9 F NUM_MAX_EVENT, /* maximum number of events to be created */
7 W/ q9 H0 Y. m$ s. t# H' q &ipcPvMemDsp, /* local side private IPC memory */2 o4 K4 c* j' x$ o
&ipcPvMemArm /* remote side private IPC memory */& h: _. U3 q" j
};
3 k+ e4 z/ L2 t3 B IntDSPINTCInit();
1 x7 j8 ]2 R6 q1 q: y& d IPC_init(&ipcCfg);( p- m5 w- f$ ], f* d/ u& ?
IPC_intRegister(C674X_MASK_INT5);
) c& V% |) ~9 @, O, l7 g- L6 p iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));! \! Y% B; b$ r
# o" _- N! W( m4 t2 q4 l
/* Enabling interrupts for DSP C674x CPU */
% f# j+ A0 a3 q0 V1 V3 O6 M& g IntGlobalEnable(); /* Enable C674x global interrupt */
( ~! w" `5 t3 t: K5 u0 O iAssert (Notify_start()); /* This will enable IPC interrupt */
/ w7 G4 H' M6 e+ V+ Q7 q}, R" {' U% ?5 r# ]! a
: y( M5 {. [) o- {- i! H" j然后是 ; ^+ m: u. v8 p% K' U$ }3 \# m
// UART 初始化# y' m, |; p5 z6 Z3 S% o d7 B
UARTInit();
$ b! c$ B. S+ Y8 _0 @
. v% t3 h1 p+ B; @% S: n- H7 O; p // UART 中断初始化% B% m( O6 D0 t
UARTInterruptInit();
& E) ^4 V: E: @5 @- R3 H+ s N) r9 X2 V% h5 T
3 L9 Y; J. A7 z& ?# m) Q! Ivoid UARTInit(void)
: `/ ?4 g; e' T) W7 j+ s; @/ }{. N4 A. l: J2 A1 s! I6 c
// 配置 UART0 参数$ w9 w! K0 k! I, [
// 波特率 115200 数据位 8 停止位 1 无校验位# G! N! E! E( o9 ~( k4 r, L
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
) L2 M: O8 h$ K/ B! R UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" Q. t- |, N* s* f, p // 使能 UART0
9 Q* c2 m- h% x9 X' d UARTEnable(SOC_UART_0_REGS);
# L5 F% F# y4 o; t# ]. Q& s* r7 Y, }$ B
, j H1 I1 I+ \1 @' L // 使能接收 / 发送 FIFO
0 n' c: v7 Q# q+ n// UARTFIFOEnable(SOC_UART_0_REGS);/ O, I, J! F1 m+ \, `& s
% ^! Y1 n! t% V1 Z# O
UARTFIFODisable(SOC_UART_0_REGS);9 Y: [ B+ f" P5 g! j' g6 q
) i5 F; ~/ N$ W6 N. G# W- J/ ` // 设置 FIFO 级别 接收FIFO的级别
$ ]7 t: q, d* @* \+ f8 h( h// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
2 @" Q$ s/ t* e, P% Y# p8 R}5 ]0 H- }0 F ?4 U
" c" N1 E. B8 d& [
/ z5 s# l, ?% g/ I9 A. E& d, jvoid UARTInterruptInit(void)& W- C' ^6 i" ~$ y5 `; G
{
% H/ p9 z% O0 E7 ?; n5 _ K# y# g8 | IntRegister(C674X_MASK_INT4, UARTIsr);
) `# s) c+ R- {! j5 d9 R# j IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
' u- m# |7 Y2 X3 ^. ^! J IntEnable(C674X_MASK_INT4);
5 F+ Q0 [8 C" D3 p* E6 c* B' K+ Y" h5 B7 o
// 使能中断
/ u+ E: u* u8 G& N1 { unsigned int intFlags = 0;# \7 X$ l4 F- m# L/ Q* B' n
intFlags |= (UART_INT_LINE_STAT | \
# n* J' n) g" [7 w* C4 O UART_INT_TX_EMPTY | \
. t$ x1 a1 d( S* F4 e' `8 G UART_INT_RXDATA_CTI);
2 w. \3 b; e2 }1 v- J- v3 X1 v& N UARTIntEnable(SOC_UART_0_REGS, intFlags);: |) v! q$ `& L9 x+ P, V# b/ Z! s
}
3 J! e b, O. { T- E. H% w: X8 M7 \
3 Q( q1 h7 _6 B$ F* ?; t5 u
void UARTIsr() l4 I/ H8 w, a! m/ H, D
{+ l4 t7 L/ l9 v. Q
static unsigned int length = sizeof(txArray);
, v* ]$ U5 }& k6 H6 P7 M( C- v: N static unsigned int count = 0;
! h' l: {- n8 b5 ~: ? unsigned int int_id = 0;
9 i: ?3 k# i- f7 h7 k* R0 }* o' x4 M5 d8 ]2 S
* x# A0 L, o" D# J+ x- \
5 ~" ]2 f+ |- H2 T, E
// 确定中断源
* }( [9 ~- _0 m3 t& a int_id = UARTIntStatus(SOC_UART_0_REGS);9 K6 \3 H2 O; O6 e
$ [/ r+ w1 y. c- ~9 H; T% f // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
3 m: V7 C9 G0 k8 |% S9 s- [
# V4 v9 J: ~# j. Z c! T3 D) W7 F" @- X/ R: W# p5 C7 `. M: K1 S4 d
// 清除 UART2 系统中断
6 F6 `& B* h2 I9 E* U s IntEventClear(SYS_INT_UART0_INT);; S9 ~* { H; B4 o
c( ?+ C/ ?7 p7 y T) j$ i4 b // 发送中断
/ x: V2 m9 E- D6 o3 n; N: d if(UART_INTID_TX_EMPTY == int_id)
- C8 _$ Y+ f+ `* ]% K6 T( } {
: b% ~3 @7 I9 f& x- @* N! j& L if(0 < length)5 }! n0 c1 q/ S4 _
{
3 S$ b- x- r( e3 q% V2 z8 A // 写一个字节到 THR
# u$ W* h6 [* G& h5 z4 D UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);- H: `' Q. q+ N( C* X
length--;" c) H; E0 }: p# }* ~# K8 [" Q
count++;0 P9 ?8 }! S4 W# x$ b
}
& M% E* t0 c" Y) X5 W3 N/ K4 K if(0 == length)
. M, x8 U% t7 \! I4 I0 s {
0 @! \ V. p" |- L/ M& G2 E // 禁用发送中断1 F) F8 x. N6 F+ z, T
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);5 C# q& O8 L3 K Q4 ~( v Y
}9 f8 x8 `8 M: a3 `7 N- X
}
7 \3 I7 E( l" n- f) Z
4 `& h5 T$ I+ f // 接收中断
8 I# q' }, M+ a4 _1 e. |3 K if(UART_INTID_RX_DATA == int_id)
+ i& k6 p5 j+ F1 } {
' w! A& X2 O# F. L if(status_a0==0)
% j( w# U1 w" i/ ?1 C6 m {4 L, @+ a$ V% ]
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# T M, R! |( H* o, m2 j9 x2 V if(a[0]=='#')
8 e4 e M( e& U1 O7 q- k3 S {6 {% `# `! e# k+ P0 i M* Q
status_a0=0x01;
' b, Z" D9 I+ ]& b status_a1=0x01;
& s1 F- P7 O0 S' E5 R2 M* q }
! v9 k+ j7 r5 f( ]: ~, L1 O }+ ?3 h. |, o7 K5 H+ F. n* h+ i: B
if(status_a1==0x01)4 e2 v, Q- _- p1 {8 d$ u
{
" w/ f9 U4 ?" H( J a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
s |1 b# T9 g i5 Z& G8 e if(a[1]=='R')
1 Z: k' K; y5 H6 ?& l0 v& j {
8 [) n) O6 h1 |2 h0 A status_a1=0;" X& [+ M; _1 J: w& _# X* s
status_a2=0x01;( L2 H. z* W, Z; q! {. z
}" g2 i# }0 l5 s1 }$ P9 V* M
}( g% H% ~5 [' e- X1 ?
if(status_a2==0x01)" m/ ]* c4 }5 z3 i
{
! l) z- ^0 x; R* k4 {( {- ^ a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' V2 s& X7 P: K5 v. ?
if(a[2]=='A'); ~6 |' b2 x$ `9 Q
{
# ]9 u: k; D2 `0 l2 W* R- B- X7 V8 R status_a2=0;
% F( L; w, O* B1 [+ O4 H6 V% M( C status_a3=0x01; n' Q K3 ~4 H9 @0 h4 U5 Y
}- {- ~ ~) L2 E* h
}
) Z0 P0 ~7 @% {; n if(status_a3==0x01)2 E, H3 ?, u" d$ C
{
- f1 J. o8 I2 D a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- C. h8 i. ?' ^/ s if(a[3]=='N')1 h4 \) R# ?7 {
{
: _/ ^ @8 b) I status_a3=0;6 d0 `# a$ N( G6 x- R
status_a4=0x01;* I4 \% | V/ N f" ?
}4 v7 }+ C; u; t: f. q+ j* x' w
}
! b3 C! c; k& f3 \% M. R0 ~; B if(status_a4==0x01)3 }9 n; \3 A" M! E6 o9 K4 `
{" n6 S3 d' \7 V- w4 `( D% ?
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, L4 Z' A* I; H" e" n1 V# G2 I if(a[4]=='G')
# [# b( r( O. `4 M% Q4 |: E- t {/ Q+ Y( l& M+ }5 A5 V2 R( R) B
status_a4=0;; b4 u' i, g m5 j
status_a5=0x01;: T/ }- W- b G. g, J0 s9 D
}! n; p3 @, l E9 \3 u8 H
}$ t* F% g/ ?, j0 d, z' m
if(status_a5==0x01)" I0 x* A) q ?/ e+ W; y7 D
{
! |! a/ q) H5 ~# V! m1 y- i2 e4 \* ~# k a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) z& A$ F5 k6 u1 P7 x if(a[5]=='E')
2 ^, l6 y1 E% j. X7 N& n {3 ]9 ~/ {; x5 N
status_a5=0;
( Z* d: q) ?! Y status_OK=0x01;
2 K2 ^' u5 T: J2 c* X+ r }7 _$ Q# |* Y/ H6 ~3 f* a5 E
}% s; ]7 z. B3 O3 `
if(status_OK==0x01)$ L" K e9 @% O" K
{
% g# `( W) [) Q: }6 X rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 E0 _' b, k+ L lengthrx++;
/ ]4 C6 L- z" o5 _ if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)& ^" ?. a: u" H' n) i7 d- R8 r
{
9 \1 c8 o" j5 n' E RecState=0x01;
! T/ R7 K3 K' _: ~% ~- B }- G [3 r( `+ o. _ V
}1 _+ c ^" R9 w: \9 O, v% N7 L
# p7 }3 J7 ^' v8 Q& R
}
$ x6 h9 L; ~ {0 S: Y2 C4 b& D$ |9 k- y8 V% x+ _
// 接收错误
, [5 I; Q4 g" h if(UART_INTID_RX_LINE_STAT == int_id)7 P9 b6 H% }& V0 C- I: }
{% u; f7 h& X6 m( i, l
while(UARTRxErrorGet(SOC_UART_0_REGS))
/ L' [ }: Q( {; Z* T F! K {" k' |8 Z! f& q1 f( c
// 从 RBR 读一个字节( F) H1 g1 J. _( f$ Y1 J: ^) k4 Z& _
UARTCharGetNonBlocking(SOC_UART_0_REGS);/ v: w2 q! |0 V
} e% R. Y" [/ V
}
9 j; ]+ ~3 l9 r5 m
h0 w8 c3 ~; ~) H0 d, K return;
+ `6 k. _6 H; w; b; B}
; A2 u* w6 n& H$ G. w% M! j C9 [8 G& p& d8 b
) j9 Z1 A: Y+ @+ ~+ |
$ F+ {7 n+ F# R+ P1 d |
|