|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
5 Q5 U( i" _6 Z: v3 \( \dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:" Y0 Z/ e( x1 Z. h @; n R
u32 UPP_Isr(), Z5 |' C. _" j. Z$ ~- w% q G
{ ~6 A8 ]; |9 {
Uint32 intr_status = upp_reg_hdl->UPIER;
8 r4 X. W$ J: B l! Q) R( X upp_reg_hdl->UPIER = intr_status;//clear$ u4 I8 v/ y% G, G+ m
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
% A$ e; G" I! k9 O; {/ z/ C) E u32 ret=0;
1 S+ T0 c0 D: ?$ V8 n) @6 {
6 p6 o: r7 t" d // inline functions
# ^; _2 B- z/ o: Z" d4 B7 w while (intr_status != 0)$ j4 N, k: w! X+ s+ l; B/ i: T# z
{! b D' j; _9 h/ F1 W! H
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件- s" [5 L) p9 A. V0 [$ u9 R( Z3 S
{# ^. t J& ^( R' ^6 n6 J) @! N* ~
// Log_print0(Diags_INFO,"eoli.\n");8 J9 ~7 S" z* Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);( _* n3 Y1 z8 N% S6 f$ `3 R) W
}: z! C" u& D. |/ I+ ^, S! B
( y) J, ~" f" W# Q, N: S if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件/ r) k x5 T& V/ |+ N! _
{
- l. B1 I; T! t% m Log_print0(Diags_INFO,"eowi.\n");
- |3 I0 B r" K8 n3 s6 \: k) _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
( W& b6 c, O% d0 b, V8 R8 y! u& { upp_interrupt_count++;. E% O& I- u3 M) y C
upp_interrupt_eowi_count++;2 C, H) e& `1 s( N5 L; R8 _
" E+ ]/ ~1 @6 r+ h3 R+ X" X8 \
#if UPP_DIR_QI==0
& P% e" c3 n9 p& c9 W6 U2 \7 S upp_dma_receivestart();
8 X4 Q/ r9 i" J5 V0 f ret=1;3 q2 n$ ?" a% z: M; g
#endif/ Y: i' h+ R" T e' _
}/ u% z8 O4 O3 u0 \# Y% e/ h" y
; X% e0 j4 V! a0 f5 N' F if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件5 `+ l3 R& c1 f
{
0 u% i* }# ~: L: T l7 L i2 ? Log_print0(Diags_INFO,"erri.\n");: F$ n6 m+ ^5 H; V" j( Z/ ]( N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);2 P2 M) z2 H6 ~' A
upp_error_count++;
! ^: ]! L* K0 E2 p! V }
1 _0 @9 m8 T" T' a
# P+ z+ d8 w, z+ t2 W8 |( {$ S if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
1 H& O$ @9 P0 Y6 W! s5 r* } {, z ~: d3 w( u% z! p3 }
Log_print0(Diags_INFO,"uori.\n");
# D5 V# I- k) R- C9 f5 N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
$ j/ [, x2 C; ?3 n4 M upp_error_count++;
2 ^- U0 g, o" _9 ?5 [2 e }
! S6 Q2 h* H( A0 | Z, e
1 Y( v: H: I6 Z1 f if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件3 ~. {1 r9 x8 S4 _5 f/ l
{2 P. s6 `; Y5 y+ k
Log_print0(Diags_INFO,"dpei.\n");/ {. z5 X# r9 x! @! H \% s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);# n" _6 M, G# }2 @) M
upp_error_count++;9 x1 v% l5 ^5 [ i! m
}
+ w9 N8 x U( G* u0 P2 z3 g1 c2 ]
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK). o/ n* J: f) Q$ h/ @
{" h6 h& c8 \% h. z5 N9 T1 h
// Log_print0(Diags_INFO,"eolq.\n");
6 W8 Q6 k2 U, R2 A, Q$ X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);5 A/ q" i* k$ [' ~" }
}
- e7 K1 i+ v& _
7 f5 k# ~, C6 r, W if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)# W4 R' ^$ K+ b- ^3 Y1 `
{9 g$ K1 N! C, ^
// Log_print0(Diags_INFO,"eowq.\n");1 M, ?5 m( K3 i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);* L6 \ } Y# Y
upp_interrupt_count++;' z: H$ _0 ]0 M1 a4 b
#if UPP_DIR_QI==12 w4 A( d: H$ }" l
upp_dma_receivestart();, I) |1 {8 z" h) Q( G
ret=1;
& `; ?( K" F0 I/ e5 ?. r% z#endif
3 E0 ?$ T7 h. F) n- t+ J }& x% u3 V' d2 v+ s6 G! J
L6 P" ^& l5 Q# o$ }
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
- C, I7 S2 P$ h ^" y1 ^$ c {+ `7 r; H+ f/ g- Y6 j
Log_print0(Diags_INFO,"errq.\n");; `( Z- |$ I8 w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);1 S5 g; }' N) E
upp_error_count++;7 z) L, n2 ]" n( Z5 b& Q
}
$ J, d3 Y% [4 s
! \6 o, O+ p5 l" f! ^ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
7 e6 V( m& R4 q/ a" v" U {
( H0 x$ P f) k8 B Log_print0(Diags_INFO,"uorq.\n");+ ?. L! `7 ?) ? p; K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);0 \9 `; ?& O% h; H, f, A
upp_error_count++;
% m- |/ K3 m9 f$ g' e/ f* Q3 ` }5 J$ k; M5 m+ O7 u
' b& `+ G( C( u8 ~% W if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
5 d# ]6 x; U2 U4 \4 {# V- o# P {7 b) |7 K0 K: x* K) \
Log_print0(Diags_INFO,"dpeq.\n");0 X: C# X( [& m- m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);5 h6 ~1 J6 N4 t' _3 H) I' ^' O
upp_error_count++;
, a* _6 w# ^7 e( j' L H }
0 [/ |8 N/ `0 Q9 H ~# Q, s: v, w: `% N+ s) |
// make sure all interrupts are handled
, c" b! [$ N- s @) K( K. R intr_status = upp_reg_hdl->UPIER;+ y! U1 g7 W& V
}
, N& a- P/ [0 G% r6 r# A6 k) {, { r/ U7 s; J
// finally: write 0 to EOI register! K" g* B: P* N. v7 J
upp_reg_hdl->UPEOI = 0;
5 ^# Q" i) n8 Y# ^0 v. y3 O2 U1 O return ret;2 g8 W: U; `1 h; y) C
}, M7 O( }8 @* q Y4 ~, m- U
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):* H# h; t# N* a/ m; b; n0 V
#define upp_dma_sendstartQI(x) {\
/ K8 n+ a6 ]: R. o q; `! f Wait_upp_SendReadyQI(x); \
9 h K6 o5 v% J7 `" M upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \1 ~: F. e$ ^+ n
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \* Y) } ^- X, e- Y
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
( |/ B4 `% ^9 D6 H }
1 g8 X- k0 d* X- ]* s; E O. j+ ~8 Z* k' E
- O4 A/ {$ ^' M. N# F, {3 A#define upp_dma_sendstart() upp_dma_sendstartQI(I)' t. @1 G# A5 y5 w5 p
0 T K; j# J+ w3 p( N8 V
4 T" N. w1 ?2 w4 @, ^想知道uori错误是在什么情况下面出现的,好做出修改。2 I b8 ~9 }) e @" ^& J
7 \, g8 I! B( x; r! ?
" g e) \! _* H4 t- N! [+ C' P |
|