|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
6 N( X k, Q; m8 w7 S! ^dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
. S$ V, o) p; f2 [2 o6 R7 W8 q) S" Eu32 UPP_Isr()
1 B' g+ y" w. g4 K! K9 c3 n; K{
7 a+ L) L& ^( v Q Uint32 intr_status = upp_reg_hdl->UPIER;' V& b2 O/ R9 @; N! R& b
upp_reg_hdl->UPIER = intr_status;//clear# ]4 }- l4 W( j2 h
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");* c6 k. @8 d" T$ x( n1 m
u32 ret=0;$ ~1 ^# D, ]$ S3 n: J2 q
3 f6 B; j+ A$ j: t- o8 C // inline functions& e( ], C7 _# G( P. m* E' B8 M* s! d
while (intr_status != 0)
3 ^- F* o0 n/ V8 t6 W) n {. m$ }, b1 h5 T$ Q- K. ` Z
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件2 s# S1 Q% U- ]* h% d
{
1 H" T3 I2 p2 D/ |// Log_print0(Diags_INFO,"eoli.\n");
3 ~% Z: z0 E9 p; } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);8 l6 e: |2 b! i& |
}) s% @. x. B; `. b$ N1 \# m6 s
& k+ @4 h9 _3 B
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件0 W. S7 F! T! ~! h1 F: I1 M
{% D+ W) {5 a8 r( E
Log_print0(Diags_INFO,"eowi.\n");1 r* J6 C, x2 {8 h( R" l8 W
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
* D, q1 m8 Q. q; d upp_interrupt_count++;" K5 T2 L$ G C! h9 D- \
upp_interrupt_eowi_count++;
) d A0 C" ]7 R! [1 P; T: q
# V# t! g7 H2 ]$ O( p#if UPP_DIR_QI==0
9 l1 N! X8 x2 o4 [0 e+ g upp_dma_receivestart();* P! B0 U' X; v/ D7 c
ret=1;0 D/ c5 g& b* J+ F4 _/ G4 e
#endif7 h3 J) j3 D8 M, Z
}
) s! ~- Z( a: h% S! Q2 [1 q3 Y5 Q1 ]; @! o. G/ J/ h4 ^
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
2 ? a' M0 F& @2 W; k {
# x" F. n4 k4 V! k& |. A! R Log_print0(Diags_INFO,"erri.\n");
5 A6 ^9 c G( D. H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);( T$ p: S' b) [ d# y3 n- h
upp_error_count++;
4 \, P; K* z: |. V$ _% V4 ~ }
: G$ ^1 i* _0 s/ D
" G8 K+ \$ x' @0 Y { if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件% s" V5 I9 h) J, W% M
{2 X, p) q! e; Q% ]$ C, I; c
Log_print0(Diags_INFO,"uori.\n");6 C- L; A) H- y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);6 g! W5 }( F$ Y p8 @9 c' J
upp_error_count++;3 ]$ D, X p& O" }2 d+ u, F
}
3 J" N5 c8 N& n- R# W4 o4 k+ V' x) m3 U/ e0 w d8 N
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
6 j9 @. H# S/ B% |0 ?! M {
c6 x. g, f6 i [ Log_print0(Diags_INFO,"dpei.\n");
. K7 j0 V' F' S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK); ^' [* \7 J1 K
upp_error_count++;3 |/ E. Y2 `; \2 f
}! ~3 m- v! a' I( P
) }+ O5 o1 d% j5 c" B/ H. [
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
" q. D( A( X. s p {/ o% R& Y' x- t
// Log_print0(Diags_INFO,"eolq.\n");3 f8 W9 U R1 }" S9 v# Y; J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);+ ?) W: T$ D" C0 l! V% u& v
}0 F5 t7 m2 p$ h2 ?% B
' D( m- W ]. R- ~3 U8 @
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
4 I- Y H$ a; d/ X+ w8 R# X$ s: P" Q {
: }# H4 @5 T3 O$ t2 c1 C// Log_print0(Diags_INFO,"eowq.\n");
9 T: N/ b/ M: Q5 l& r: p U upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);# m/ Z. n% k2 p) D
upp_interrupt_count++;0 ?4 a+ S& x7 c) q7 G Z
#if UPP_DIR_QI==1# W- h% W6 @9 l: ^2 e- f/ ]
upp_dma_receivestart();
& F* q8 e# S8 {/ }7 r# i6 s- U: E ret=1; _! t& S( Q0 a0 t7 w
#endif
% x; X/ l% M t } o! |9 a, u! q7 @; H: H
9 a% S( S6 T: g5 `
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)" z+ O5 l! Q2 E+ b+ n" F* K- u
{
6 f1 r" {$ @2 y5 V9 _ ^% @ N6 m Log_print0(Diags_INFO,"errq.\n");
7 t( ^6 q" R, V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK); V" b D* `: W. K
upp_error_count++;. R1 ^8 _3 t) ~+ [/ T
}6 t: A# B+ ] t# ]( l* b; t& b
9 G) v) L2 ?: l0 l1 `5 z! C+ d if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
; j0 t+ y3 E6 X {
/ c+ X! t2 C5 `8 ^8 [6 X. a7 a: T Log_print0(Diags_INFO,"uorq.\n");% ]4 y8 d5 o- y. \) _3 Q; N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
9 j0 _0 g' Q- N5 Y upp_error_count++;8 X, d4 v0 C0 |& ~& H
}
, \2 l) T* ]+ T9 I* S' r
- U# i* q$ \5 V N% \& R! ]- R if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)& r4 }: ^9 P6 v' o" q, \
{) ]( Z" G3 C4 Q: _
Log_print0(Diags_INFO,"dpeq.\n");) P, g" g7 V5 z, W$ d i1 ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
( I. q. V% f( o$ a upp_error_count++;0 A+ J3 V$ q; }- V5 u7 W2 P' n
}
# {& D4 z; L5 e2 a8 L
0 [3 g7 r8 Q( L# K4 g // make sure all interrupts are handled$ p O9 ^ {6 N3 j
intr_status = upp_reg_hdl->UPIER;5 `; A4 |% W7 D3 X
}6 v& T+ L2 P) d* D6 G# r
3 l N7 Y2 b1 O% F // finally: write 0 to EOI register! d! j2 `0 b$ T2 R! Z) c
upp_reg_hdl->UPEOI = 0;7 t- R; h5 R4 }( m5 n: y
return ret;
6 ?, o0 e6 t7 E}
! d4 N* s! `3 y: w9 c8 z; z9 Zdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):2 @/ K( f: L5 P, p+ G% v" M
#define upp_dma_sendstartQI(x) {\
' P9 [0 z# O( q. `5 K Wait_upp_SendReadyQI(x); \$ P6 Y8 t6 h {' e& ~3 E
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
" k, K% p4 n! c7 O, j/ P upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
1 {& v! A' o& x0 W upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\% `; F' Q2 h1 \" J
}, M. [3 A% I n
7 i% s: D" J1 P1 @; Y2 h, X: `, b' o" o% Q8 J
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
1 u+ H# d, b" d+ h/ W2 S0 o. R3 l! H% I( l$ z
4 r3 r7 j1 ~9 k8 i
想知道uori错误是在什么情况下面出现的,好做出修改。0 H+ a/ h1 F# B" b; s
1 v- o# ^: f* ^: g6 _% r/ l
/ z, {6 O8 z; \8 v1 V, [, Y |
|