|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
+ j( ~; p% z6 m& H J3 Mdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:& e/ `9 Y, L2 o. F
u32 UPP_Isr()" U1 J& R/ Z+ i2 Z: t
{
9 _7 u9 R2 r! m, }" L+ S Uint32 intr_status = upp_reg_hdl->UPIER;
7 M* _: `! V6 R" l+ L upp_reg_hdl->UPIER = intr_status;//clear
4 v& c+ U6 q# U// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");: O+ g1 p( |1 o
u32 ret=0;' N5 C% n/ N3 n) d3 {
3 R8 m) u# x- |/ ^
// inline functions
! q! t" z0 w* h. C while (intr_status != 0)
+ v8 T: d$ c8 i( @" {+ l& u8 `& o {4 S# _0 ^3 Q3 l
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件+ P( v# M5 K3 o. A! r4 C' U2 t. E
{
3 X8 }1 k. }+ I2 g! r' Z) @// Log_print0(Diags_INFO,"eoli.\n");
2 c' O0 e6 A% F6 N4 E2 X& l upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
* x5 Y \0 ]# o! |( R3 M) k }, x0 G3 C& _* R8 Q! [
( R0 p/ B5 j: V. S
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
' f% U2 c4 j8 c/ ?% Y5 i {
; K( [3 T' D, b8 B6 b0 [ Log_print0(Diags_INFO,"eowi.\n");
4 ]% N/ ]. b+ I! u4 `% O" Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);% ?4 n! a) g3 u- y9 L* U
upp_interrupt_count++;+ }/ ^6 z( `$ _3 M3 L" ^8 u! Q5 P
upp_interrupt_eowi_count++;
0 R% I$ @# X, C* s; Z0 T4 l. L# v$ ~ k) ]
#if UPP_DIR_QI==03 _$ J# F4 L; ^+ w
upp_dma_receivestart();
7 B" f- T5 V9 N0 R5 }3 ] ret=1;* |, M9 X- K& z& F$ w
#endif
# o0 r \2 b5 Z8 M6 M }
+ \3 q& \% x9 \
$ t. k( L1 A* ?3 q$ b if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件# z% r# n' a9 A( z" Z6 M- w0 I5 y
{8 }( m8 f6 E" ^4 B5 g
Log_print0(Diags_INFO,"erri.\n");' O7 f- Y- d$ u$ B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK); n: ?2 O) O2 \9 B, C5 s
upp_error_count++;. G% n; I W7 L/ f
}& k( }/ m' Y6 c, l) Z
4 o/ W7 T( _4 \# [3 d/ v2 p* N if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件+ }) H4 }) @; U, Y: {0 P) X w# V5 K
{
& {9 V6 O7 Y9 Y% z3 A Log_print0(Diags_INFO,"uori.\n");
3 D& y8 u1 c4 v5 {# h+ K- ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
; I+ T$ S% b& Y: ` upp_error_count++;) I. f% \7 G8 X# A
}8 y$ L2 P) C! f& k$ T
( k7 g2 ^5 C, ?# f. H) j5 c if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件& J$ C, ]7 b2 d U" u# X
{+ p6 t/ u% \0 W7 m4 `4 o: f* |
Log_print0(Diags_INFO,"dpei.\n");$ u* K, j7 E3 X0 u* O+ [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);, [; j5 S( t% h4 a! t0 e
upp_error_count++;
( p- P7 g9 l' Y! B0 m4 b# i6 h }
/ }# {2 f" d. x6 q' n1 _. H5 L! d+ j, [* P `: X! d
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)$ D0 p) m/ S# A5 `: k d8 C
{: p! x0 N+ L' _# _) d' o
// Log_print0(Diags_INFO,"eolq.\n"); C3 O7 Y9 G8 o+ a z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);7 C6 {2 ~( P; o; r
}
" u. Y7 R: P7 e1 k c
, [3 H2 B* X4 b; ?) p1 y6 p2 G* d$ z if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
4 v8 k; R6 P2 @ {$ i) `/ h5 @) y! X6 E0 }
// Log_print0(Diags_INFO,"eowq.\n");
; F, I4 {2 ] M0 d3 `2 D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);: B# d2 R! T/ L Y
upp_interrupt_count++;
1 Z1 i+ t' k9 l4 r#if UPP_DIR_QI==1; W2 e4 x9 `8 |+ n
upp_dma_receivestart();
+ q% P. E( g( d8 \; D& S& x- j ret=1;2 n+ T/ ~" M1 Y2 i% X+ v
#endif: ~" D: `. I. P; E$ C' ?* h
}
0 W$ O8 O7 {7 @& P7 p. `: r0 L+ G/ |% a! o; }4 I
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK). W& U+ X/ p. v
{; o: ?% G3 y% a1 {9 t5 R. E
Log_print0(Diags_INFO,"errq.\n");* C4 D8 |) ?! y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);( l" G+ }- h) J
upp_error_count++;
$ e2 c$ \5 A9 [ }% ]; j. r, r( c6 M$ r
x: g8 N( F4 J3 ~, f+ N( M
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
9 e$ ]4 x& r! _ {7 t8 Q- |7 F7 z8 h, m/ l* R
Log_print0(Diags_INFO,"uorq.\n");
: q7 @: r6 g- f% o. F6 w0 ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);$ ]; A5 `6 o# L5 i/ }# t% }! I
upp_error_count++;8 V6 g7 S" C5 \+ S* C/ _3 ^
}
9 W- c4 x$ H+ f s4 N& U# p: C* K+ {0 D i" v
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)! i4 S& Q% ]+ F8 G1 q7 m4 u( T6 b
{3 C$ c1 i3 l. H1 }& p& {
Log_print0(Diags_INFO,"dpeq.\n");1 b- J5 }6 L9 T8 c2 C ]" }, o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);% n D% ~+ \( u" d: D* }
upp_error_count++;0 c$ w2 F1 ]4 k0 n; K6 W
}
$ M( K, w3 J, U+ V3 h0 b' j/ U! T. C6 d! K
// make sure all interrupts are handled1 ]1 D! [2 ~) t' d6 @
intr_status = upp_reg_hdl->UPIER;7 t' r a, z8 v% d3 V) g$ t
}
# p1 K, p X7 m4 j: m5 D3 K6 g8 u3 U" }2 A8 T2 Y+ ]! H/ T
// finally: write 0 to EOI register
+ _! N7 e- p5 p0 ^! P5 I! }+ c( [ upp_reg_hdl->UPEOI = 0;
( ]% Q: X0 [1 u2 c8 r return ret;9 e" |/ W; B5 m9 O
}, h& r! P6 {4 A, e0 N R) E8 \
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):. _" q* y6 n! K# M$ B& W$ W0 Q/ v& ^2 ^
#define upp_dma_sendstartQI(x) {\& B: ?# h2 ?+ o5 k5 G. l2 v
Wait_upp_SendReadyQI(x); \- [% M+ c/ U% x! a# u* T) e: G( R0 D
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \% J2 l! j7 a7 J( r4 I* D8 V/ }
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \0 C5 R r. X; ^+ V# ~3 z
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
. Z. f; x2 A) o8 o. U* r' I }
' g1 V* M# Y9 i6 v, l+ @
. @, ^5 d3 L7 ?# r$ C
7 `: O; i( ~, A, g; s2 p#define upp_dma_sendstart() upp_dma_sendstartQI(I)& p& C1 a- l4 E+ \- g0 w- P
* r" ^# d' Z# e9 K, ]: x! z8 G
& ~# a$ A' U! M" z8 x, t D) k0 R想知道uori错误是在什么情况下面出现的,好做出修改。0 g# X1 h: z! g" u. t
: Y- m& {) `( m- m& l1 d& F+ u
6 W# i- J' ^$ n# t1 d4 _6 M2 C |
|