|
OMAPL138双核通信,现在需要DSP核中的UART0接口。2 M; U8 |% l5 w, F6 h8 y7 X! l
我是在DSP初始化这不太明白。
. Q) V. ?3 U3 \初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。& ?' _2 ?8 Z9 p i( f- x6 a7 p
6 [' P( m. U0 k" h$ n9 G; K9 ?& A1 m/ Y; G5 K* n6 G
首先 PSCInit();//UART0使能/ u x' I" R0 S0 Q8 o& O( u |: ~; B
void PSCInit(void)
) d/ p; k5 j9 J{
& O% u2 k) S* S0 }: X5 n% d( R // 对相应外设模块的使能也可以在 BootLoader 中完成
2 Z# `# [; `+ m2 F8 z // 使能 UART0 模块5 U7 V( d4 D9 J. Z; E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);* H8 `, g4 J6 {6 Z& o
}% u4 x; k. w9 \
. q( P5 K @1 h) ^6 Z! j: J; o6 W
5 a" S1 V% q8 @1 X+ I1 i1 t然后是 双核通信的初始化 AppInit();1 {8 f/ H( C# [% I7 G8 `
void AppInit(void)
2 {) a* e. t- B, N" V{
4 r$ }$ H. r% Q H& L; \4 c+ B /* Structure to initialize IPC (see Ipc.h for definitions) */
: G' x, G2 g/ \6 }4 _ struct IPC_cfg ipcCfg = {/ y/ S' S, M# R
IPC_DSP0, /* local processor Id */
3 _; `2 g6 W4 d- D IPC_ARM_HOST, /* remote processor Id */
. \" j* ^ c2 [9 ^/ y' {! E7 B IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */& \* @1 Z# h2 A0 U
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */; D9 a7 }' u2 r# u6 \8 |
NUM_MAX_EVENT, /* maximum number of events to be created */0 k$ J3 Q. s0 F; l& A4 v
&ipcPvMemDsp, /* local side private IPC memory */
& K. {: W$ c& x2 `0 D+ ` &ipcPvMemArm /* remote side private IPC memory */
$ V9 d; k0 R* y. P: k5 k };/ \0 B% _$ S& f7 ]6 }- m
IntDSPINTCInit();- W/ Q2 J. D% j
IPC_init(&ipcCfg);
) [8 Y+ K$ |: v8 y IPC_intRegister(C674X_MASK_INT5);) k) P2 m9 z& v+ m& ~
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
" |7 o2 L! X! [# L) k0 t0 F* H
4 _9 q; Z+ `' N: g1 z! |# h /* Enabling interrupts for DSP C674x CPU */, E# o6 o9 I. A j& ]# j3 Y) {
IntGlobalEnable(); /* Enable C674x global interrupt */
$ P% n& ]8 a' \+ k4 D0 | iAssert (Notify_start()); /* This will enable IPC interrupt */
O* @7 K4 T6 A: H}/ F9 Z5 O3 ?. ^, k. d
4 J% t8 Y- E8 N, N$ t; R4 ]6 ^% }然后是 3 T8 A, a% }7 v8 G! [
// UART 初始化. M b4 K; Y8 v, h9 t
UARTInit();0 V1 B9 I' q' l9 C5 U
% {! D4 ]: p. L3 p9 l; [5 J
// UART 中断初始化
( t V7 g) S3 W UARTInterruptInit();
( z1 G3 B' K, s9 w
( q4 r8 ~; A. O* J! e. _. t! J- [) a/ s
void UARTInit(void)/ M7 J5 P6 b+ F4 e
{
5 ~) L6 [& i& C, w" r/ @- k // 配置 UART0 参数$ |: U6 N# z5 N* B/ f
// 波特率 115200 数据位 8 停止位 1 无校验位
d+ o" Y0 M5 u' } UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,& {1 L8 U V9 z; s8 H/ a! F: d4 ~
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# @2 S4 a7 s5 R- t6 S- p4 z // 使能 UART0: z/ d1 {) T ^3 R" Q# T
UARTEnable(SOC_UART_0_REGS);
+ g5 U+ ^- z1 E; x9 K# r. |0 e2 |. _, }( S* g/ M# J
// 使能接收 / 发送 FIFO
7 J* j/ V0 k* e' P, E# p, P// UARTFIFOEnable(SOC_UART_0_REGS);
; ?5 P0 u* l6 ]8 W2 j+ v2 \5 `/ I6 w. E! j0 a6 i
UARTFIFODisable(SOC_UART_0_REGS);
8 O, V) R5 R6 K7 r; S8 D6 t" D$ a' f% w, n- _2 j
// 设置 FIFO 级别 接收FIFO的级别! V6 v. l B( _+ Q, X
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
7 q* u0 B1 ?! J5 Y; n# }}" u3 m" z% U; E
: {* W& n* H' d- L
* i5 R; X7 e9 `! I
void UARTInterruptInit(void)
$ R" O+ Y: O1 a+ d7 b+ M{
8 k- d5 G5 w0 L IntRegister(C674X_MASK_INT4, UARTIsr);
9 H2 x, i h, U1 C4 _3 M IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);: R( \1 a1 t& k4 F
IntEnable(C674X_MASK_INT4);" P9 _) y4 K& c% e/ I- W9 K$ Z
" |; e5 a9 J8 `) x& A+ h // 使能中断4 W- d- f9 O0 a1 W
unsigned int intFlags = 0;* ^$ z2 Q" ? b3 a
intFlags |= (UART_INT_LINE_STAT | \0 N' c% z1 E6 k3 a
UART_INT_TX_EMPTY | \ R6 e( @% n0 Q0 q% S
UART_INT_RXDATA_CTI);
3 w% r7 |( `/ w4 r- M9 q6 c$ L UARTIntEnable(SOC_UART_0_REGS, intFlags);8 S1 C5 U4 U& q; ~" V3 H H% R2 c
}. x: l" ~+ A" e" g2 d0 J9 k- m
& I ^! t( Y7 D/ _$ ^: w7 u! d; [0 ?. C- K) L. [
void UARTIsr()
0 T. K. X: b8 m4 q+ F9 _8 U+ \4 j{
0 {/ I# v. s- h# U' T3 s1 d static unsigned int length = sizeof(txArray);
; _. M. l6 J7 y7 v6 J7 g9 ? static unsigned int count = 0;( }( K2 ?; Q- [; a
unsigned int int_id = 0;
5 ]! r5 K- r% j) C# p Q2 W# c$ o& q& a, k4 `8 l- X
) }2 l% V% c( B& D& }! T
% o" ~+ [2 m; r // 确定中断源
) U: i; T) [3 p6 T* Q2 V) S int_id = UARTIntStatus(SOC_UART_0_REGS);
2 H4 k# v" T `- h1 d; C+ @0 B$ R/ L1 R" q4 L: b7 [4 v
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
: w# _" R: c# ?( Y' z4 w0 D7 T+ w
1 }7 c' V; e' {- G, h2 m( S, m( }8 _1 v3 G% B
// 清除 UART2 系统中断8 J8 e& Y$ ?8 x9 O- W
IntEventClear(SYS_INT_UART0_INT);" Z9 I3 F J }6 T5 A
+ C* i* Y. L) `/ n. a // 发送中断+ q# u8 s; K8 q% S- P( P/ Y$ c0 d" Q7 r& r
if(UART_INTID_TX_EMPTY == int_id)4 A* F8 N9 X+ [2 f. }* R/ w) z
{
% O, k. D( p9 M7 u1 k* `" F9 T5 w if(0 < length)8 W; S5 L# t. Q
{
9 g6 j3 ~9 v$ J. u9 u% v // 写一个字节到 THR2 w Y" {# Y5 O; l4 ?% p
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);4 r0 b; E2 B/ C9 \* m+ s4 H
length--;3 S, H3 H2 ~% o. _6 O% w* J) _& B
count++; L# v& d% S$ i" V8 y) W) O& ?
}
& t6 F4 X0 G" T1 i) V if(0 == length)- P, Q+ @8 G4 T2 l) o5 K) t8 q. x
{) j2 X! h$ v: r
// 禁用发送中断
. Z+ M9 j% K( s' g0 R UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
! T. D ?. H# `6 i }6 ? b6 d6 o$ h: g0 v1 g+ X% R
}0 R( u1 ?7 g! R7 R- ?+ |
3 D3 k2 m' W* z' a0 i // 接收中断& K3 k' O0 Z! ~3 i
if(UART_INTID_RX_DATA == int_id)0 d; K+ l5 ]7 `0 L) D
{. W+ S O/ Z5 {# q
if(status_a0==0)) j: R2 Z9 ~ W n
{/ E0 i8 z$ d0 I
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* ?3 N3 H5 Z/ ~( e- `
if(a[0]=='#')
1 b! }3 w+ C; X {
: ^6 ~' q5 U0 y: L6 n status_a0=0x01;
# H$ C3 _- |- w: [5 g, l0 p status_a1=0x01;
% }! Y5 p" M* E }3 z! }/ B* V- I; g. M- O
}
; t* {! f. _4 r& o, G$ } if(status_a1==0x01)
5 N; u K1 e+ b# b9 X {1 J7 V3 o3 x; P3 y
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, B4 f# d3 P8 u/ j# E1 b+ d; x if(a[1]=='R')
+ c, K4 ]. b$ d0 H {
' b" h$ j/ _2 C' g status_a1=0;
5 Q) c1 w& O0 e$ x status_a2=0x01;9 F" b2 m4 q. ^/ ] v( E) r5 k1 s0 l
}# R d! I! o5 C/ `7 b3 }/ C
}' p) M9 P x- m4 J7 N
if(status_a2==0x01)
: k' ^, ~! S* q& K$ D! v {
" X: R& g3 |0 ]% C/ u" R a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- j% b: u4 ?3 N
if(a[2]=='A'). G8 s( P. V' _; T: M
{
7 o" c! K2 F" Q; d status_a2=0;! {# K$ W6 J) A" t1 M3 n. q2 ]
status_a3=0x01;$ D2 P+ N9 x! y# F% r4 c. |
}$ G& N; B. \0 q, H5 [3 ^# s
}: ]# W8 H2 J' o4 U; j: D
if(status_a3==0x01)+ ?5 P9 J# x% {4 ?9 E8 Z' |# _+ W
{) \, H! U4 ]# w1 o M7 Y
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 S$ T: \; F5 @- K Z; @
if(a[3]=='N')& Z* a1 X/ |; R; ^4 ~
{
6 `* q" r. R7 M) n% |5 f, X* K status_a3=0;
+ P, }; x& I$ }/ u& b% ? status_a4=0x01;
: f3 l# A% Z# p& t7 H+ X" L/ ^ }" |: k4 D! J7 w2 W. M; i
}2 I6 \4 A4 k$ m7 @4 v" s- C* O0 M
if(status_a4==0x01)
& C1 E2 Q( X3 q# @( T {9 A0 f5 U% V' G, t5 i6 G
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; u+ K5 a' c' U* f* k% H8 b; B if(a[4]=='G')
5 W- I9 T( p6 S# O4 v {
( ^$ u8 G9 |7 C8 z- G& ^ status_a4=0;
8 X7 |4 b6 I% t D* s2 M status_a5=0x01;
. W5 o. H. F+ F2 ]1 n3 B* l4 b }
( D# H7 O1 |6 ^* c4 a4 d% A: u }2 ~6 I5 \' V8 O* D0 I- c
if(status_a5==0x01)
0 [6 e9 _: u C H3 m4 n8 R' @ {2 F/ ]2 |* e) M6 `1 d; V9 T: u
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ y% g4 m: E0 x, A; S- \
if(a[5]=='E')
( u% D. ~/ Y8 p4 Y7 H5 k {$ m- z( f2 U) c* p3 {( s# _
status_a5=0;4 }* h2 B8 L9 A A/ y; v. w x
status_OK=0x01;$ A6 W+ Z0 u# y2 Q F r
}& j y a) U J2 K
}: H1 \; w, ^! D* E
if(status_OK==0x01)
7 W* Z9 \. m4 x! O; n8 _ {! b* Q% V! S/ r
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ q8 m# K0 }, T7 G lengthrx++;( U9 i; G2 A4 j( N/ h
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
9 z/ X$ w" L& H' E( f, Q) n {) ~+ J" @$ E8 D, p4 V" y) G
RecState=0x01;
7 C9 K8 H) S3 H% Y" I }( ~+ ]. U C; |6 |
}; _3 i; P, @/ U G
" X2 A; p+ V9 Z2 s3 r* l _
}
* x, {- P/ C# T* \. R0 T2 p" n
9 w3 N. f& ], P9 j# X5 e // 接收错误! n1 J7 T8 I9 \: p, G
if(UART_INTID_RX_LINE_STAT == int_id)
1 ?; h. r# G4 O {* c- D; M, K2 v+ y) ]
while(UARTRxErrorGet(SOC_UART_0_REGS))
, h- {" e* Z& | {
" v9 F2 \1 H" c z1 l7 M* V* J B // 从 RBR 读一个字节: v, H( C: T: T2 v+ I& A# @: F- w- L! e
UARTCharGetNonBlocking(SOC_UART_0_REGS);
" R4 A1 t$ k2 Z: h: E; z1 q }% @) i7 o$ c+ ~8 ]$ y
}
+ e/ f3 i2 ?* ]
/ m$ v. H/ @1 D return;7 i3 t% Z+ [' r ~, |2 w& R
}9 {$ I, R7 F0 y
n: b: Z$ J8 `# h; ^) V
+ {# H/ o$ v( ?7 c( Y! B
' `$ v2 `* j9 I/ }* ^* [ |
|