|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?9 e, O8 ]; ~) d0 q3 ?
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
: E) X" ^' z; X8 uu32 UPP_Isr() d' r( M2 r* [0 y7 M/ U7 w
{
; ] t# H/ A: O. e5 p/ G Uint32 intr_status = upp_reg_hdl->UPIER;4 q% q5 M2 y0 T7 F/ s( B- m- x
upp_reg_hdl->UPIER = intr_status;//clear
( z9 C( `: y9 X/ d0 e- R// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
9 O1 r0 ?7 e# a1 D( |' `+ z u32 ret=0;! D* l4 b( d2 G! O: T& Y7 K7 s
3 l6 t* K( u E6 z // inline functions
# I/ t6 `$ t& Y& C& Q while (intr_status != 0)0 C9 G0 `' }( v E
{& J1 M d4 F2 e+ `) |# E: ^0 j
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件2 q5 R; S; r: u H
{
6 P$ {9 P. Q0 E7 z! B3 r// Log_print0(Diags_INFO,"eoli.\n");
- U* w. N" C/ @% r( _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
8 `3 a; t$ e, D# E& s }( Z2 N+ X7 ^( Y: ~2 T4 J1 t" j) E
' J. @8 f2 ^9 p& V2 {5 j2 e
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
& r4 X7 S. E: x4 P {4 H t8 ^* ~( z/ U1 G8 ~: S+ f* E5 b
Log_print0(Diags_INFO,"eowi.\n");
! n* c8 ^2 E0 m/ v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);) M( o4 L/ |7 v# P: H* b l
upp_interrupt_count++;$ w$ @. G5 |7 ^& {9 e1 Y* L( j+ B
upp_interrupt_eowi_count++;' G# T1 {! \* @7 k& _
6 P' W; ?8 b: T% ]#if UPP_DIR_QI==0
1 y! M6 G+ O' ~ upp_dma_receivestart();
# v% H1 s( h& d3 `, l ret=1;
5 }! q. M8 _; m6 r- e: H#endif
% @5 ?* W% E, o# J4 l" o }# c+ r/ G2 L$ g. {6 G9 t5 n
' p2 j* X4 B+ @% i3 I2 Q4 h4 O
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件* @9 \: S* ^: p% S a/ a
{/ x/ D5 O: m1 u( [5 g/ E5 n
Log_print0(Diags_INFO,"erri.\n");* O0 z( B% P, B; C: h4 A$ Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);) a( a9 I4 _* L, {% [: _2 {, N
upp_error_count++;
/ d% \% B# f p" d3 n* ~ }
5 F* U7 y8 w: l* F( @' Q. _
9 H0 b) J% Q! g$ }7 T if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
q% v' t; M& n7 f {
. }! x& }$ s. q& N2 f Log_print0(Diags_INFO,"uori.\n");" U% l7 V) b* H' u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
- n+ k! d. V |9 `, `4 Q6 I upp_error_count++;
! |. A: M/ W' W. C# D* } }
5 R- B3 w! M% f |1 V) P) B! N( t7 q7 |2 b- _
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
9 P' T4 h0 X( R- i* Q) N {8 L& D+ N, w# M1 f' l& G
Log_print0(Diags_INFO,"dpei.\n");
! u$ N: x% t9 g# `+ W; R c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
/ g3 {$ s H; P; K% ?" ~$ |) u upp_error_count++;
! s& [' |, s0 w }
/ B, |3 I# I# l' q6 n; M5 P! u G
$ _7 W. M2 p S+ Z& L1 A if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
2 ~" o* M2 {0 n {% u! d. d8 u1 A1 T H+ ^ t
// Log_print0(Diags_INFO,"eolq.\n");
" U: i! C' A0 C: A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);" [# n, [9 i- T* H2 D. U
}
& h5 u% Y# w0 e% `, k( {6 q( h, Q
6 w( ]) \/ i: O* ` if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
) l$ w v' U6 K {
3 b. G- M8 V7 ]6 I: d }. c// Log_print0(Diags_INFO,"eowq.\n");
" ]3 X8 K) }- h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);" b. ?# O; {% K; j3 {
upp_interrupt_count++;$ @" D2 H- O6 C
#if UPP_DIR_QI==1
7 @( D2 P- o3 a1 R' x2 I' |8 d upp_dma_receivestart();
( {- i3 ]9 S* ?4 q0 p8 j0 B2 c1 S+ J ret=1;
W: N" e1 x2 C: p D; u- c#endif
3 t D3 l; y1 G9 B* r; ^ }
$ \6 q8 j. L# i7 C, m( t* V8 z6 }: s) i3 k/ W7 r' b
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
9 }; ^+ N+ Y5 f, I9 i9 A {: o9 i3 i0 F0 F" y& S3 c
Log_print0(Diags_INFO,"errq.\n");# k; J+ `" v% M, c
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);( F/ G/ F, {1 z5 {* X5 P
upp_error_count++;# `2 u9 Y: P4 D' R; q' a) f
}" u1 J& x& z- k& A- H
9 ], L' ^' j) q( N2 p0 ^ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)' S& ^' b0 ]) h# ~% h
{
, v5 L) |; Q9 r3 W Log_print0(Diags_INFO,"uorq.\n");, D. D7 R7 [) S4 ^) O" T0 @' L* E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
. m1 i" h* E/ r upp_error_count++;
# d8 @2 G9 ?8 r }
% v! r! p5 _5 y \4 w- h0 a* s2 ^" T( L0 t
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)5 v4 P B2 V% A0 B
{2 i) g1 j) J0 y& @) @
Log_print0(Diags_INFO,"dpeq.\n");2 N( p! O( T; [; g8 [& U6 I
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK); G3 }; M! B9 x' E
upp_error_count++;
! t. Z. e% g7 I }
! k$ Q* ^7 X$ s
; M3 S5 \/ \8 E _+ C- f, X // make sure all interrupts are handled
2 [; H R( T6 n( U& a intr_status = upp_reg_hdl->UPIER;. f# t' P/ P) E( ~
}* W( P% l0 @. H( t% n7 x
1 D1 d$ g7 h+ V" u
// finally: write 0 to EOI register
$ M- G% ~* J! ~* }, \ upp_reg_hdl->UPEOI = 0;/ p' W5 b3 A- d
return ret;
: p# k& U4 {+ p}
% v: D, B* N7 j! [: |/ ?dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):) ]* C$ J6 X* Y ?; R0 M
#define upp_dma_sendstartQI(x) {\$ Q5 o* h: o/ M5 U t0 `2 u7 K
Wait_upp_SendReadyQI(x); \( s$ {0 |$ ^0 i; W) S) M# [
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \4 F; {8 d0 Z5 H- M/ ?& o0 Z, F6 J6 U
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \1 B7 O; I1 _ F2 Q* E* s* z, m: p
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
+ [% P: { x [ }
( x3 A! g. p9 R1 Y2 B/ A7 k
" y2 O0 D$ @$ l( v! ^
# u! r2 W Y i5 v9 u#define upp_dma_sendstart() upp_dma_sendstartQI(I), L' a8 q- Z5 E3 Q
1 C1 ~0 {0 A0 L7 I; i' J, E3 H# T/ E& C- b1 m/ U+ f. _
想知道uori错误是在什么情况下面出现的,好做出修改。( ^5 @8 \/ M7 {8 V/ Q
+ S h# U8 a, |- O7 u
' x( f, b8 Q# |% s# s |
|