|
OMAPL138双核通信,现在需要DSP核中的UART0接口。2 h) P7 b. D" B0 d. @6 q, U* \) a# E
我是在DSP初始化这不太明白。) ]( Z% A* [3 S3 X' H, S
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。, r( l# f9 }% M; t* @3 J* ~+ B
; _3 J; Q& Q x, y/ N2 N
, m* J! ]( X" h- x. ^( ?( U首先 PSCInit();//UART0使能
?0 J/ q' D! dvoid PSCInit(void)6 [; R) Z: Z5 w$ {7 x* i% S
{
$ Z9 ]0 l3 N8 f; o: H. m // 对相应外设模块的使能也可以在 BootLoader 中完成
) N2 h/ G: T6 z3 J! ?# Y! _% H& D // 使能 UART0 模块
% V$ h- @ J% V" B# C K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
* F" C0 `& C+ r, J% W! @}
r8 X" F0 U8 }( z/ x& f1 H E) a+ ~6 i! ?
% t" s1 }2 s( B7 D然后是 双核通信的初始化 AppInit();/ D/ \, G( T: y4 _
void AppInit(void)
# Z. G9 t5 }' b0 w$ r{
2 b- Q7 h6 g0 v: C& x /* Structure to initialize IPC (see Ipc.h for definitions) */
/ K7 z2 x7 J' \8 t+ z3 ]4 P6 I struct IPC_cfg ipcCfg = {$ B- @' Q3 D) m: x+ P. g
IPC_DSP0, /* local processor Id */ `: t( {! S) Y# I, L& F
IPC_ARM_HOST, /* remote processor Id *// p. T/ k8 f6 N, y" f& V
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
# j' a W7 g% ]( y, z3 a( T- f IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */6 l3 b; w3 W- K Z) w: G# w' c# u
NUM_MAX_EVENT, /* maximum number of events to be created */
% X; _2 N4 F, p2 w &ipcPvMemDsp, /* local side private IPC memory */
. o* j, P! Y( H9 Y &ipcPvMemArm /* remote side private IPC memory */ [2 I& [( G5 c f, r7 j
};6 k& U, V* q) }/ e. d' i( \4 w
IntDSPINTCInit();5 i1 z+ v8 _+ `/ m7 N
IPC_init(&ipcCfg);6 J7 z7 I8 E8 q: A! Q$ N
IPC_intRegister(C674X_MASK_INT5);
6 a1 a9 e/ t* \/ j7 p/ u- w iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));- P8 k/ Z9 I R x# k/ l h
* ?0 q( U0 \2 Z1 s" k. ~$ u3 J /* Enabling interrupts for DSP C674x CPU */: A) a# i' F4 R0 I
IntGlobalEnable(); /* Enable C674x global interrupt */
: S9 j+ s- A7 D2 h iAssert (Notify_start()); /* This will enable IPC interrupt */7 L$ j% {+ S; n9 r
}: E1 Q2 Y+ J' g7 K4 q
/ P, O3 f8 X! v6 f
然后是
+ a, j4 h7 K; Q% o, f1 y. ] // UART 初始化2 c9 ?) f' {6 m- r% O9 B* e
UARTInit();0 f9 N/ X& ]4 S$ I O2 S$ ]0 v8 ]
2 ]! O/ ~+ W/ Z; n // UART 中断初始化
1 C/ z- O7 E* I UARTInterruptInit();
/ m/ k7 z, [& Y5 p+ x1 @0 V+ N6 r% v* y- D2 z
3 p+ X# N# N6 H6 O& }! Rvoid UARTInit(void)
" p8 j7 L B9 [: x8 j% W1 }) p{
P8 Y" {* ^0 {9 H6 q' t // 配置 UART0 参数/ O3 ?, K) ^+ d+ K2 J2 S' j) F
// 波特率 115200 数据位 8 停止位 1 无校验位! B! P8 I/ _9 C3 D$ {+ j- u
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,) g4 a4 E# Y+ `; u. a
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- b5 N1 B( L1 G4 e- _
// 使能 UART0
1 W1 r4 n. a4 x UARTEnable(SOC_UART_0_REGS);
/ p) ~ o/ B: n2 p9 w) A. n6 j# b. e' A% F& l r
// 使能接收 / 发送 FIFO
" _8 o8 d$ _ l; e- S" z! l// UARTFIFOEnable(SOC_UART_0_REGS);
* z; Y* i1 ^9 u4 |$ S- j1 m
; [ t$ ^# w4 ?# c2 c$ {9 N7 _8 ~ UARTFIFODisable(SOC_UART_0_REGS);8 |' e6 s: h2 x1 f
; j8 l/ e* e, l% }+ b# L // 设置 FIFO 级别 接收FIFO的级别
2 I$ C M" U5 _. f// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);% P' {: d5 t# g6 v4 F1 h
}4 D$ I% f* q- v$ T1 \
, l# w" _8 F$ r) b/ n/ y% ]& [7 h% _6 M+ }8 i0 K( r1 e, w
void UARTInterruptInit(void)$ m$ q' P; `% ?" `7 G- z& W
{
) j, K- q4 y( T1 J2 H IntRegister(C674X_MASK_INT4, UARTIsr);
8 Q- y# q1 V% i8 h* s- r J$ ~ IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);' W" w4 _3 x- m6 }8 ^/ W$ \
IntEnable(C674X_MASK_INT4); H; f/ H; ?8 E. u
+ X: q9 Q8 `2 C$ v: `
// 使能中断
8 I( v2 J" W+ i0 p unsigned int intFlags = 0;
% O# G y) G+ n! O. x/ x intFlags |= (UART_INT_LINE_STAT | \
9 ~2 _ E1 d7 n; D0 Z7 r4 ] UART_INT_TX_EMPTY | \
; ^; C1 `0 j, r. Y UART_INT_RXDATA_CTI);- r* G1 ~4 w6 E) ? y4 _
UARTIntEnable(SOC_UART_0_REGS, intFlags);
2 \1 h! i" W( e" `3 U4 |7 E3 ~+ C}) k1 F/ _! m7 d: U0 Q8 }
7 j$ n7 Y0 C7 z3 _* h
$ m6 G+ H- u3 A7 Svoid UARTIsr()
, V1 X, ]) n; ^6 [: U1 f) ~{
: ]& I; \- s* n1 I, j: C static unsigned int length = sizeof(txArray);' R" l6 ]+ n; D5 d6 \& O2 S
static unsigned int count = 0;7 R" R9 v, Z6 r( `0 F6 S- E
unsigned int int_id = 0;
; Q$ w8 N( P8 c, q! K h6 m6 _
0 y/ N& b; T+ m9 P2 {3 C1 C+ X" }3 N8 `
) x$ ]% v8 }1 |" J B2 [$ q) e // 确定中断源, J: X! @) F2 z# K+ T# r3 f3 l: f
int_id = UARTIntStatus(SOC_UART_0_REGS);
, F8 s2 v! N# G, j, j8 o
& X, s0 a8 b: @& R$ x/ | // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。3 X! ~: C) v! ^" }6 T
# ^5 h( m9 i" p, ~: L" a3 I# H2 C0 v& d: i
// 清除 UART2 系统中断9 H2 I) \: o, Z6 W, ?8 k4 h" k; U
IntEventClear(SYS_INT_UART0_INT);) ^. I a( }0 _* L9 z
4 u+ N! B$ O8 {
// 发送中断
5 |6 g" Z- a$ J/ h) T" \ ~ if(UART_INTID_TX_EMPTY == int_id)
( t" E$ ?/ @) u# J% _ {
# a) O+ f7 v" m, \7 I. y if(0 < length)% a$ @2 d# f0 o% f, B4 B7 i
{6 {1 f( h; R; @- O, ?0 J
// 写一个字节到 THR
3 y/ n: b6 X# h, X# m3 E UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);! O9 e8 @, n; y. E: Q
length--;
% H. X) d0 e3 O1 ~8 Y- a count++;
6 t" ?& H: q( b. D8 t4 X, q4 V }* u! z7 G8 L, F0 M
if(0 == length)
5 x% n+ q: J# t3 q {/ v9 G% h0 \8 U
// 禁用发送中断
. ^, M; T! x" q* O; b- m UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);2 K0 b: t1 h1 ]- d$ S
}
/ t+ p! q* ?, ]5 D% y }
; y2 [1 M; g2 f- Y! |$ x$ l4 O0 Z- y$ n) T! d2 e
// 接收中断
6 p9 `( i" D r1 ^; i if(UART_INTID_RX_DATA == int_id)1 G" Q& P( {% h: |( E: u7 M% A
{
8 `2 A' v$ ^9 N: b if(status_a0==0)5 U9 ^" ~7 u& D; J9 S1 D
{/ i; [- b3 T3 z: e/ \/ \, @. B! W
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 K3 K- S6 B8 ?9 N' U6 T: m3 p if(a[0]=='#')
' d L5 F% I' ?/ V5 X# f0 J7 y- B {
4 Y' J! k, ^+ i6 f: u status_a0=0x01; ~. Y' I( ^( s8 ~3 q& @6 @9 ^# T S( l
status_a1=0x01;
$ a+ z3 c0 s: l' o/ b }/ Q! Z( o) a* p
}
: q+ Y& L* `/ x7 k# d' y if(status_a1==0x01)3 m3 \3 ?& ~, P/ O. U: w& d0 J" s
{
9 U5 b6 x/ c2 A8 n a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. m7 o" u8 \. K' R( N) ]$ D if(a[1]=='R')9 M: u4 r4 N( ?3 N S: E# w& t9 F! v( I
{
1 F% ~8 f% r& V( a9 u: y status_a1=0;, q& Q' V2 O8 M: N" U# g5 o; ]) y" s
status_a2=0x01;
0 k" w1 B' c& z9 R5 v8 | }
5 E$ I' `5 A( v, R/ ]4 I4 o } X" ]0 g! d) U- q
if(status_a2==0x01)
2 J* d4 x2 N8 u8 b; U" y {
2 q6 }; S$ P5 j a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);4 a( n ^. x# x" \
if(a[2]=='A')
7 E! _% |% T! A {
) M0 h% K' s) e; s status_a2=0;
9 o0 t/ w1 S" |# H status_a3=0x01;3 J1 O/ [% Y1 T5 B+ z
}$ E; r o( Z7 H0 r" U ] e
}& u# H1 V$ s% f& O
if(status_a3==0x01)
9 n; F% j* S; g) S$ d# A2 i {7 x: A( W- t( g3 e" `/ ^
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 C( s& A3 z; E if(a[3]=='N')
- A' c" a8 [. g; V4 B$ D! \ { B/ ^4 e/ ~+ j- f
status_a3=0;8 H0 D" y$ q5 G9 S& P# R
status_a4=0x01;
8 U# F; z$ m# r$ F. ?2 Q' t }
9 G' m; t1 o* N" S& f- D }1 n$ ~" \1 T# D' R6 v- t" @& k9 b
if(status_a4==0x01)
. L: c8 E( I L# Q- e {# V: r7 z7 L8 w t6 a
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) R3 b+ J3 c4 |
if(a[4]=='G')3 N5 J2 ]7 e7 z6 d: I
{
1 Q; b3 j9 _) k( e2 ^ status_a4=0;
; r# j: W' d3 O6 Y0 Q status_a5=0x01;
$ D" f$ x2 Z P) J& C; @1 p ` }$ K$ ~7 ` r& z
}6 H1 ?1 x, g4 h) [& x- q, j
if(status_a5==0x01)
. ]/ m- E N) ~2 } {
! K8 m2 N& O' G5 h l% Q" Y a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 H6 b ^( L6 a8 u if(a[5]=='E')/ F9 R8 }7 d" _: [! n
{
7 C; ~ Y2 \: d _/ d* L e' x status_a5=0;+ F# l0 p9 c' X f( G5 p, l# F
status_OK=0x01;
9 @& \/ K" [# R }
3 E% o3 d: q% M' F }
- {; R U( k: y+ ]* O2 A# { if(status_OK==0x01)
5 s- g1 W3 C, w/ s {
( d. s" T9 L5 e5 y5 c2 Q rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 L6 u% F' a4 @. m1 v8 b lengthrx++;; e! F7 k' ^" N" N6 S' L9 v% u
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
; F$ \# A" s% `: Q& O, z8 O {
$ [, C. e# `' C9 K$ }$ L( ^/ }. f RecState=0x01;
. h' H$ f0 x4 ^6 { }
# Y! m2 J( m! q8 R' V6 ?' p0 K }$ m* Z+ y: n& L4 l8 L) {
. _& V8 J3 d$ l, ~% j8 N
}7 V' [ P3 x! J0 E
& n' y3 T1 f4 ~: B$ x3 T // 接收错误
, E7 B: E' I; b2 ?# @ if(UART_INTID_RX_LINE_STAT == int_id)
+ {8 R0 u1 n! o# M1 J {" ~: o! d7 d0 q4 e7 ?' h% e& B
while(UARTRxErrorGet(SOC_UART_0_REGS))
8 q A: [/ c6 |+ ?. l S {) D! I2 k9 j8 T* g& C
// 从 RBR 读一个字节7 {" I# y& K, B$ W+ F/ b7 ^. d
UARTCharGetNonBlocking(SOC_UART_0_REGS);
% y" T- M3 u4 c3 P2 k }' E. T3 {3 [/ H1 f0 O
}9 l# s a) M, `) h
8 u; i1 X" p/ H" T return;
1 ?* |/ b6 t. c$ D. _}
/ \% i' A8 e( I8 w1 t: _+ [ V' P' W5 G5 h! I1 \
1 F Y& E6 N) P
5 H: }5 H w. }, K h) G5 A1 p |
|