|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?0 g9 E$ ]' ^( n8 |7 ~$ C
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:9 T+ W- ?: B. q7 [4 v% T
u32 UPP_Isr()
' |: U3 @+ v2 A" ~; C% i{
6 f6 G- S- t% y$ p5 W9 x Uint32 intr_status = upp_reg_hdl->UPIER;
/ S2 P. C4 x5 t1 l8 A' a; A upp_reg_hdl->UPIER = intr_status;//clear- o/ P `# u- e) Z, [
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");- G# F& U: ]) q' @9 M4 J
u32 ret=0; r- C6 z# U8 n
5 n- {: P4 Z9 b1 S6 R // inline functions3 W. C. S+ _& A) x6 y) ?; Q5 K
while (intr_status != 0)( {& |4 S2 k/ p. l8 U6 T! z
{
6 e$ y8 T' O* d. ~5 Z- n if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件/ p- n/ n, e5 I# l& b4 Q
{ p. m9 ?# Z9 H& l* Q
// Log_print0(Diags_INFO,"eoli.\n");
. i' u& R7 F$ i. E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);! V o; }" f, H6 \
}
) ^$ E# `3 o+ S/ d% @$ e
' W( ^: I$ n/ A2 ~* ~ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件' M: w( C9 G% P, t" d
{1 K& a$ e1 g2 d+ n. {* z
Log_print0(Diags_INFO,"eowi.\n");
, k# R4 d% c3 X) |( x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);+ M# k( k( p( ?; o# ]
upp_interrupt_count++;# z- x! Y" s5 n- ^7 s
upp_interrupt_eowi_count++;. P. W/ h, Y: I; b
2 H! k) {2 t9 s4 K* ^3 i4 r#if UPP_DIR_QI==0
! ~4 ?. L# m. j; y/ o1 n upp_dma_receivestart();
T9 x% s) t' t6 S0 l* d ret=1;
" q( \: D1 P' h4 M: J. w#endif% J7 p- A0 f/ i, Z1 a/ O
}
$ `) b" l2 k; `( k# G" j5 [
* z2 f2 Q1 I4 N: K% Y q if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件! R7 N' ]9 j4 G( _9 j9 _0 ~
{
* F- p% n0 A# {. V' U Log_print0(Diags_INFO,"erri.\n");2 H7 A: C0 r8 h* N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);5 ~7 q0 I# h' v o0 X3 [
upp_error_count++;; `# y4 B4 {" Z& {9 P; x
}6 ? [2 V' N: l( O r
- T' x( Z* |( Z: J if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
1 e+ W; j! Q. O4 f/ I6 D {, W9 S/ D. `4 r" q
Log_print0(Diags_INFO,"uori.\n");( X# n# _, N D s' B& y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);6 m5 L: T4 R( j
upp_error_count++;9 N7 r* P8 [- T7 |! h. ^) q
}9 l6 g$ B1 s0 [) E3 f
z$ ^ S- S4 x
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
* d! u! f3 [7 S s {% Y, J% g1 W( d9 p
Log_print0(Diags_INFO,"dpei.\n");5 y: z; @ t4 Y% u; j
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
3 q0 e" ]$ c) p" k) }" D upp_error_count++;# \) M) H0 c( o- n( O1 r
}$ q! R) w4 b, _, a$ M5 [/ g1 J
3 e, w- P( N5 \ P& ~: Y+ j: J; _
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
9 A( R$ Y+ `2 L. M5 r. ]/ T {
$ o9 t5 D) I o4 Q- T// Log_print0(Diags_INFO,"eolq.\n");
! n' i; w8 [/ G4 J; K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
6 ]8 R- y9 ]; ?& f4 z4 [ }! ]6 \/ u; j% y9 d1 O; N- _
/ V/ L& ?, @" E& h0 ] if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)" [) t. i/ `* i7 W
{
0 ]( H0 @* f) |% r p// Log_print0(Diags_INFO,"eowq.\n");
( u. K/ j# T1 c4 i( B" L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);% S: E9 e: `# o2 @- E( V
upp_interrupt_count++;* {3 |/ }/ l1 j
#if UPP_DIR_QI==1
/ D4 F! E8 J1 W$ n3 N. G/ M, H upp_dma_receivestart();! x$ J7 \5 [9 r0 V, D5 v" Q3 H
ret=1;
5 v7 T+ c" v9 I#endif/ b2 E' j4 o# z5 g. R7 ^
}
5 O! X2 O1 [+ R2 v% b/ p' g) a
0 }0 F3 u' f5 X1 @9 g if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)* E3 O7 G. i8 g* M
{
. U- N3 }9 Z! L- c Log_print0(Diags_INFO,"errq.\n");9 z) B$ O, T3 V3 u8 F6 B1 l: C
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
# L) t% f% } ~* } upp_error_count++;
/ \4 C* M- U& Q }
) D) T* g0 I( D3 d- w0 A7 p
5 O1 _0 J$ l' v# Z4 j+ A, { if (intr_status & CSL_UPP_UPISR_UORQ_MASK)( D, u4 `) {, B. C, Y
{
* R* `4 e6 ^! w2 D Log_print0(Diags_INFO,"uorq.\n");
; |1 Z/ @( L) Q( y7 D- Y% \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);* J" {3 N/ w$ x4 z' z
upp_error_count++;
0 a% m6 O0 U3 G- Y5 t" A }
7 `* t: t+ k. w) J- n3 G- i T, ?2 |- ?1 q
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)' M* n( |4 y' x; A9 d- x: |
{
! b) a! z9 H( n2 a5 u Log_print0(Diags_INFO,"dpeq.\n");$ U9 a, x3 }. t0 j$ ]0 q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
* V. T- Z1 E9 O# l- J3 a upp_error_count++;
+ e( R* N. o$ U- P/ I; L, H }2 C- W; x: j7 L2 W8 b; x
2 B6 V$ D# G2 c) ]% _( R+ s
// make sure all interrupts are handled
7 N! r* _3 s: {) O, r intr_status = upp_reg_hdl->UPIER;
: e& \ q8 S8 _ @" C; H }
' X0 t% K0 W, X, r4 ]! ~& Z3 Y e
6 L4 _. x) B% d0 m // finally: write 0 to EOI register3 D8 |% o1 K+ _/ u3 b
upp_reg_hdl->UPEOI = 0;$ C* c# d8 U- L- R
return ret;$ J" @4 n* U1 F& A9 D9 [. K! F
}1 B' |2 M( {! a) g% p& h
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
6 m# j6 i" k, \#define upp_dma_sendstartQI(x) {\3 t9 _ T* x% l; L% x
Wait_upp_SendReadyQI(x); \
2 B7 @ S, `6 {8 Y upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
0 k' X1 G, f1 [6 p- A/ m4 j4 I5 ~ upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \$ n+ i3 c8 Z3 x
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
4 ~- A; C8 J1 h! ~ }
" N+ F4 r5 ~: E z
$ i- J7 g. q8 U) ^# @. j. k4 ~" a% B. q, K+ } p `
#define upp_dma_sendstart() upp_dma_sendstartQI(I)* d9 k$ _+ Y1 a( M$ W' s( C
6 c; p& |1 ^4 e
! i' L ]* t" D* J
想知道uori错误是在什么情况下面出现的,好做出修改。4 K( N& k5 d! [2 ?0 v
* m" P+ g3 b6 @! D" s
5 S H( q. ?5 c! h4 g% y: F |
|