|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
* u4 v! F4 x% u: @( t! x4 ~dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:1 l' j* y" T$ v$ C1 ]* {# x2 k
u32 UPP_Isr()
5 y# _$ P6 k+ o/ |4 F- V, f{8 g! I" K" |; h0 P+ p0 `$ w
Uint32 intr_status = upp_reg_hdl->UPIER;- y9 @1 ~7 L- |1 n
upp_reg_hdl->UPIER = intr_status;//clear9 V* r" s. T- d& C: G$ I: M' b* `
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");" A6 T8 c& q$ e3 X. g7 b& y
u32 ret=0;1 f( f6 k M% c5 `# n( ]
7 L" y4 s$ }; J% Z' ]4 C9 o // inline functions! x- |1 g( q- K2 p% u
while (intr_status != 0)% U& i4 z/ e, s, T$ o$ f( I
{$ Z: o7 u8 d$ g7 {4 }) b: \" r, @
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件% F! D {0 a7 n3 g$ a6 m
{' ?0 U. c4 t; U0 e6 h7 S0 u: Z5 {
// Log_print0(Diags_INFO,"eoli.\n");
) h+ ~) ]* I0 O5 j' t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
+ |4 c7 J# a) G }
3 q5 S; C) D9 H" ]7 k/ V3 m
7 f+ U% @7 v0 B- D2 Y+ ~# u$ d0 {8 C if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
7 [& J& R8 d) M( q {
1 T3 T8 f( W( q3 W! F Log_print0(Diags_INFO,"eowi.\n");3 a1 _# u8 {) D: h: i" X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);+ o2 L* M1 ^( k2 u) E
upp_interrupt_count++;( x& y- k3 k% n7 C7 l
upp_interrupt_eowi_count++; X& Y" t+ D" r6 \
7 R2 H, u) x4 v" i* P
#if UPP_DIR_QI==0
& P+ }* i- r6 c2 y. d8 h upp_dma_receivestart();
8 t/ d* q3 F* `1 c ret=1;
& i- H& P# s. N$ @1 A$ y& Q6 S) X#endif
4 P8 u; l4 o# n# s }7 v3 b) t/ R S0 A3 i
( c% d( X& Z( w* E6 l
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件* |! j. j# ~/ Z% w
{, h8 a0 ~, k- _/ L$ F% X- T! `8 m
Log_print0(Diags_INFO,"erri.\n");
1 E1 T! |4 O8 @4 o: j/ K; X6 a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);8 T9 ?3 {6 Z! x% O3 V0 F) a
upp_error_count++;
% r, B1 Q8 l1 h" e' | }
g2 {; L0 r; c6 ]% A2 x0 w* f7 X4 ^" ~
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件" r# } \) F6 Y( b/ p$ ^1 K: }
{8 s6 ^. ^: |" s$ D/ n
Log_print0(Diags_INFO,"uori.\n");! Z% x! K& U! }$ H( j
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);! X: V2 x( e1 Z) F" q
upp_error_count++;
; o1 i# P$ N I# |3 ]- e$ k2 h V }
' }6 [) ^$ p% s" @- i$ T2 F
0 S; M" q' |$ m3 J if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件1 I3 }" I1 a! ]! _0 y# V
{1 \7 b* r$ ~: v C
Log_print0(Diags_INFO,"dpei.\n");
* V+ b3 T$ d0 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);% ~* q$ }3 S/ D
upp_error_count++;
9 m- T! h! x7 N0 P; E }
/ I) j7 I5 E, z0 ]7 ?1 s) F; r" U- C/ B5 {2 }
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
: R3 M1 t0 b( G' o& S* D& a {- j# m% F/ O% }6 S/ i, `' v
// Log_print0(Diags_INFO,"eolq.\n");1 I0 x) R% Y, B3 w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);8 Z7 b; \2 c8 y( h6 g
}4 v2 }* a1 z- h6 J$ q: [
7 G Y. w6 d1 L9 A& N
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)" V7 M! f. H# m5 C" U; B
{1 p7 z$ f/ Q( _3 m5 ?0 `( T% x" W
// Log_print0(Diags_INFO,"eowq.\n");
' e* X; y' K J& |" x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
; T6 U6 E5 H! ~ upp_interrupt_count++;- z2 v% }7 s) z) Z& H
#if UPP_DIR_QI==1; F/ b/ R3 D) ^$ m: T, [- f/ x
upp_dma_receivestart();! a0 }# m9 G3 ?, x
ret=1;
+ c8 T3 p" }3 [4 [: b/ T' c#endif2 J; \' h8 G U& ?$ b. U+ Q
}' l7 |# Q/ ]" [! l( Y
% E5 V/ b' H7 k- k0 S, s if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
& n$ x w: s. n5 H& E7 e- y {
& A% s- ]5 M/ U Log_print0(Diags_INFO,"errq.\n");! t4 J* V5 W0 Z3 U- e( ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
+ N# m0 c4 W- M% d! L3 O5 d! ` upp_error_count++;
0 a5 ?: `* W' \( w0 M# s1 L& l }
9 R) c/ Y" E) d' A
7 p$ ^' v) z) z if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
( [2 a G& D# m% M* {9 y! I/ t {
, l9 b, S/ e3 ^# b- S+ G7 R Log_print0(Diags_INFO,"uorq.\n");
: d, U2 i' ]5 M' n5 m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
" v P# G* ~0 l! R' G" X8 _ upp_error_count++;" |% l8 I% C: M2 Z2 z: h/ e$ ?
}8 [% E' \% ]4 O) I1 v
) y( q1 C6 f; \. K; ] if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
. O) _1 b+ K# d {! m# m* H1 Q! h
Log_print0(Diags_INFO,"dpeq.\n");- o+ R5 S' j f- B+ A0 {
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);4 @+ p3 ]) k! F* y
upp_error_count++;
9 w9 y3 S+ f9 R5 W }
" I9 R! _, N- p. I0 a6 p" v& {+ m$ R, ~
// make sure all interrupts are handled
) B4 {, M0 q: z( v+ f intr_status = upp_reg_hdl->UPIER;
& y0 @4 Y5 y) {1 R0 y; p" T9 X( n }
5 ^/ b9 ^& M0 U+ J: t' r0 S5 ^* `" t# I3 |8 }
// finally: write 0 to EOI register
0 i* r2 B- T T/ n& h- T5 R upp_reg_hdl->UPEOI = 0;
0 c5 v1 `0 W& D( ]; I* W return ret;# s/ J$ B# [$ S6 |6 O) N2 L- C" D
}
3 X/ S4 i% J" [# S/ gdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
" d7 I( {" Y8 t#define upp_dma_sendstartQI(x) {\
3 u3 |8 H# S' Q- N. S Wait_upp_SendReadyQI(x); \
; s# Z: C+ i; B$ l- S+ h2 X upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
* s$ z, a- C6 G! J$ v( g2 ^2 k upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
) j, D) l/ k" O4 O upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
' T" }5 P1 O1 r# a) y }) x# _9 D) [0 b, W7 \9 \
# j0 ]; Y' c* } O( l
' k- l/ S3 s4 F1 q( _#define upp_dma_sendstart() upp_dma_sendstartQI(I)
: r8 B$ ]! t: ]! a1 |( B8 K
# y# G% X! A/ t% G/ Y9 ]& ~9 I4 M4 k( p4 O q$ ~( M( _+ H
想知道uori错误是在什么情况下面出现的,好做出修改。
/ x7 o3 J0 C+ \( Z0 n* {- n; n+ G+ `6 w3 ^' N
6 V& I3 W, @$ p( ~) l5 K& k9 n" e
|
|