|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
: S `. ~5 z5 C- C" J9 E) V( Z& Udsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
+ e f& |6 C) K9 a) R' }% C) C. |u32 UPP_Isr()
4 k* L1 ]! X1 O) }{4 q2 E+ g' ~' P1 l o6 Q- F
Uint32 intr_status = upp_reg_hdl->UPIER;/ h+ r) K; Z1 V& R8 `5 D. P
upp_reg_hdl->UPIER = intr_status;//clear
( W7 p3 Y6 z: Z0 N- i// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
* \5 W$ |2 U0 n' j4 e u32 ret=0;
/ v4 K5 @5 s2 f* M* U' z0 b2 h" L' U3 E, U4 s. Q" C( {7 Z
// inline functions
* B2 v0 u- v; U0 J- K while (intr_status != 0)
5 `$ Y/ q% V: `! K1 Z. G" h {
) o; Q5 G1 }3 a' | if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件6 r7 h# ?$ r; j
{
! E* g+ ^8 f' P! u& k7 t4 p// Log_print0(Diags_INFO,"eoli.\n");' W6 t2 S, h$ b# M$ u! O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);1 _. \5 l3 ^: V5 c* h2 x
}
. a: j* l* q1 \: U; o9 U4 ?, ~9 O7 {, H. C; ^) N" ]3 Z7 Z) I- P
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
7 x+ j4 t) G! M7 c: E# K5 D {5 D B# f }/ X# ?( B& }# e
Log_print0(Diags_INFO,"eowi.\n");
& J7 `' \$ j% \4 {' C, _& K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);9 X" W7 g9 |1 ?3 S5 g
upp_interrupt_count++;
4 o# P# t! o4 |+ u/ | upp_interrupt_eowi_count++;. a ]: d, ^) v0 {7 o% N
2 c! o0 T8 J8 i
#if UPP_DIR_QI==0+ G* b0 D, P1 Q7 u! {
upp_dma_receivestart();6 ]7 B( y) D& |: E/ i s- P) C
ret=1;
6 g5 `4 A4 x" W+ G) ?4 B#endif" _) Y! r, [. v: K2 }/ a9 Z
}0 `1 ^' y- G2 s2 x
/ m. K$ e' t( S [6 m. {: U if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件$ V' J8 X0 `; i4 f3 @* Y& ]
{
: Y$ r/ A- P0 ?5 u2 b4 s" F Log_print0(Diags_INFO,"erri.\n");# e) o& j, F3 m% T6 y) N5 G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
/ w/ e7 U( t3 |$ [" O6 @# n( r) ~ upp_error_count++;
; Z/ g) [8 I2 ]( D( ~ }
! [# F; k" j( d
, N d# `# Y" M- d if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件+ K7 \1 ^0 C; F) G
{
( P* D' o g: I, C" c: z8 O' k' E Log_print0(Diags_INFO,"uori.\n");
3 y8 D9 F' F/ I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
: C% d! z" {" A upp_error_count++;
7 W$ h8 l( C# g' Z: v }
' S0 L" q0 C" M+ _) j
9 ?& N# ^, |& e+ j' o0 p* m: s& f if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
/ l" m; X- _$ W. y {
z0 Q8 {4 b3 x' U: F; O% I Log_print0(Diags_INFO,"dpei.\n");
, a+ L! A2 k0 R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);; O% M# ` M# M* k: P% C9 U
upp_error_count++;$ w$ O' N4 E7 @5 t9 E
}
) n8 X7 k, `" \1 Q$ d8 K
6 H" c5 [' d2 Y) l5 P if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
8 \8 Q, U: a9 r/ K- P" L {
/ |9 I( @; d! d- V// Log_print0(Diags_INFO,"eolq.\n");" w2 Z; o* M' O/ w7 _4 @4 ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);4 M; \; A( W5 F, u" L' e
}) s1 g; X. F, g4 ^) Y+ e
& `, N' Y0 A4 Z8 k. x' ^ if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
) }' O2 { ]+ A0 a: y$ W {4 i2 X4 ]- _2 u& S- |, j
// Log_print0(Diags_INFO,"eowq.\n");
8 P- h+ G/ Q0 Z# W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
% K+ { z; _( W2 [2 G' i upp_interrupt_count++;+ X" L# w+ x- d1 G
#if UPP_DIR_QI==13 I7 b; T( B! z/ x6 R. ?2 j3 N2 v
upp_dma_receivestart();6 @1 \3 l" f+ P, v9 u, x
ret=1;
, V9 v8 n2 P4 e/ W Y#endif
) \* ]% g' {/ J6 Y }9 A5 t$ ?$ g3 Q* S
% ^0 P3 |" d0 Y8 ?+ S
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)- {; s* H0 q3 o* @; x) ` [
{
# P" g2 E. C6 q6 M Log_print0(Diags_INFO,"errq.\n");
) T. O' @' o+ Y1 h# T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);7 b6 x$ E1 M) w* \% W
upp_error_count++;
( v/ @! E" ?% h. P- ~ }
' ?" m* E q5 w" a" E5 }& M7 f ?6 P$ d" ^
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)3 W7 \, Q K) c: \, A. _ G! J# x
{7 k* O2 y* b8 M
Log_print0(Diags_INFO,"uorq.\n");
8 q" t" f) G0 u! m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! c L8 `# Y4 ` y+ l5 D+ x1 H upp_error_count++;
6 d2 U4 p# S1 ]: t5 h }6 }( R7 X1 K7 J4 J3 H
2 l: I5 R4 g; R, K1 _8 O! V* C if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)' B9 c2 D9 y' r$ u; A% d
{
# M M5 l8 O! l( z# K: W Log_print0(Diags_INFO,"dpeq.\n");
' a' z' k6 |* \+ j- V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
' s6 {8 |; }; z upp_error_count++;
( w4 |% B/ N3 i0 _ }
9 q) I9 z, p0 ?( l% w- {- E( B0 V$ `! u1 D6 |
// make sure all interrupts are handled( ^+ ]2 S: m; q8 g: C( c% |
intr_status = upp_reg_hdl->UPIER;
: W- w0 M' B# S5 U: K$ _ }
% L. D* G7 p0 h a+ j5 l9 k$ j {- r. w* J- j* Z3 R7 U5 L6 k. n
// finally: write 0 to EOI register
8 I4 `1 X s; |. R7 F upp_reg_hdl->UPEOI = 0;# t9 d( c- Q3 O g
return ret;/ ~& ?! _) d: q h% e/ n
}
$ Z" ?. g. x. z" ^! ]: E8 xdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
' l, x3 S+ C) ^! v, z#define upp_dma_sendstartQI(x) {\1 z" ^9 r( Y1 C
Wait_upp_SendReadyQI(x); \
; A' Q; A7 f4 R& g upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
, C2 N- w2 d9 T _7 s/ d3 e" N( l upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \+ [2 W% l& }8 e6 h8 u
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
+ k6 Y- D" h1 O$ ]: ^& S! A R- ]7 S }# M/ J7 l% s' A% y3 g8 X
; t2 W5 F9 y0 x* y2 w8 w2 Z& E8 G; v4 a& I$ G% k
#define upp_dma_sendstart() upp_dma_sendstartQI(I) L5 E2 O* e5 P" `; v! z; E
8 c5 d2 Y; R- m
4 E$ T! N# j) u/ i. E
想知道uori错误是在什么情况下面出现的,好做出修改。' L% _3 S: Z& C# G# Y
# l( Y! M7 b) { b/ k6 v; R
; T% p* x& W( c4 M |
|