|
OMAPL138双核通信,现在需要DSP核中的UART0接口。7 W* b$ u( F- c2 e6 c7 ]- u# D y
我是在DSP初始化这不太明白。! I0 y$ M$ k& D/ M" N! S
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。4 b2 Q6 O: X+ k0 ]) V2 e
s$ }# `9 r5 ?6 A
5 U8 ~+ z8 X" @, a
首先 PSCInit();//UART0使能+ L2 G1 u- _. A6 m! x
void PSCInit(void)
' V# o( n) F8 p1 Z7 u( r n{
( C6 u8 N5 A/ Z6 X* G // 对相应外设模块的使能也可以在 BootLoader 中完成
! ^. F# V) @: L$ j8 D) |! b // 使能 UART0 模块
. b- p/ j' [# _5 F6 x% |& ^8 a! j1 b2 T PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 {+ X% A3 q' Q, x) P% z
}
) g! I2 g, {* h6 D7 \1 }$ y6 ~3 W# ?1 \* r' z3 @" B, W3 Y$ w- X
' u4 l# V( `5 t! { H5 @然后是 双核通信的初始化 AppInit();8 \+ e4 V, e8 e- K0 k# L
void AppInit(void)
8 ~* Q3 p% m# a{+ j5 r' O" G) a0 F* R6 [2 X
/* Structure to initialize IPC (see Ipc.h for definitions) */
! c; ?0 z/ ~$ u7 s struct IPC_cfg ipcCfg = {2 s" K- ^1 ]2 y& j6 [
IPC_DSP0, /* local processor Id */: |" E4 S7 V j
IPC_ARM_HOST, /* remote processor Id */
: g- V; C# c' {7 P IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */, L0 Z& j6 S- Y6 \* }) Z6 O& e
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
+ m/ H2 a( v Q. ?8 S! f. |4 a/ `) t NUM_MAX_EVENT, /* maximum number of events to be created */3 A" i* `0 _# r9 |( Y; F
&ipcPvMemDsp, /* local side private IPC memory */; _' Y1 m1 }8 U
&ipcPvMemArm /* remote side private IPC memory */
# t5 |0 o5 E3 M0 H };6 P1 W5 [( B. S P
IntDSPINTCInit();4 N6 W8 M$ T$ Q9 N+ V( L: S. p6 n
IPC_init(&ipcCfg);% o4 s% }! m2 g2 d3 e
IPC_intRegister(C674X_MASK_INT5);$ G7 I1 z* \: l9 c7 e; D
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));) n& D6 w; r5 v: ?* l
7 M7 q- Z8 @0 w, Q
/* Enabling interrupts for DSP C674x CPU */
, Z! T$ @+ x, f2 h% T4 c IntGlobalEnable(); /* Enable C674x global interrupt */; j& L9 U1 P# c9 Y
iAssert (Notify_start()); /* This will enable IPC interrupt */, t* h/ R& H4 p% u @7 M
}
4 ^0 @4 ~! N& p; p6 S8 q& e) c' i7 F5 ~6 d7 o
然后是 4 S+ k7 D! p; G+ @" E
// UART 初始化
, m$ e9 D5 d/ {7 d" K9 E UARTInit();
7 t/ i" A1 p2 \4 j! V, c$ J- D
0 r) v2 R3 Y; Z // UART 中断初始化6 Y# L( W8 ~1 v! Z
UARTInterruptInit();
0 _& M7 k0 L4 |8 Y$ C# H# @+ E1 G3 `$ Y5 {: }' k" i# @
& N* z$ [: P% Z6 Z! K9 ?3 nvoid UARTInit(void)2 I# o- |$ m+ c; j u }7 k
{+ W1 }9 I7 J9 P. m4 t
// 配置 UART0 参数
& Y U+ P% w# ]2 p/ K X4 I // 波特率 115200 数据位 8 停止位 1 无校验位# G# I! J# e2 t6 i3 j/ D' q
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
7 `0 C( a& f+ K7 L. a! L: ~ UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' E* }5 T5 |7 E8 ] // 使能 UART0
$ n( l% y6 u9 Q# w UARTEnable(SOC_UART_0_REGS);- ]* o1 }3 X% |# @1 g7 D
5 D- ~1 ? B! [( V* a // 使能接收 / 发送 FIFO
2 m3 A! g0 j) @: {) d4 C6 U3 G// UARTFIFOEnable(SOC_UART_0_REGS);
* o. E# s% n* y9 ~2 j9 a' n9 {7 M4 K4 B# D5 x q7 l- |* H
UARTFIFODisable(SOC_UART_0_REGS);* ~! M" b2 Y, Z. u
0 B) S8 ?, a: {4 ^" D( f% E
// 设置 FIFO 级别 接收FIFO的级别6 m- k- P/ \+ X
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);! a1 I: L7 D% f3 W; `* ^
}& Q* k% W; _6 d2 K6 C2 |+ m
- \$ U3 ~' \& n5 P4 R6 U# r+ W8 ?' s+ E2 _8 ]; R4 J
void UARTInterruptInit(void)1 Z1 s! n$ h% S8 ~
{3 `# P0 a" B- S6 b$ g9 J, d7 P1 T4 _
IntRegister(C674X_MASK_INT4, UARTIsr);+ m. l/ p! H4 `1 W; w- Y6 w7 [" A5 F$ m+ j
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
* o$ X' A; Z+ v5 C" |9 { IntEnable(C674X_MASK_INT4);
% \6 Y+ B0 d& {- Q+ n C! L! n& u. u; O* W- ~( A
// 使能中断
: m: \, E! R$ J" J; U( ` unsigned int intFlags = 0;% _4 E1 G) K7 p+ O: l
intFlags |= (UART_INT_LINE_STAT | \
2 [$ e3 q" H# D6 `% R UART_INT_TX_EMPTY | \/ d7 F2 |$ L+ o; n8 I
UART_INT_RXDATA_CTI);
, A: ?. }3 }7 u: T5 N UARTIntEnable(SOC_UART_0_REGS, intFlags);
6 K1 [3 r+ f% z+ Y}- a/ {; o1 h% [9 Z |, y- i; @
7 U- X. N- l/ Y9 D/ D9 A/ R& V: M9 ^1 s% J9 R: u$ E2 p
void UARTIsr()* r1 i8 I- S- _; M+ \5 D8 r
{
9 O! t# h( M/ X- E$ u% I* [+ q static unsigned int length = sizeof(txArray);" c( Q- k! g* I) {. J( S
static unsigned int count = 0;1 m1 p6 k9 I/ s/ S+ q0 C( _
unsigned int int_id = 0;
* R- V5 V% y+ p" ~0 Z) N7 U: p& U3 m! N) c" T5 v; ^9 \
6 |/ }3 s5 h ` o- |
, l, V; S# t- I6 W // 确定中断源
2 `: ~* q7 T) O int_id = UARTIntStatus(SOC_UART_0_REGS);8 w# d1 ?3 p) i
( Q9 P- x% G0 S7 S( U1 n9 P$ u
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
c+ \6 z( x, k0 K% n! b& S+ H4 ?" D8 X3 g% M4 t% i
( ^$ L* ~" ?2 ?
// 清除 UART2 系统中断6 i; e" o+ c+ S
IntEventClear(SYS_INT_UART0_INT);% ]; k! W! |3 i
) X7 b |4 p. R1 A; r' H' `1 o
// 发送中断' F4 @, U" `; T2 }( m6 ~) V
if(UART_INTID_TX_EMPTY == int_id)
! e6 V3 A7 t6 J: ^. s; z {0 Q! Z5 L8 l. _% G& }/ g
if(0 < length)/ N! v$ m2 C j
{
) n; ~% i* z f5 D3 s // 写一个字节到 THR# [/ I& i7 ^: B0 S
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
% I5 p2 T+ \: I! ]: j6 R length--;$ S, B7 i# [+ i0 f9 ]6 z# L8 E
count++;0 f/ L/ j# ~# p
}5 {) V( c# _4 d; p: m
if(0 == length)' W8 y5 h$ ]4 A' c
{
& |5 v3 L! o& r' W& D/ m1 Z J // 禁用发送中断: d$ j, o: X8 g. C' j P) M
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);. E. y- x) N* a8 P7 A' U
}! L0 A8 e+ e1 n
}- ]$ W" y9 k1 Z% L
7 t8 o5 ?2 a; g2 w$ \
// 接收中断0 V: Z0 X6 p- c7 r
if(UART_INTID_RX_DATA == int_id)
/ `( _6 l# D4 M/ B6 r, _ {4 ~* S6 M0 O8 K0 O; v V# e$ g
if(status_a0==0)
+ E S! ]0 X [6 U' _$ Z8 L( B! m2 T {5 A1 T8 [/ h' q5 T; u
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- J# o3 n( \6 E0 n* ~ if(a[0]=='#')
8 T- E7 s0 {# O1 @7 Y9 l {
5 ~: ^5 u4 y ? status_a0=0x01;
# Z; H( D0 u" @$ I& ~$ {4 P status_a1=0x01;, s4 ]0 R7 |/ L
}- b7 M0 T9 q4 B9 _! k x
}
L# g* W! B# q* O+ q: V: l- n# s if(status_a1==0x01)
& G8 A7 }9 ]: F2 E' t {
8 W& l' |2 O+ C) _ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& Z2 ^6 [4 D+ ] E, m if(a[1]=='R')
# W3 k% M# J+ k. R/ H {
" A( Q' I7 e1 }& ^* U" { status_a1=0;
$ O% O6 I* i! s8 e5 E status_a2=0x01;" v5 c! @6 b. ]8 s
}6 n3 e+ m, z# D$ o' A
}/ t! v9 h1 q$ u5 S! \; \; N
if(status_a2==0x01)5 B- a1 L; h; L! A0 T7 t( ]1 v! t
{
8 g) z) _2 R6 T. E3 _$ A a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ O. S/ b) v8 ^, r if(a[2]=='A')
4 F" v8 R# D% J0 H4 t {
2 A# u% v( H; c% a% D status_a2=0;
9 V( \0 h) s* p. q# l0 } R' q4 ` status_a3=0x01;! G$ n3 E+ J2 D8 U* {' J- j
}4 O3 F; q% t* q1 M+ b
}
* O! K3 b4 ?! ^: S# } if(status_a3==0x01)
) e4 J0 I- }2 T# N( G+ z: J! z+ v8 K {# A5 g, y2 Z3 W1 t# h% {9 x9 f
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* `# P. P3 M6 J( S- v! F6 W. c
if(a[3]=='N')1 H+ v: {& l$ u3 `) u6 k" F
{
6 ~% t, e" b$ |& E; q- U: i status_a3=0;, g5 K, ^! A) u% W" S
status_a4=0x01;
/ X4 {/ [: u# c8 q, l& N }
/ Y2 n4 C! H0 B# V4 {) m6 v }1 m' Q: [9 i( J9 C
if(status_a4==0x01). |: }1 D! A- ]* w+ R; S
{/ E. l& x* `- F! O' t
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% q' K# k; P3 Y. ^, Q
if(a[4]=='G')$ E: v$ n1 B, p( q( l+ [% Q
{; {4 }- t4 o* @ H
status_a4=0;
- }; _4 F, Z: _2 u" F! \ status_a5=0x01;
{6 w% g3 e6 X7 Q9 I }7 _. y/ @% |4 i+ Z" _. w% I- W
}
' r3 P0 F& N% K3 e& b if(status_a5==0x01)
3 j/ \$ E4 X7 x- l. V; s {3 F$ x( |3 D! p) x+ X( n
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; e c( w3 g" x) K
if(a[5]=='E')8 u$ m$ u( v' i+ P2 r" D7 @8 J
{! S% Z. {+ O8 r0 [$ m" K. B
status_a5=0;- h/ X( p- p5 b1 Q* i
status_OK=0x01;
1 D8 x% f, o7 n6 | }& _" _( c6 G7 o k) d
}$ M) f& l6 w& E8 L9 j& ^) k1 ^1 v+ O
if(status_OK==0x01)
8 D1 T0 V6 d" }, r, E. S {* m$ E) n) @7 R% d* \3 l
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 t, q( J' y+ [' J, I9 N1 i lengthrx++;1 v% T1 Y+ D& z- y
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)# U3 T' S$ Q3 {' S9 S. b7 [
{$ ]5 ~- v8 s" P' \2 t) [
RecState=0x01;
g2 }2 b2 t; o* B% E( T }
* k/ `4 q1 g1 I5 D$ V- ?. r }
# R8 B2 y& C3 W/ q$ l e& U3 E) l! c' n7 c: k
}
% D2 D* ?6 Y* [1 W. F3 w, R9 i- _ |3 h2 z- G0 L
// 接收错误
- P- a' b( a6 ] if(UART_INTID_RX_LINE_STAT == int_id) y2 L2 s2 \6 N& d
{, @) a- P( ]1 t" Z K, U# [
while(UARTRxErrorGet(SOC_UART_0_REGS))8 k: S" G* K/ w- t
{
8 V' m" S0 B% c- h$ N0 ` // 从 RBR 读一个字节
" Q- e# d6 k" p( e; t UARTCharGetNonBlocking(SOC_UART_0_REGS);2 y+ w3 [5 j0 ~8 Z
}
Y% h. z! `7 S }
* B# r/ e2 t+ F# I! x, p5 M3 R3 K1 m: ]# O3 |; T+ I
return;
1 x/ w- W4 H6 b2 K2 P}
+ P( @ u; g; G# [- S! Y4 M
3 Z8 v% r" a& G z8 {$ r5 @$ R/ x9 Z, C
5 f+ l3 t) u, Q- l* H |
|