|
OMAPL138双核通信,现在需要DSP核中的UART0接口。, w) b7 m* {2 m+ ?
我是在DSP初始化这不太明白。* Z h2 u" ]& J) R
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。' n! S' ^/ N3 w
b0 Z. h( D# C" E: [/ |0 {1 v2 X) O; {* L+ y' e
首先 PSCInit();//UART0使能& I" g7 m0 l' J" y, E
void PSCInit(void)# f) _6 O% q" ?% l
{
" M7 i) n8 u. U8 L( @: \( ~0 |3 o6 N // 对相应外设模块的使能也可以在 BootLoader 中完成
+ O5 ~% b" i: c% b7 g5 u* b; y // 使能 UART0 模块
; B3 i( s8 ^2 g* q& c/ d, ] PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
9 k8 d- ^$ ~' |* L0 F}9 X9 O1 t/ l, C8 M( J" N
- X: h- s' T6 X$ m
6 N8 m6 u, G& I6 A; L0 B然后是 双核通信的初始化 AppInit();
, A; b8 Q8 `& gvoid AppInit(void)9 C" i% A/ ^' f% \5 k* Y. B
{
_& T& Q3 s# f3 E/ A /* Structure to initialize IPC (see Ipc.h for definitions) */
$ }' H8 j# j4 P struct IPC_cfg ipcCfg = {9 ?/ R3 k3 m: o9 u0 e. v
IPC_DSP0, /* local processor Id */
: f0 ~# D; F; q/ I/ C1 K. X IPC_ARM_HOST, /* remote processor Id */
$ V7 j+ e/ U, \. N' C/ V* x IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
' | h" g& w3 ~* m. o IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
# A' E' k; w4 P2 M0 o, D6 W k0 P NUM_MAX_EVENT, /* maximum number of events to be created */
5 E: l- L7 T- s$ c &ipcPvMemDsp, /* local side private IPC memory */ r; `' p5 U0 \( F! {
&ipcPvMemArm /* remote side private IPC memory */1 v" g8 c7 Y% X. O6 Z. T
};
# N7 a9 z8 }7 r* G IntDSPINTCInit();, U0 E3 o) s. |% B
IPC_init(&ipcCfg);) B" c: a( `8 c( t8 V. g) l) |
IPC_intRegister(C674X_MASK_INT5);7 R* o. E, K3 J/ K) B
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
- d& k$ R+ n8 n4 k9 G) R* x5 [0 D4 f. e7 T3 t% U
/* Enabling interrupts for DSP C674x CPU */
+ L' _/ n" b' @5 C( Z3 q9 ] IntGlobalEnable(); /* Enable C674x global interrupt */
* E- ?3 W$ k( c/ u* U: t iAssert (Notify_start()); /* This will enable IPC interrupt */
: \5 V; L |% R; v. H3 G( h, b( D2 z- @}
, J* |7 n/ s3 D5 F" p( a( q& m
& c) a) Y/ H" A1 W9 @) c然后是 8 P8 w( F/ I: z% B
// UART 初始化
6 s1 t6 G Z, ~ UARTInit();
, F. q3 r, F ~& L3 N9 Q [9 N3 { R9 _1 R( n7 }& T
// UART 中断初始化
: j' O# G+ ^, @2 W& n UARTInterruptInit();
6 O. I7 J0 ~7 @9 H! [. g$ y! {, R0 f
) r @+ V7 m2 o3 a/ b
void UARTInit(void)7 y1 `! n+ c& h* e, h
{- P, j i% z4 A, ]5 @/ h
// 配置 UART0 参数, J1 i8 ?# n( R& r: R
// 波特率 115200 数据位 8 停止位 1 无校验位) a6 L& N: L- J. x
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,, g) t% y" c! A0 L6 J
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ ^. l( t3 d9 K0 d) f6 N4 q
// 使能 UART0
! i& @" W6 a4 x UARTEnable(SOC_UART_0_REGS);
1 `2 P; e9 ~ b9 H& p
9 E9 r6 D0 X+ b: L5 k9 X6 d // 使能接收 / 发送 FIFO
% r2 H1 i V7 t5 V6 ]: W; c// UARTFIFOEnable(SOC_UART_0_REGS);
5 B6 z# }3 ]3 X. Q% T. I$ v- J% x# x5 o+ J9 u) H+ S! B& M" h# g3 z- ]
UARTFIFODisable(SOC_UART_0_REGS);0 y3 K# o* ]3 B* I
5 n3 g- a+ }: z0 \9 K% j // 设置 FIFO 级别 接收FIFO的级别
4 M6 @& R6 Q8 ]) }7 J% V1 R0 A+ L; p// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1); j3 g3 y! O- [- t4 q; W1 F
}! R: K2 I, N! g' }4 y
# G7 [8 T7 e+ j. A$ q# M0 N0 f' R, U7 _( P7 C" S
void UARTInterruptInit(void)% z5 u' [% y5 x D7 E
{$ y' ^! K! {' r$ [0 ]$ M
IntRegister(C674X_MASK_INT4, UARTIsr);# e9 x0 C. z# K- B+ K1 U5 J5 S3 H
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);+ S& v ?- K8 L4 v f9 y
IntEnable(C674X_MASK_INT4);
& ]* B% j8 O9 a- X
0 e9 m' R6 z8 e, j3 v, \+ F // 使能中断. W9 o7 i) c& p+ c7 a
unsigned int intFlags = 0;0 c$ }8 ]- }% c1 Z
intFlags |= (UART_INT_LINE_STAT | \) n9 T5 P, k/ G+ P& |* z
UART_INT_TX_EMPTY | \" ]. O/ D! W/ b) Y4 r: e3 Y
UART_INT_RXDATA_CTI);; s# A2 M+ H6 X5 |0 W- O3 B
UARTIntEnable(SOC_UART_0_REGS, intFlags);
# H3 y2 ]) ?/ }- Z2 d6 |1 o( ?}
. w7 Z7 ?7 S0 p( Y; _/ `# v1 S6 v g& @& W+ ^# f; G
0 b$ ?/ m5 {5 X& B7 qvoid UARTIsr()9 r1 u" m% J, Q
{
6 z o2 {' y" r F static unsigned int length = sizeof(txArray);0 Y! W# U: X P0 M
static unsigned int count = 0;
/ I% p# B. I6 i) R) K- V; g unsigned int int_id = 0;
5 E1 e7 p* v; ?) F3 V* e, v, x4 {/ P9 J# K/ J' D
: @8 Z4 h2 ~ I( }8 R- b
4 A6 u$ s% M, x" Y0 f- H* ?: ` // 确定中断源
0 i' c. y+ W$ n; O int_id = UARTIntStatus(SOC_UART_0_REGS);: j j( e. M4 I1 o
4 }" n Y, p: P5 w: z
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。" q( G0 x$ X% L; X, _
, [% E5 i3 ]4 H3 x% M1 [' \
9 o* e( t$ R: b! w$ x1 U- r4 a // 清除 UART2 系统中断/ e# f6 x( a. D$ q/ \* c; Y
IntEventClear(SYS_INT_UART0_INT);
' H/ \& H$ M# W# E+ {/ i6 N( f5 d3 x7 Y3 F) c
// 发送中断5 {/ I S R9 m* _ B* y) k
if(UART_INTID_TX_EMPTY == int_id)2 y% c+ E; w* F( I1 w. b1 v7 E
{! N/ m% M# Y# [, c6 ~ |
if(0 < length)
* v/ T7 ?1 K5 i9 R2 i/ V- ~0 {4 s% g {# |9 o% L! r, a# [% p8 M4 W
// 写一个字节到 THR
% h/ f2 p6 V' Q UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
" L" T J! W+ B2 t( k u# _: ] length--;4 F3 g9 m/ l2 f. T
count++;. p+ ~# M$ \# G% T& P0 z" A
}
: z* H( v* v% `# L2 b% S if(0 == length)) s% Z$ u ?) E# U G
{
! {" |- O6 d/ G, {6 \3 U% ?# @ // 禁用发送中断
1 ?, a7 Q: K; ^9 k( h. J' g% R UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);& w! w; L6 U) D2 R+ F
}
* v. [2 I V' Y }
/ v2 r! M( K/ e0 F0 i* x {
+ z4 L% {6 h, ?$ ~ // 接收中断
8 Y, X7 j, F9 w8 ^" ? if(UART_INTID_RX_DATA == int_id)0 z2 V: h6 j+ ]" w7 k! S
{
0 U, a1 |9 l8 u6 Y* g1 {1 \, j if(status_a0==0)# q! L8 p" G0 |" b3 E0 H
{
$ F5 P2 F; F" w6 N a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; u$ ]- o3 d* M! Z* k' o
if(a[0]=='#')) \1 `5 W5 K4 P$ {
{/ Y9 B$ o" F6 r( q/ _
status_a0=0x01;2 N& z/ j1 g4 \( C+ A" ?
status_a1=0x01;# U6 z2 s+ m: c* b+ c7 V1 t
}$ C3 M+ Y* H1 w. a
}
P$ }' m. v# p+ U' o if(status_a1==0x01)9 o8 Y* D- M* o5 ~5 {7 l
{
- Z2 i3 N3 M; O& a' L9 J- O( M a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" J% S9 g: e0 c$ i1 B9 O
if(a[1]=='R'); W; W- g* }' d
{
, U% k7 I1 m4 j. s; R status_a1=0;9 p& x7 H) S0 p6 i7 o$ `# q8 G! s
status_a2=0x01;
/ d6 @4 l) A6 S7 ~. C; W! C3 h }5 Z% C5 P1 v/ |0 {% v& i* c$ @
}
p {: m+ r- E6 O" n if(status_a2==0x01)! `+ F( `. K* ^$ s* F3 k
{
: C& s: \& G1 I5 z8 e9 E) E a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 B; W* p! m1 ]0 R9 @ if(a[2]=='A')' f/ M" i: ]5 i3 G
{8 n7 I' d2 I+ _( o$ K6 M' Y
status_a2=0;
$ N# J/ H. ?( ]* t1 R* Q. z$ x status_a3=0x01;
& _; C4 I1 M6 {6 F- D5 J+ H }) P. J/ O5 n- c* E( e) B; y9 q& `
}
X) a5 q4 J9 Q# L if(status_a3==0x01)5 O6 R& I" \! u2 T0 w; z
{/ W' g* ]8 A+ e4 E0 p
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 w: l" L7 a# D! c0 @0 w4 C' k
if(a[3]=='N')+ Z* E u( K" {( S J* D9 ^
{
4 I: ], i0 Y0 g5 k8 B* A status_a3=0;4 d* ?+ y! O/ X9 M
status_a4=0x01;
+ i& Z1 V" \6 F' n$ _- ~2 e }
+ t4 g1 R! A/ n. D }! {* x K `: b+ i4 G6 P
if(status_a4==0x01)
. _7 `: U6 Q* K7 c {
. K9 W7 A% }6 y% f8 u a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 |. V6 N5 U+ h5 ] O if(a[4]=='G'); ?7 ^ \5 ?5 a& x
{
* ^+ p! w( o) D1 Q. s9 ~3 Y2 m, i status_a4=0;
; d* ~+ D, A3 y" z* @, C- F status_a5=0x01;. i& T4 E B2 @6 M# o% L
}
Y. [9 h) s3 M: J) ]9 | }( t8 z5 j) x' ^7 {8 z( i4 W2 t/ [9 V
if(status_a5==0x01)$ k- v! ?9 |1 I# S( \
{
1 _' w1 P( {% J2 e a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 g3 m9 F3 W$ b* i# j m1 {
if(a[5]=='E')
- _+ o) H. u8 n8 v `; ~! X. c4 \9 Q {. U0 }8 u2 J. D. J
status_a5=0;' |& K: t' e! A/ Z
status_OK=0x01;" {* g+ d5 f) j D5 A5 L2 N: l
}
% A6 V4 l2 f; R0 o8 o! ~% V! f& I. b }
1 L' P: e7 X$ U2 c- i6 v if(status_OK==0x01) z4 d/ M8 p- B% s" o7 \
{2 q# K! p- K; N8 b
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 t/ W5 R! c; S& B) K lengthrx++;
- g2 ~8 h7 h/ W6 l/ n if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)9 }2 x' ^3 Z, S9 o
{
- O1 B" z4 H* m; c; ~3 x2 @, F RecState=0x01;8 n# y# O j# D3 }
}
* }$ T5 F6 r/ a% q' f) r( R+ r6 \4 L$ A1 B }- \) t' F4 s* q3 G4 D3 I
, ^, E3 W) w$ S- \ }
0 r) W2 I8 S" M: F' t
" L) G- J/ p" w2 p2 {$ G // 接收错误
# t7 s3 I2 s% ~+ t/ L if(UART_INTID_RX_LINE_STAT == int_id)
3 s% Y* q; m8 ?( c" c8 p$ J {" B7 {! L# }0 G+ {! @( K
while(UARTRxErrorGet(SOC_UART_0_REGS))
0 D; K( [- y1 G {7 A- Y+ A! B* e3 I* I' j x
// 从 RBR 读一个字节
" u9 s+ B2 l' V% @. R8 }/ V8 v: e UARTCharGetNonBlocking(SOC_UART_0_REGS);4 b7 s3 |6 D+ `) g
}1 R& g6 l; M! k1 [, u' O9 a+ v
}* `' N. K4 Q8 K+ _# F
2 t0 M5 H& |" k! ]% {' {
return;% B) Z1 j# v% N' c$ B6 z/ i
}
# G) R5 a; D) u4 z5 K
c4 w6 ]) v6 z' N9 l, o9 |- b, M9 t/ j; z/ j( X% c3 R3 P8 A
" d$ S4 ~- \* b# u% {3 z! U |
|