|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?) C; G1 H+ L" f4 o" g$ f6 ]8 ^
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:* O2 O# x9 M2 o2 A9 p
u32 UPP_Isr()9 A* @& C9 m9 `) S9 }5 t
{
% I1 c% i, L7 q* g, [ Uint32 intr_status = upp_reg_hdl->UPIER;
2 G+ ]" ?, I5 [% |6 F upp_reg_hdl->UPIER = intr_status;//clear3 r8 S N1 X, N- |: v( {
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
1 t( v/ |- K8 J, x# b# L u32 ret=0;0 ^8 o( F; Y ~+ x
8 j: y5 q3 i! |( q! l/ h
// inline functions* O7 B5 q5 t" D/ r j# W
while (intr_status != 0)' ` l$ d" t/ c* i
{
$ [6 i( p. ^: s+ Q- G. D/ c if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件5 c1 d& _9 W N# @$ o
{
) v. K: O! t0 p. W// Log_print0(Diags_INFO,"eoli.\n");
/ P" e6 c' d, ^8 W. ?( m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);! M% @0 z- n* l8 b3 `5 [
}# E" u9 i, f# M4 c% ?' D( p" X# g
7 h# ^3 Y" I, J P
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
+ v5 {/ d. Q; T1 w! u1 d {! a! V2 ^* e0 ^1 j% G
Log_print0(Diags_INFO,"eowi.\n");4 p8 h% E9 B6 `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);3 \ b0 {: B; y
upp_interrupt_count++;$ c9 O, @& U0 k1 I# W X$ C
upp_interrupt_eowi_count++;
, O) f9 J, Q* r& E0 t, i4 Y5 R. j; w8 l- e* j/ s0 w
#if UPP_DIR_QI==0" Q' U6 {" D$ }4 K1 F9 n& q
upp_dma_receivestart();
( n+ I! F" {" V' n( {! { ret=1;3 S/ }) s. d' H! j
#endif6 `# ?) l. r" i3 V+ O
}: r4 d% y* x7 z% o/ u, y
- t) M" W, ?9 I
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
% k. L4 p8 @, R2 m7 W {, N; |. u( _- y8 E% U
Log_print0(Diags_INFO,"erri.\n");
+ B2 A9 d$ v. D# w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
6 x- a% O. u4 R2 q' l I. P1 @ upp_error_count++;; R' }. `3 P/ G$ t/ H. \* \& p
}
" e" {, O' q9 e6 s! v* G; d1 M$ s% a! H9 l9 Q" x
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件, ?( Q& f+ m$ s# B5 |- W
{
7 Q5 n. z& d4 s9 Q( ~ b- C Log_print0(Diags_INFO,"uori.\n");! B* d& k% J2 M% V" m; V% ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);- c) O3 p7 \; E
upp_error_count++;
. V2 K) J' w" [ }
7 a, ~, C) n" T- Q' `
v% B. y4 n& }# O% p- l if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
0 G) K6 B; l2 B# X {
4 j# {: C1 o# f- H8 ~. D& A+ a Log_print0(Diags_INFO,"dpei.\n");
0 p- C I6 P# d) Y; s) ]; p" Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);! j1 y/ L( X$ Q1 g
upp_error_count++;9 W& u4 G& ^& s4 t G0 e$ [
}% p. g0 {$ n( g# E
" G( [+ b g& Y2 }: P3 z3 _. X
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)+ }: E0 R* g- d- z9 u, l+ r1 y( G
{
+ G1 C5 H" l- B// Log_print0(Diags_INFO,"eolq.\n");
$ }: c$ I, i6 }& c( w9 G1 U upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
) A- o6 X' w: D- C; { }
% k: ^% c" [& b
+ O: o* ?# \9 n( U$ N2 k if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)8 d0 t' r& o& _$ x
{
2 R4 ]3 n1 q3 H; C" X// Log_print0(Diags_INFO,"eowq.\n");
" E( z8 }* x1 `- w6 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
8 u! d( D9 p# y: O4 H- G upp_interrupt_count++;$ Q$ l/ j/ |' k+ m0 M% k
#if UPP_DIR_QI==1& \, A: T/ E9 `6 a3 Z/ Z5 x& b
upp_dma_receivestart();: q2 \+ ?! J; w j
ret=1;% A) Q( ]+ G8 F& H) l+ B* X
#endif( A/ ~- T2 F) A$ g. }
}) G6 w1 K/ l# L5 K% j
( N, p+ e& X `+ l9 k/ _ if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
4 q$ }2 A$ g6 ]% d0 L. W s {; ?! @3 w8 v' i& g
Log_print0(Diags_INFO,"errq.\n");
) G3 r4 a% Y/ r) V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);* e7 Y2 N0 T, d
upp_error_count++;
6 c' Q" [7 ]) c2 {/ c+ _- U, \ }- x* ^& R3 q- T9 t/ j4 `+ e+ t& N
0 p" t6 U: @) R; n+ ^0 z if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
7 G+ k( x* t* ?6 [! ^& g8 K% ? {! q$ A& ~! l- W
Log_print0(Diags_INFO,"uorq.\n");, b& Z% z" [2 f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);5 ^1 B/ X$ T9 }1 V3 l1 _! ]
upp_error_count++;3 M2 m. b$ U- `+ Y$ V% t& j% v5 Z$ T
}
8 X8 U5 o) A9 S- `$ U
3 o% U! Q; q: j! F; j6 U1 T if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)3 C6 A+ _( _& s; D
{6 G' r) f2 @$ M! I$ f
Log_print0(Diags_INFO,"dpeq.\n");
: C8 b8 q6 q" w, G9 e6 M# A8 `/ q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, `) x1 [# |* Q8 c! z' A
upp_error_count++;1 f @; @! K& Y% p, E+ f% z3 r
}
2 p# H; K/ }9 J) d" r
$ o9 }, V5 `6 F/ T$ K, F // make sure all interrupts are handled# y% @; F7 K* I7 R* J5 n. ~
intr_status = upp_reg_hdl->UPIER;. J9 N1 E" T1 @* C8 H
}$ w" ^9 x, ^- J, V
8 T$ X& @& { z, e2 e z3 I // finally: write 0 to EOI register. ]; ^1 U* a! b# n, [2 Z8 _
upp_reg_hdl->UPEOI = 0;
" n, V/ y5 r% H- f$ E4 Q6 ^: m return ret;5 k2 Q! s/ O$ a
}5 x6 L: ?5 F2 i/ l
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
9 D4 r! O/ p& \# X#define upp_dma_sendstartQI(x) {\7 X- P/ C; z5 u) V
Wait_upp_SendReadyQI(x); \' h1 i$ `' W Q; Q2 H
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
4 _8 j* ~ g7 R upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
$ ~ l7 x1 K' c2 \) e2 v+ P upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\ a5 d0 Q1 b O! Y
}, p& @5 R; p0 T( p* R% n; u
" J3 v/ ^8 e) o
0 J# v' w; a, D$ u( r# _, o#define upp_dma_sendstart() upp_dma_sendstartQI(I)1 \! J/ q' v# n: a7 p
3 \8 }2 f. x0 M4 e
! u0 s% F: C; Z2 R# G4 m想知道uori错误是在什么情况下面出现的,好做出修改。
' x, h% M; s- ]; k& h, ~% I8 {) ]+ L- J5 ~7 T
' z: s; `9 r/ |; x! z |
|