|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?( C, s! J- H* I7 U2 e5 I
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:; D, W3 i+ n+ m4 Z
u32 UPP_Isr(); q; G4 [( `) {; x$ y7 e2 V& [/ a( g
{
# z; h' o [& u8 [' |+ b Uint32 intr_status = upp_reg_hdl->UPIER;% e' T4 A+ D7 `$ y% F. s6 N1 P: G0 U
upp_reg_hdl->UPIER = intr_status;//clear: z7 d9 T1 S' f: g2 V5 e% |% i
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); b- N4 x' I- d5 w, d. o2 e
u32 ret=0;. m1 h& W1 H. W8 O5 ~: g
C0 b6 r. ]& ~0 q7 O+ J& L
// inline functions
1 I" r% [8 |+ x5 v) \ while (intr_status != 0)- p* R3 ?1 ?1 a* U2 f7 y2 ]
{
9 x0 ?, u. R- `2 L) l if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件7 w! A5 I% O' c' [$ j
{
; P1 V0 m3 x8 o$ C9 e% T9 k// Log_print0(Diags_INFO,"eoli.\n");; y# G* Z* K1 K/ _$ t% k6 ]. f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);! K6 |6 @1 y. A8 E
}
1 L1 D3 {" M; s- L7 d8 _8 W; P, r3 z& |, i' I
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
9 a" Y: T3 Q' E! j0 r v& G1 W {4 a" K0 r. D" ?$ A) k
Log_print0(Diags_INFO,"eowi.\n");
2 M1 ]" I, e% g+ `7 _5 i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
, g( R$ F" @1 C9 F" v+ i$ i8 a upp_interrupt_count++; H( l* \, C/ @% S8 v7 C% q4 X
upp_interrupt_eowi_count++;
) J3 m! @# `6 @
& `; b5 D# W k' x, a#if UPP_DIR_QI==0
" Q* O; W( V( e* `# B* y+ A" F8 i upp_dma_receivestart();8 w* _3 P. e$ I Y" p; b
ret=1;
$ u* U/ C) h6 M2 J* n- g#endif
7 S- c/ _* d! @+ e, y }
, D$ [# t7 r9 O; T" C* D7 q
- G" `* ?4 j* d( V if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
: F$ \; ?7 P8 R$ [ {
6 Y4 F7 W* Z% J3 X# b5 r Log_print0(Diags_INFO,"erri.\n");
* N( w* \7 @; X9 |3 a F( r* A- T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
6 h) c: G" y& y8 O/ p( ^ @. D" Q upp_error_count++;
; y: ]' }$ L' }) k; a' q }" W4 q6 S4 @5 i% T; M
" \9 ?$ ~9 z% L8 T5 z" `
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件1 f9 g/ _7 X9 b0 |: ?7 ]% v
{
5 |0 {$ W/ h$ ?; H2 X) q; Q: ~ Log_print0(Diags_INFO,"uori.\n");) L: T% u: H9 w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);4 e) o: M$ J# o3 A2 j
upp_error_count++;1 h2 B- c D; K# W4 }; O/ x
}! |. t# ~' ^- D! P* v1 w
" n% V3 q9 H' A- |- [- ]; K; E5 K if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件: e. M* i& v: R' z
{
4 V/ _ }- \& Y Log_print0(Diags_INFO,"dpei.\n");7 E; D3 \, l' A& y) A7 J5 j1 N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
& J! R# H5 H- _& i- [ upp_error_count++;$ F3 M# R8 N+ u X5 L1 }
}" e( a) _$ B- j" b9 h& o6 B
0 D6 V, X7 ^/ k) G! t- A if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
' T. }2 l/ |# W {
' a- p; O' J" {1 P: f r// Log_print0(Diags_INFO,"eolq.\n");7 [0 {, ~/ D2 S8 [) T1 U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);* R; K" c0 U: i) I- v o3 b+ T+ U& Z
}
/ Z7 k# ?2 Q% `
* q: w7 U" X9 P" T: M$ }+ X if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)& Z5 E( Q& Z( z6 R
{
" X `7 l7 G0 i2 x// Log_print0(Diags_INFO,"eowq.\n"); k# g/ H& |% ?+ F% P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
, J/ y$ P' v f6 o upp_interrupt_count++;
) Z7 `' r/ ^, Z, R/ G' i#if UPP_DIR_QI==1
) |6 }) [2 ]- k, `% f/ d0 ? upp_dma_receivestart();
9 U( C9 W* ?) c2 w8 N/ `. f ret=1;
! O/ V( s$ @5 j#endif
: ?3 s" x( ^, E2 ^/ N }1 v! r' z! i' c
6 e( q/ M, ?$ C- \: r
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
5 l+ Q6 F0 N' K$ D9 B2 W8 x( _ {
' U( p, |, j; c5 w Log_print0(Diags_INFO,"errq.\n");
" r* \9 H& C) |( ~0 g. T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
9 w. y1 T7 h& n7 k8 B' d upp_error_count++;
- m( p0 Z/ y6 q {9 U( K X0 d }
: r% J- M, a. p4 x* O
' E1 d1 ~' n( Y( y0 q if (intr_status & CSL_UPP_UPISR_UORQ_MASK)* D' O1 }% q3 O1 c1 S# L% T3 j c" {
{. }8 q- g2 L, B% ?6 V9 p1 Q
Log_print0(Diags_INFO,"uorq.\n");
8 D1 w( l+ Z/ j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
: f$ R' \; S# G8 N7 ]5 K1 U upp_error_count++;2 B' n. W' s0 l( i! o
}
( @5 E) D& ]. ], ~3 ?
7 T( S5 E: c3 i0 G& ^9 M0 R if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
* o2 Q' n7 u( O+ p {
1 T! g+ w" d- g6 F& X9 C u Log_print0(Diags_INFO,"dpeq.\n");
1 ?/ Y1 o% `, b0 j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
$ M# q' J2 l5 R upp_error_count++;- H, E. D; K! z, M7 B
}$ P! }+ t# D7 @2 Y/ v
' I( o! k% [$ W. R( | // make sure all interrupts are handled
. I% Q% |0 n) I0 Z1 C intr_status = upp_reg_hdl->UPIER;0 J+ Y) m2 Z. _
}6 t6 E8 [7 v0 ^- H9 Q
* [9 s4 G, o" T$ o, O* C // finally: write 0 to EOI register; u U% [0 e1 z, L: O
upp_reg_hdl->UPEOI = 0;3 M0 {+ y* F2 i! l; R: t1 c
return ret;
& E. s- O5 P4 J+ }}; [4 @1 _; n% a
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):6 n P( W4 f( k9 V0 P4 c
#define upp_dma_sendstartQI(x) {\+ T! x) Q4 v+ L8 W) w
Wait_upp_SendReadyQI(x); \
0 L, b# R% c, O% \+ ?# r upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
. _; {8 Y, f2 u upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
1 u% r- }5 H+ J5 X0 _ upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\/ v% R% a, a* W8 @8 B
}
, g: ^( B! D1 D9 b3 _- ]( L8 V
( M% f/ F1 H1 t, }9 v! y, r3 o' w4 L. G k) H
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
; q7 P6 R, ]. u# E* X* ^
% n7 C8 E+ K6 e, f$ F6 F8 r/ \# I* u* }+ l
想知道uori错误是在什么情况下面出现的,好做出修改。1 B) `% v: x5 ^. g
j8 k: H1 j# A' b
' u2 ` j( u- `) i( W1 Z0 |
|
|