|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
; H. V) y y8 V |# z9 Edsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:, }8 o# ^8 Y! G/ w4 H$ r$ b/ x* ~
u32 UPP_Isr()4 A5 z4 O) n7 N9 w. v, } h u
{
; I8 {+ z, V4 \; i# s) q* l5 B Uint32 intr_status = upp_reg_hdl->UPIER;7 P/ z e! y8 O2 F
upp_reg_hdl->UPIER = intr_status;//clear
- C' \9 [) I2 q+ t$ ?: R// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
9 V3 m& Z3 \" q, u u32 ret=0;
3 B* k! q2 Z6 `9 @! q _' _+ x7 @% d" `8 f& W2 c" N
// inline functions( k: d4 o/ N9 o9 ?
while (intr_status != 0)
- |( S0 ^, q" m9 @" {; ]) Z {$ S( P0 m5 R, J# Z
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
1 l2 {9 X3 c7 f" H7 S {, `0 P$ z4 R2 P5 p
// Log_print0(Diags_INFO,"eoli.\n");
& P8 I- w% ~7 U6 V9 L- k0 @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
# G+ P. F% L V' u3 C6 F* n5 }; H }& n, T6 r( i6 I* ^" v" J' v$ e
Z1 G" p" l$ ~$ E if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
/ R/ I& X# e t: ~& c, @2 f {
' i, S* f* Q* i5 n* E8 y5 q Log_print0(Diags_INFO,"eowi.\n");
" n) D6 n4 z& F* f$ _% C& U upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
! [3 h& N' t/ O" u# `& C) b0 @ upp_interrupt_count++;
' B4 v1 R; s, x7 R/ P upp_interrupt_eowi_count++;1 a, [! C+ z+ z {: N! h9 G4 w
* v- i' c% {, {$ z3 L( u4 T#if UPP_DIR_QI==0( w( m/ d1 x2 K4 v7 H1 Y, D4 Q- G
upp_dma_receivestart();
) h3 a1 c* V% j ret=1;0 J! a9 \5 R5 j% Y
#endif
" q- j* h: a0 [+ \8 _) P }
5 |( i% _! w% Z! N; J2 Q5 _, \
, U9 e( o% q! K) }& I if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
( U6 q$ M) }3 p3 C( |- t {$ I% P" I3 e* y8 x
Log_print0(Diags_INFO,"erri.\n");
4 z, b3 g8 f/ o# O% }8 O, v' W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);& e% k C* y2 w1 m! Z. c& s
upp_error_count++;
# Q, F8 q. O7 K* {5 f+ J }
" n- z+ ^" y0 o( L
2 P+ L) k4 e( L if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
8 `6 D* E* y9 S {
8 |9 y+ A$ t1 M5 r Log_print0(Diags_INFO,"uori.\n");
8 v x# ? m' d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
2 N) L, F- |- T upp_error_count++;
1 \) G) r3 I7 a {$ B }: i2 W$ `, g( M1 ^1 G: Q. i
H5 [8 H8 I( v) n, q
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
9 w# C: b* x0 A: s( o& |) f, G {0 C- l( K0 W9 }" o3 A5 c
Log_print0(Diags_INFO,"dpei.\n");
; T" I" S j( Q+ ~$ Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
! h6 T% a6 O2 j; t4 D- C5 c" v* Y upp_error_count++;
/ s9 E% s- c, z: S- G" S }
+ w" U7 Z' e% U2 y2 W" U* \; `# u. v3 f- W+ E* p9 o0 S
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
- {6 g' u e" K! @ {9 [4 `6 m5 ~, S7 Z2 @& u! H! O- }
// Log_print0(Diags_INFO,"eolq.\n");
# y5 X7 V7 U1 T2 {$ A0 l$ h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);9 L% G( e. w5 b: _
}
; o7 |( M/ A4 q6 L
6 _5 u2 w, A$ q6 b( H( a# u! t if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
; }+ D( P. c6 g) J" u {, r8 L; r+ {( r8 {, W
// Log_print0(Diags_INFO,"eowq.\n");
, `4 c4 T( j1 G1 `' P# } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
* C; u) m& t/ n; e3 H* r6 B upp_interrupt_count++;. z0 P7 D6 \8 s( _9 A: \! G
#if UPP_DIR_QI==1
6 G9 N6 Z2 r! D' q7 N upp_dma_receivestart();
5 y$ E/ M% U' g ret=1;6 f: C3 ^" U5 x5 O
#endif
' n" z# v& Q. s+ U. ? }
: [' `3 [% _0 h9 z# O! U
8 U8 t& N* B5 H, i if (intr_status & CSL_UPP_UPISR_ERRQ_MASK), p$ D% J; N- u% ?
{- l( j, @ ^+ T. X0 ]
Log_print0(Diags_INFO,"errq.\n");
0 i0 A; k; B, Z. X: S1 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);( X' I; p* ?( Z8 R, l- P
upp_error_count++;
; G8 r: ?( V U1 y3 C( q' t4 o8 g }1 c; o; ]9 O. H7 l' R
" q" ?$ ~+ Z: ~7 Y, U' ~4 e8 h D6 S if (intr_status & CSL_UPP_UPISR_UORQ_MASK)* M+ g" _# ]0 q: I
{& A f: Y; }/ F, K S$ ^
Log_print0(Diags_INFO,"uorq.\n");
( b* I; V7 i0 H) i5 U7 ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);/ p/ j- T- U' C- Z1 ~4 v6 j; n
upp_error_count++;$ x3 ]" N' P6 }9 e
}" }1 ]$ c' M6 @$ d$ g/ z
/ ?* V( [. W7 D0 w5 A if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)% X1 H- h7 o. r5 e( [: I
{
. P8 m* D' K# l7 \$ ?* o S5 o Log_print0(Diags_INFO,"dpeq.\n");
3 ]2 n7 Y# z2 F* Z& A: \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
7 n7 m9 Z. u- Y+ \2 t. c- Y7 H% x upp_error_count++;
* [5 z F0 `# o# B2 b! Z }
* r9 q% G6 S8 k2 c
; d1 B2 }2 c, X( z, o8 W3 `* S( B // make sure all interrupts are handled E9 t2 ?% N% R* w
intr_status = upp_reg_hdl->UPIER;6 {' Z/ Q/ u$ m& ]+ j
}/ n+ K$ M6 a: T; X. r! W
: y8 J9 h. a) I O% y! z) J4 e // finally: write 0 to EOI register
/ }! T4 \1 ~- q0 m4 F upp_reg_hdl->UPEOI = 0;
( U' T# i) Y. u7 C4 `* v return ret;
# [ C- r3 J& _+ Z7 Z2 p}" A3 b3 f+ o6 n& w9 I ]
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
( w9 U# c- f5 k, J3 j* Y#define upp_dma_sendstartQI(x) {\& i/ [: l: X1 n2 H
Wait_upp_SendReadyQI(x); \
& u8 h8 d( ^4 @' C9 w4 m$ P7 ~$ O upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
4 e9 g% h5 o! ]9 E8 \ P* J upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
) Z( Y* M* s: \$ }5 w9 d5 r upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\+ `4 E- M) k% a) F" o" B
}
$ y" P" v j) I) A% U8 v" f8 q0 n+ O( R5 @2 l
7 b) A% X0 e8 T$ ~#define upp_dma_sendstart() upp_dma_sendstartQI(I)' n4 _& ^0 P: ^$ s, c0 k
* p% g% V+ x0 o* s& U3 h8 _8 J& r8 {* D& B6 H# o2 W) }1 b+ x
想知道uori错误是在什么情况下面出现的,好做出修改。
$ k, ? \% s' ]; W9 F% b
8 F5 g# w* I/ t3 c6 L& U& T% T1 V% T8 d* Y [
|
|