|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
& Y( | l7 l6 @2 a! Mdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
& H* E; b. B* o# du32 UPP_Isr(). E% z0 S' [ A( [
{' t% \ y( e' Q# |" {! x
Uint32 intr_status = upp_reg_hdl->UPIER;
) R) S! r+ U, G: }( G9 ^( H upp_reg_hdl->UPIER = intr_status;//clear
2 U1 B! y9 Z4 x8 @// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
. ^' b6 u5 X( p) l4 o u32 ret=0;# q! ]1 E1 U! `
c) ?& \* _; Q8 T- ?1 |# k // inline functions) D. f. G8 X8 D6 I
while (intr_status != 0)$ e/ |% }% U$ p8 ~! H! R$ ]
{
8 P" ]( F8 k. K, |5 M6 e if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件' L4 p9 r# e; a9 w0 @
{
" e) J0 r9 B' _, U4 y- B& C// Log_print0(Diags_INFO,"eoli.\n");' }, R& @4 N+ {0 _6 a" H) l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
- _+ O6 x4 z1 q: G8 u- f" z } W$ x+ I2 {! {
) h+ H& V4 e! x; {& Y! c" u if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
$ Q! G6 Y. G ]( V {
1 X: B/ g6 v7 ?4 }6 R) n Log_print0(Diags_INFO,"eowi.\n");3 q/ H* Y3 X0 i% S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
, `7 b; T7 ^# A4 G5 E upp_interrupt_count++;2 s" V# s3 n& b! ?: j) H
upp_interrupt_eowi_count++;, X7 I) h0 f* L7 }
+ w4 b+ v: x R3 o
#if UPP_DIR_QI==00 g E) W$ @* U# u4 t- T4 v
upp_dma_receivestart();
* ?+ `2 d4 b4 O6 b) a ret=1;
. X* G2 Q& a3 k7 e1 @6 ]#endif
5 a; F, |4 S' `$ _" b n }2 y2 C y+ N2 F8 L
: {% g' n& R+ ?& c, v6 Z/ F if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件2 _ L& ^9 ^$ e" a* M) e
{+ O- ? @, y' x- X
Log_print0(Diags_INFO,"erri.\n");
7 P7 b& \3 ~$ M: q8 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);# J. j3 y, n' o1 j3 l7 _" |4 O
upp_error_count++;
! r, b* Z! @( S& j0 ]. ~ }
3 j5 D4 g0 M3 Z" |4 n7 x; f0 S! S, h' z$ R/ F5 r4 e
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件9 w" q. o8 s: Z C" ~
{$ p1 K. \7 z2 c5 N6 x' w
Log_print0(Diags_INFO,"uori.\n");" b" @) r3 t) e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
0 B; h/ s" f$ T* }3 u upp_error_count++;
2 C. [* S. Q* i }' q3 F5 K: x) M I# k* W% y
! T' |/ d7 w7 b& f if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件+ T, t0 ^( n6 c
{4 R5 @5 T/ x; V& I* q
Log_print0(Diags_INFO,"dpei.\n");
) r% D1 O4 S9 `- _) X! q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);) [) Z: D5 {' x1 K3 E
upp_error_count++;" a9 K6 I0 C; s% z4 P/ d& f* K( U
}( S9 ]- b- I! \6 Z* ]
' M( Q/ b: @- S( I3 U$ S if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)8 z+ n- a* |& f( E# p5 H; n" Z
{
$ _0 J+ S8 ]' b* @% ~// Log_print0(Diags_INFO,"eolq.\n");+ Q1 E+ E& h8 _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);; w t. U) G6 _+ |" j: @' ]
}
: Z( }8 J1 t, q! Y. g, w. [! e5 l% X# }
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
9 f8 f4 l. ~8 b* t7 a, X {! V& U8 O6 T6 }/ v
// Log_print0(Diags_INFO,"eowq.\n");0 h! h# V8 x5 T* r. S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
& z3 s7 C! r. \2 j upp_interrupt_count++;
0 K& } X9 k# S Z/ @#if UPP_DIR_QI==10 m c1 [3 k. i' i+ R$ w; L
upp_dma_receivestart();+ P: j6 D& t7 c% q: e% V
ret=1;
2 h5 x! f, [( W3 F4 `3 g#endif1 E! W0 n& a" F. f
}9 a1 Y2 \8 k, t$ H1 }9 j4 C, L) k5 [! Z
) A& f+ P5 ]8 c/ n/ ^' Z4 e
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)4 Y3 \6 m$ k8 Z
{. k( o: f1 e4 ~* e
Log_print0(Diags_INFO,"errq.\n");
' A; o2 K/ U0 [; c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);- }+ ?0 X# B2 n$ T6 q' C
upp_error_count++;- o: v2 q1 [; R) z0 ]- e7 W0 k
}0 x1 _! W! d5 B# S3 v0 o, Z
$ ? N; ]: u- B& D: X" I* `
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)4 a, u! n( ^3 i
{9 @* Z% Y ]+ [; X- ^
Log_print0(Diags_INFO,"uorq.\n");
) y9 |3 @8 m- v1 i0 j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);& M# q" P+ a3 r' @0 C+ [
upp_error_count++;
9 K3 d' A$ r. ^ }! \! i. w* D- J' E, L; y( X+ S
' g* _: u, ~4 {- L, p, O1 k if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- H/ J g$ F' u$ Y+ Q; U Y {" T: `: [$ s+ D1 M3 K
Log_print0(Diags_INFO,"dpeq.\n");% X- p9 y1 v; K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
' ~: ?/ m' p- n3 f9 A4 M' e) W upp_error_count++;
, M. e4 U5 R: B( p- {; b1 b- z! s }3 K3 q5 @' p/ N# u- C4 |
. @4 W1 W* G, X: c' g8 H+ F% x: H // make sure all interrupts are handled; R: j1 N( L5 M* g3 S: e# T: d. E
intr_status = upp_reg_hdl->UPIER;% v. C( P; e& j( s
}1 Q9 Y- r* ?6 a, `& t. b
' M, R; C1 I( D: R7 L. s y' o
// finally: write 0 to EOI register! V" i M/ w; I2 n* R
upp_reg_hdl->UPEOI = 0;/ N9 ?( [1 t/ y! P0 _* Y
return ret;
7 n7 i! x) \2 Z. z+ _8 G}
/ M& o! E) t( J% u$ }! ?, P* xdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):2 W$ [/ ]1 Y6 U
#define upp_dma_sendstartQI(x) {\
# |; F: W; c8 E% u Wait_upp_SendReadyQI(x); \
+ d3 g0 Q# T9 z" V6 E. V upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \5 u4 o, v1 K5 u' {' Y( k
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
2 E. b2 P4 R5 ] upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\1 c* z! O4 c; B. T, r% z5 L- ]
}
; r: Z# g4 R" I2 L `' e0 e) p: u6 f9 D
. j8 m2 {$ \/ I5 ~! w3 p" ~ e
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
?8 j3 @* C) v. }/ j
: z7 q9 I0 `2 Y! p- ?. H# c6 c3 [9 K w: D) {8 b3 D
想知道uori错误是在什么情况下面出现的,好做出修改。
* l* p& N5 `+ _) Q! S7 Y0 y8 h4 E& V" K" |( s4 I3 V
6 C. `6 o- i- N0 @5 j1 ?# ?
|
|