|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?# R, H( y ]3 h: V) V' i
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:: n( U( Z% Q9 v4 R. j4 U; ?
u32 UPP_Isr()
) @9 z: ~! k! X) O: e{
( |8 T5 B: Y% C5 X6 y! [- t Uint32 intr_status = upp_reg_hdl->UPIER;
9 `2 B! [4 `* @( q) T* d& S upp_reg_hdl->UPIER = intr_status;//clear3 q. Z) F. l2 d P4 K. f& n2 s
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");# n h$ M' |8 |- R
u32 ret=0;
, u0 ]0 z2 q: g% q% ~
) H6 l, N) D/ a" u // inline functions
& R6 N( I: W' G: e( c2 X; h- c while (intr_status != 0)# D8 i5 ~: c+ v5 }+ [2 ?
{! y1 k# E2 B4 s2 b" e6 W
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
0 s: @' h: V7 z- K7 P {; |2 {/ L2 y7 a x1 q2 ?9 E4 L$ `; F
// Log_print0(Diags_INFO,"eoli.\n");8 C Q/ `0 g# z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
/ t( O& W, U ^ }
! p4 m0 D% V3 A% H* D
1 L: I1 }# I3 b( i. s& I& B1 I if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
+ Q9 O) e; L# f' m2 A% h {4 D( K% D( h" m9 ^( Y) ]
Log_print0(Diags_INFO,"eowi.\n");
% {2 a. Y/ W' C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
5 O* H k5 K0 p9 ~0 M! S& _1 g" [* G3 M upp_interrupt_count++;
( J/ I) w" ^. O, L+ J4 r upp_interrupt_eowi_count++;+ b. g: Q5 m& n% {9 M4 }4 ]
9 t; k. W) C# Q, s4 L/ k2 f) G#if UPP_DIR_QI==0
: F5 |1 O/ l2 F3 e/ I2 M upp_dma_receivestart();
3 Z) \) m# c3 X$ v+ Z/ @0 l ret=1;
% A8 R. z* q2 P#endif; l9 Q* x+ Z% O1 Z( F8 f
}. o2 f% f! |' O/ S* I
+ O: F" D6 a* k& _- o) ?! O if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件" G( S T9 x$ v6 l
{
' s! ?+ H! E- J* x3 d Log_print0(Diags_INFO,"erri.\n");; A5 s0 z4 Y$ y: l! L4 W
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);7 \2 `: g9 B. g' G; s6 l
upp_error_count++;
" O' l1 N- K8 H& j2 E }
) |# d, |1 }4 j# y6 C- M
I! A! b' r$ _6 a) u if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件* M- m* e: V } Q6 e4 U/ R
{
% y. x* D) z3 K" d7 J0 E& Q% b Log_print0(Diags_INFO,"uori.\n");( K# G6 K( n1 c2 i1 W+ }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
1 I5 V: u/ F$ D% e upp_error_count++;
( k. C T8 }2 P9 ?* V1 l2 m, K& B }
1 L' H) @- @) n5 w" V4 c; p" `7 w& O: {4 N& h( ` G( y$ Y: w
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件/ w, d2 M x) a9 [: z
{
, @; J3 U) C. Z7 I Log_print0(Diags_INFO,"dpei.\n");0 a) i( i* X4 b+ ^$ T- M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);" R* f" z, w" G
upp_error_count++;. Z1 B- _: B! q! @. x$ n Y
}9 q4 \: D- l/ T! ~$ v2 s* ]% h& C
$ B# T8 y* ]1 U1 E
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
, T3 o1 m) n4 c. ~; ? { I5 F" ~7 b8 n, s
// Log_print0(Diags_INFO,"eolq.\n");8 c1 N0 ^$ h" T; ^% u) V. Z7 ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);! I8 E& D: j r9 G
}
% v5 H2 b7 l$ ~8 ]& k. y" [/ P$ E4 @9 j7 Q& x4 o% }' e" c
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
; P) m" O" o* l# j8 v {3 \; X/ t1 O% ~- d' ?3 e
// Log_print0(Diags_INFO,"eowq.\n");
5 {' c, s1 U/ S, Q, d% z+ H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
5 L6 c! r% T0 Q8 A upp_interrupt_count++;
) Q7 K3 I0 f! l6 [* ~. u#if UPP_DIR_QI==1
; Y, |$ P' N" c+ y& k% W; B upp_dma_receivestart();9 r" n! b; r3 ^3 M# A3 {; G8 F
ret=1;
. l- B, T+ G. ]: \#endif, X% s) R: q0 e2 t
}( ?# s- _2 _# s9 K
+ D5 p E) C2 Q: Z. x. b% c if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)- r' d# J0 d7 e: l
{
Y0 H; z+ a, B- @- u+ g3 k Log_print0(Diags_INFO,"errq.\n");
' }$ l9 s8 A& o# ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
F. H* t$ X1 O/ F, y upp_error_count++;
% V( } T: j4 c1 f% M( B) P }* e$ s5 V3 `$ s
8 d N; T) G# E. e9 e& j+ S" D. K) w
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)% Z+ X8 s% ^; u5 S" ^' q! l5 [
{
! [4 K9 a2 _. b# a- g+ V _ Log_print0(Diags_INFO,"uorq.\n");5 N6 I2 W: ]+ ^5 a3 J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
( c5 w1 K* D. e+ ?5 u* G7 u9 m7 i upp_error_count++;2 s( r; n8 g3 E( e; [
}
& }: {( `' j K8 G* c, X6 n- T( D5 F: b; E8 r
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)# P; V) A% o% t t1 `& ~
{
( ~6 H6 M* ]3 \$ W& [1 Y Log_print0(Diags_INFO,"dpeq.\n");
& o4 {8 s4 h4 p" c& q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);* ~# P5 d. @; h" ]. T0 S) U
upp_error_count++;1 q1 E7 u+ f! V- E! a
}# I- r7 L) {9 r3 t0 \- e1 f
+ j( B' O" o+ u- c9 e! d // make sure all interrupts are handled
* R5 X; _' y1 B$ e, P- X3 b intr_status = upp_reg_hdl->UPIER;3 `8 J7 K$ F4 K0 ~1 `2 L
}
, M& s: c8 L+ F- j/ c0 V# w
/ Q; ?( f0 V h# p) p; K5 B // finally: write 0 to EOI register5 a4 p# W+ U1 [! V2 ?
upp_reg_hdl->UPEOI = 0;
$ x1 n/ q- G3 t; \+ r4 c: h! { return ret;
. i& ?" [1 B8 F% p# t& b0 b}
: n6 E0 q+ @( @. X. zdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
* H8 l! c/ V9 R6 ~' k" J#define upp_dma_sendstartQI(x) {\
, \. F4 g! \4 S# ? Wait_upp_SendReadyQI(x); \ Y7 g4 z; r+ j" O1 W
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \6 c0 M$ t, Z" l
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \: Z& ^2 I/ K+ c1 n8 [, k3 W, ~
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\4 f+ g3 G6 W0 e: @9 c3 I3 C
}" ]3 S4 N5 N8 c! Q) f" B
: L- {5 ]7 V* p- Q
, `! u$ w' M7 h
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
' [# L2 C& Q1 t# v! C" ^/ ~0 d% U8 ]6 h2 u$ ^. C
) F8 U" o! w; e3 M' q, V# g想知道uori错误是在什么情况下面出现的,好做出修改。
9 Q* x* q9 K: y, W
) \. \) ?' c' c8 Q3 C. J# P, }+ W6 t" [0 w5 k2 s* Q
|
|