|
OMAPL138双核通信,现在需要DSP核中的UART0接口。' c, E8 i9 F$ g: I
我是在DSP初始化这不太明白。+ d+ P" x/ n3 R: m2 u! _
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。* J6 b( R; u- R- T7 N3 {7 K5 V
6 [: q8 a3 `% W2 @" ?0 S
+ t3 f% R3 n9 G1 L' w' D" N首先 PSCInit();//UART0使能6 N2 Q. D& {) T; x+ A
void PSCInit(void)- {- H* [, D9 V+ q5 @" k
{
! ^$ z& H8 n# r6 ~ // 对相应外设模块的使能也可以在 BootLoader 中完成8 T" i9 @6 J& o! h; C! ^' A( ^
// 使能 UART0 模块+ d+ L$ q2 s% M, E8 z4 b) H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);6 v5 v( \8 F; r N
}$ ~4 O! I7 B% m
# ~- H9 e4 B E, M
) r6 c1 C" V4 Q( M) Y: ]8 m
然后是 双核通信的初始化 AppInit();
( D5 r I% y" \& Rvoid AppInit(void)
+ t7 \4 [" Q( w$ ?4 q C7 r{
% A4 W+ v& x& K7 ^; P /* Structure to initialize IPC (see Ipc.h for definitions) */
1 h, g$ |# I- d struct IPC_cfg ipcCfg = {
. V9 T" [' m5 m T* T IPC_DSP0, /* local processor Id */* {9 P, _3 X% n A
IPC_ARM_HOST, /* remote processor Id */0 }! z8 Y; Q/ j7 W1 l
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */0 h1 e( f. L9 g- v" C" k! Q# U8 @
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
3 ^, t; y" q1 B# S NUM_MAX_EVENT, /* maximum number of events to be created */" b5 _" I0 `2 t: m
&ipcPvMemDsp, /* local side private IPC memory */
" Z9 _. d, i$ {! f7 a+ n8 @/ s &ipcPvMemArm /* remote side private IPC memory */ u/ l4 ]! p- O( ~: V* F3 t
};1 j+ V. h, c2 }9 g H8 G1 k4 |4 H
IntDSPINTCInit();
4 t* h+ ~2 |6 s: }/ _' ^6 Q% u IPC_init(&ipcCfg);8 m) p5 p7 ]# ~2 b. S3 T: t) s
IPC_intRegister(C674X_MASK_INT5);8 ~ P% \. c0 w4 B2 g- s5 @
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));9 g( ~9 n# s8 m
d! n7 x8 A1 }: w /* Enabling interrupts for DSP C674x CPU */, a: q$ ?/ s# T9 H& Y
IntGlobalEnable(); /* Enable C674x global interrupt */! n9 \2 q" N& \4 }9 h" I U" i2 F
iAssert (Notify_start()); /* This will enable IPC interrupt */4 H7 U G" J! d
}
. ~3 v' g2 _. h1 r8 S% E; ?$ V
然后是 ( d D2 ^0 r; `
// UART 初始化
* }1 K9 T$ b& m UARTInit();( Z; Y7 O# R- n8 c1 E3 @
' O) K4 `) `* a% N% x% `
// UART 中断初始化5 u% N$ ?; ?1 M& ], U
UARTInterruptInit();6 ?5 ?" q4 i% \' l4 v
* t! b/ ~4 o5 W8 ~# e, [
* O& T2 w7 j* R( N: j- v4 {void UARTInit(void)
. p; U8 d3 X: B3 g- l1 ~{. b% G* N6 G+ g* U; w' [5 a( i
// 配置 UART0 参数
& y2 S0 c8 I% L% e' D: y( |5 h // 波特率 115200 数据位 8 停止位 1 无校验位
: R( g, z) x/ N( x) h' E& C8 Q UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,: u3 R3 O; V0 Q9 m$ r
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
7 i& z! S' r' X0 B7 Y7 L // 使能 UART0
) _3 t2 u7 F" j( f/ k9 K UARTEnable(SOC_UART_0_REGS);
0 S- S- S& i4 v" G/ J" Y
6 Y! d0 K0 B" W$ F8 x // 使能接收 / 发送 FIFO
y9 m0 ~ B5 m// UARTFIFOEnable(SOC_UART_0_REGS);
9 H9 O7 M. _) b
5 m( a4 A& X& g5 H1 Y$ N& ^ UARTFIFODisable(SOC_UART_0_REGS);
% C5 f) P+ u) U$ s5 G0 t# q9 T) ~! R# r) C$ S* ~# K) q4 L
// 设置 FIFO 级别 接收FIFO的级别8 q( Q% D |, s: s$ a/ A- n, |& J
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
) q L% l, v+ z4 z1 y}
/ b+ ]4 H% ]: w
* }! |5 i4 {: B2 P: X; r! e! p y
void UARTInterruptInit(void)3 B. D# B% p$ J5 u
{$ S& {# y2 H1 B, ^ k1 l% M
IntRegister(C674X_MASK_INT4, UARTIsr);9 D( Z7 ~' J! {0 B0 F4 q: L
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);2 D3 h" W& w3 a7 v! I
IntEnable(C674X_MASK_INT4);
* I' |* A; P5 {$ e/ G( o0 z+ c5 i7 C: D4 H, |( z' ^' w# M6 R# C5 }
// 使能中断
; l7 n; Y7 O3 R2 }, ^) X: U! `( M% x unsigned int intFlags = 0;
: t8 `8 e0 [& t intFlags |= (UART_INT_LINE_STAT | \
( @8 v* t; ]5 E, ^' _, x3 } UART_INT_TX_EMPTY | \
% A. O- A* D6 ?9 {! `$ Q$ x UART_INT_RXDATA_CTI);0 a. E6 I3 r6 H& }+ B
UARTIntEnable(SOC_UART_0_REGS, intFlags);
+ `1 g4 Y. o; s$ ~# m4 n}
`7 _3 S4 |0 L, S9 e5 S
( K- W& ^: g; \3 D S( [5 ~/ D L0 w1 m' Y% h
void UARTIsr()* \* M6 m R' T! F& j4 C
{
( C+ t t. _ @; g/ L) C. l2 g static unsigned int length = sizeof(txArray);+ N. E% x% R( z/ Q4 k& h
static unsigned int count = 0;
4 i4 ^- X6 U! H6 a( X unsigned int int_id = 0;
3 h! }" n, n& F# z H/ b' W r' r* g9 ^& z2 K$ |0 i2 E; f. ]
) D. s; [* n+ ^) ?' A
6 \7 }. K9 [& ^3 e m+ D // 确定中断源, B+ V. E9 q8 m5 C9 C& X4 c) f+ D
int_id = UARTIntStatus(SOC_UART_0_REGS);
1 n; Q7 l# g+ ~' k. V. B1 H: E9 T% D# u: i3 C
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
5 Q& W; ~2 R. Y' j3 L
4 ~& `# _+ _. V6 I+ {7 g# Y7 [' T0 m# h$ Y& |+ C
// 清除 UART2 系统中断
$ p$ `# f! R' c IntEventClear(SYS_INT_UART0_INT);
8 O; L0 u7 A3 t- H9 U& v& z* i4 R3 O0 g: c/ z' M; r
// 发送中断1 w. v' @6 Y0 X0 L7 w [1 }0 U
if(UART_INTID_TX_EMPTY == int_id)
& [% m; o/ D% r4 C {
# G* X6 r" M1 i if(0 < length)/ s# r3 a9 I* `2 P M
{
1 u( r! F2 h Z // 写一个字节到 THR' @; ~# e# E% I( \# Q! c3 \8 ~
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
5 Z, Q( w& b3 g* F7 b. ^8 b length--;
% [# `8 V% i( | L count++;
* K9 y+ T) S: F) r1 Y. P }
- j6 R# G7 j* @9 J8 P+ e3 b9 L3 f if(0 == length)
# ^4 {. h/ u5 i8 D3 m {
_* b( r/ v5 F# h8 x( b; E) W // 禁用发送中断
; _7 n7 q1 {* a% e8 P+ K UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
5 |; l4 ?" m0 |1 L* }1 x* { }
8 i$ P8 t/ y; h" L7 z2 W& ~+ e3 Q }5 U" D: ^2 v6 s3 J9 V
! P) k+ \& r4 B; G. k
// 接收中断3 M& \. W0 v# x! l+ G
if(UART_INTID_RX_DATA == int_id)
B3 O1 W5 \9 L, k; R p, w# i; I {
: k8 C, h# S1 t* C% V3 V if(status_a0==0). W) Y. h2 w, d! J' f7 f' n9 ^
{
" D& o4 t5 D# V# c/ P a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 L$ u) v) f5 B# f8 u; J* S if(a[0]=='#')6 F8 k. n. [9 e& ~/ ^9 a- @7 X/ {
{7 k5 @# j& ?6 l- x3 Y' z
status_a0=0x01;
0 k( c4 N( i5 s status_a1=0x01;+ a: d" W1 L$ q+ s
}
" J$ j/ F. _: w }1 F6 S) G+ `" [: U( Q% Z
if(status_a1==0x01)
3 ]5 T+ s. \' M3 R {* o; ]3 U9 A) c! U8 m0 P
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& k9 H" M- Q9 U$ k if(a[1]=='R')# N7 U' O) g2 [! N2 t1 C
{- s# ^6 R# r$ j/ R% [' h% c
status_a1=0;
; |3 |7 P1 D# q; I% S* U status_a2=0x01;1 g* B: w5 {# J7 F0 @( L
}5 W- B3 y. S8 Y6 K
}# h) L2 r0 Y+ c- ~
if(status_a2==0x01)7 m# e! V. m7 d! f+ T2 n$ p! F7 }
{5 u! [' H# z9 [% G, `9 W5 D
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' y. \* B9 ~6 W7 s if(a[2]=='A')
4 B: p& |2 i @ a* e. Q+ w {# T V. p+ l2 X" ?
status_a2=0;4 `3 S" H" u* R0 _9 W/ M0 _4 N
status_a3=0x01;
* ?* I% g5 i3 G+ g9 ^, M1 V6 J Q }
+ a6 d* J t7 H/ @' F }9 a: s2 k4 L+ X4 l _
if(status_a3==0x01)
: h5 Q" \) s$ P% z" M7 Q" Z {
8 H/ p% L0 n3 d7 D8 r$ S0 {' ? a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 ~( x0 s0 X+ r! }% G x- p
if(a[3]=='N')
+ O* j- j" @9 C+ S" b* k7 {& [ {
6 V$ ^9 z: d4 G status_a3=0;
( \: C& I. ~) } status_a4=0x01;
+ J2 e. b: X3 w# H8 U+ r) s( @+ k }
+ G2 `0 K: W. F) ? }4 V& f$ d0 S& c% G
if(status_a4==0x01)
0 q0 x/ o1 @' G) ] {, d/ ~9 _9 Q: T: j# C+ ^
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* p4 j4 X5 P% |! h4 N
if(a[4]=='G')/ b9 Q$ F( I$ | g1 f9 [6 s! S3 ^
{2 x, ^2 N2 \ `: m( p
status_a4=0;# t& [9 D R0 _( _! r# G% K
status_a5=0x01;
( Y/ J& i9 r/ p- i4 Q' J, g }
4 m- v+ `: m/ O6 b+ z& H' k. L }' U& a6 k) k( S, h
if(status_a5==0x01)( d1 a% n t" g; n1 o
{
9 t. m6 [. S# W/ t& A) ] a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* _+ n9 U* ~6 x
if(a[5]=='E')
) ~' F5 O& j. f' l {
. J. K' C6 M! ], ]' [- P status_a5=0;
: G/ T% a* l3 b" h# Q status_OK=0x01;" J: [( J! K6 S; P& F
}* B( C4 e5 z2 W% Z* W/ W
}0 P s) T$ d: B. Q2 X
if(status_OK==0x01)
+ J) X( f2 _0 @: i5 T, C& w! ?( { {" N* e7 q' t' t1 w% T
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' X4 f# o4 {5 m* l
lengthrx++;' X; E9 T2 D* |' Z5 ~
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
3 H" Q$ z: N. N3 W+ G2 r7 h; o: I {
3 ~3 K$ u2 }0 ^ RecState=0x01;
; z% m& L) r* O6 o- E2 G; H }: {' R* E. Z$ u+ w- l5 ?
}$ z$ [% n1 K( F' R4 I1 ]
% n4 V( b: F& B. J
}3 `' m* ~1 D7 `
' {- X9 H( A9 K+ T' v
// 接收错误
: ~8 K& v3 m9 `+ T0 z if(UART_INTID_RX_LINE_STAT == int_id)
) w( P* X- {; t% `) {2 l ? { I8 j& Z/ G7 t* e% Q
while(UARTRxErrorGet(SOC_UART_0_REGS))
. d4 W& R7 d! j6 \6 ]2 U% U6 t {
& N* _4 l j1 K8 D$ Z& D // 从 RBR 读一个字节0 `* c4 ~! M$ x, ^) b5 |( W
UARTCharGetNonBlocking(SOC_UART_0_REGS);$ j7 z" o% q/ S% {( Q( P6 I
}! L7 n" w# o2 r7 T1 P0 h
}
7 j% G1 I( h4 M+ A: Q2 R5 K: u R: n& j4 W" P0 m( D
return;
4 e1 x. n9 p# V9 O9 l! Y: j}
; p5 @: i+ Z( m# I. f
7 |: S9 [) Y4 a) E1 r& q; y2 k: H6 Q6 m3 A5 _) K7 b8 E
7 N% c1 H6 M% l/ k/ I8 q1 i8 }* Z |
|