|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?: W9 D$ _9 j( y2 I
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
, Q* k6 C3 c* ]4 Y2 x; Nu32 UPP_Isr()8 [8 g- l: d3 f8 h/ R ^ `( G
{: p. z$ `) Y- |: |6 z
Uint32 intr_status = upp_reg_hdl->UPIER;
' S5 [( V4 g% @: W upp_reg_hdl->UPIER = intr_status;//clear
. u9 T( J4 O5 x7 x* A; |// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");5 f1 h7 l& r8 J$ [ Q& I
u32 ret=0;) }: @- h( G y+ U& F, k/ n0 w5 N
- y% |6 {6 B7 O: G: d // inline functions. Z7 j6 Y) @" u, d7 A* I
while (intr_status != 0)) v4 m% Z0 m$ D3 z0 U2 S3 G
{
0 L' T$ Y. M1 i1 W) z7 h" T( E if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件0 e" F/ r/ S( i- E) _
{
5 \7 [8 a2 Z3 |5 h// Log_print0(Diags_INFO,"eoli.\n");
1 p) M* _9 `# B* d. F* b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
# V7 C0 d- O" V7 m1 ?7 A4 e) K' z7 y }
' @& q2 K9 d% F
1 s8 v- J, g ~9 n- x) S if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
" t2 x$ Z h, |) ^3 |0 L {! z/ \% Z4 X' p" k5 ^) |
Log_print0(Diags_INFO,"eowi.\n");1 i7 N3 v% k/ D V% Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
4 ]5 D A9 F# \# Z, q- \/ L upp_interrupt_count++;; r% i2 n& |1 m
upp_interrupt_eowi_count++;
. M# z4 ~ j! U; R$ H5 U& W: A- q. w) @) P: U, c
#if UPP_DIR_QI==0
! k& ~/ _0 y' m/ g; x+ y upp_dma_receivestart();
; A$ A+ [, Q( O0 K$ J8 t# o9 j4 v ret=1;+ y, u9 G/ ?3 t$ g3 S; q
#endif p; u3 f- Q) A2 b
}; Q. _, X" K# H6 {4 B5 e$ K
2 _1 t* x6 w7 ~7 d: z: |2 `7 n9 n
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
% t( X8 {6 U, s { h% I+ s' P5 E! C
Log_print0(Diags_INFO,"erri.\n"); v) j6 O3 T* C; u! f& J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
* S5 s0 X1 E5 ?4 A upp_error_count++;
3 i: P+ ^8 p: [* b9 f) J t2 X }4 H. r$ {% K, t. O- A
5 E; W$ h% V( i" o if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
) |) K: \- N; s6 W% S2 G4 t {
$ X; y& B2 x4 D; d Log_print0(Diags_INFO,"uori.\n");
/ B) g0 f5 h# \6 q' _/ ]3 Z, [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
' _- r; n5 g0 |2 g( j# X1 ?/ R upp_error_count++;
) |: q1 T0 D8 j: X* `- U/ A }
2 l1 n. N$ L9 S# V8 s! z3 o
/ l9 k- B3 X7 U7 d$ J0 L1 g if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
0 f8 w/ M; K7 C {
" C0 R: I! I% h# p Log_print0(Diags_INFO,"dpei.\n");
2 b4 ]/ J' w7 R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);9 j& ~. _; q# {' Z/ u
upp_error_count++;
2 a; o0 U4 _# X+ G* F0 p6 p' { }
" ?1 M& f, P9 v2 t. [$ K! a4 z' S2 L" P# h, a2 k. }
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
9 g# w% w% r O7 C* p' m {
4 K0 K, q) \5 C y1 A( l// Log_print0(Diags_INFO,"eolq.\n");
5 O) v8 E8 \5 l4 D8 J7 w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);# \2 t6 n: G$ D' J9 w) U5 ^. B0 V
}% O/ T* s. g0 R/ j
2 g C `; E3 a9 \0 Q0 p+ N, b
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
1 @* u2 d1 _% e1 ?' @ {" E. m) Y, |% @, N6 O' x& l4 {
// Log_print0(Diags_INFO,"eowq.\n");
: q& T Z, w( {4 ~7 o) b \( R1 m1 d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
+ _2 a' C T( ]2 M upp_interrupt_count++;' `9 T5 R, Q. R* H
#if UPP_DIR_QI==1
6 b( o9 V( \) o) U* F5 s" Z, T' I2 @ upp_dma_receivestart();' t3 j8 M6 a# z, t7 Q
ret=1;2 D% @& P+ ^* x0 X! Q- X
#endif& [3 f3 U+ ]9 V% m) v- Y
}
v* Y G) P* r8 }8 c; n! A8 k) i8 r7 @ F+ I$ J0 Q* u
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)" u: [' n+ Q5 o! o
{! S) y- M9 h! s- B# G* p1 d7 o
Log_print0(Diags_INFO,"errq.\n");. f* l/ `# N- o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
% L Q& T4 k% I1 m( y* p8 _ upp_error_count++;
H/ k0 ?2 z1 w0 M. Y! t! }" w }
& D* `7 P4 A8 n. Y* E. p
& g' R1 e5 X5 H$ |! H3 J: C if (intr_status & CSL_UPP_UPISR_UORQ_MASK)& V3 u$ D1 _# I
{- ^: d. H' a/ ` L2 Z7 `0 Q0 B
Log_print0(Diags_INFO,"uorq.\n");
5 B3 f% \4 ` q0 H9 w% R+ b, _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);1 o. s0 `& I. {% J
upp_error_count++;; L2 h8 y" ]) V f$ m
}: s6 ~, y9 U3 c4 P
6 } R6 d+ d6 P/ u, C if (intr_status & CSL_UPP_UPISR_DPEQ_MASK): v" r( \ ?3 x, i2 q7 s
{
3 t; c$ {8 ]9 g Log_print0(Diags_INFO,"dpeq.\n");) f7 ~% A4 p _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);6 m9 r" o, @* y
upp_error_count++;. x# n0 y* Z2 P* Y: I
}/ K2 n# U N1 s; Z* N
- A9 \9 Z6 P/ r F
// make sure all interrupts are handled7 x8 M$ l# S& `3 q# Q+ u3 B
intr_status = upp_reg_hdl->UPIER;
& w- w% Q& r9 c: Y: ]8 ? }
1 g, u1 c5 Q9 u) T5 }" V" \0 P% }' Q1 b( K- t
// finally: write 0 to EOI register
2 m7 A2 o% p0 F- I9 } upp_reg_hdl->UPEOI = 0;0 l/ g2 ^5 y! U: e9 u
return ret;% z; ~5 \$ m6 n: ]
}
1 M! m S, N# V+ @' \3 Edsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
0 {- ~) B% i( i: S$ Z* f+ ?- o6 D7 ?#define upp_dma_sendstartQI(x) {\
8 t( N; W0 J% m. s Wait_upp_SendReadyQI(x); \6 N, c$ v E9 t; W7 H# Q
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \1 r, y, m/ P' C& P! z) v/ q+ a
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \9 S9 b& h) |& h' Q* [ C6 U/ Y
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
" ^/ I: P7 t/ g }. [5 d; T7 A5 y2 w2 T
4 q9 a a8 e: p; z% t v4 J
$ j/ B% R9 c1 q; @# |# n# S#define upp_dma_sendstart() upp_dma_sendstartQI(I)( M3 L1 n# @$ B: n# [) ?( b. q9 @
2 ?7 ]1 e0 M! O& c5 S: j7 v% {6 O( w V" N% j# v
想知道uori错误是在什么情况下面出现的,好做出修改。, v; ?- u3 Y! j& f, D- h* e
/ {. M' k2 b; B; T
4 ~, {9 w, s+ U# P: \( L' F
|
|