|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?1 g% y( p9 d& h% E0 R
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:) Z2 ^; r; w$ u D
u32 UPP_Isr()5 _+ E+ P# e8 P' [; K
{
% h" V7 u+ T. r' S% }/ A Uint32 intr_status = upp_reg_hdl->UPIER;
6 X* |7 U" A: ~. p+ X5 p/ k upp_reg_hdl->UPIER = intr_status;//clear f/ O' V& m- K3 o+ T8 ]5 f
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
& N; p) S0 ~) _3 @2 R u32 ret=0;
, S% |( ~( l1 e* i) {- d" d3 C/ p( `1 d" p5 P
// inline functions( e* l7 _; A2 }' X/ v, Z) k) r
while (intr_status != 0)
" F; g7 Z5 u m {! J# u: ^2 [3 A8 e
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件( K3 Y0 S4 m0 R. V! j
{
. j7 C* D6 D+ x// Log_print0(Diags_INFO,"eoli.\n"); Z, N; h* C% `3 g0 i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);* K: ?% C% `9 d1 _+ i+ S
}! K( Q0 J# q0 q `
+ _) y2 s( [, z# B' C8 g E2 N
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
' F2 q h/ ]; n: l" u" m& @# z {
1 n0 v( X- ~9 d! E, A o Log_print0(Diags_INFO,"eowi.\n");6 q0 ]% R' L2 Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);# o& |: m$ i2 ? _6 y' \
upp_interrupt_count++;
2 R' A Z' U: w B: W9 N upp_interrupt_eowi_count++;
& I' m# d, J/ o2 r5 ^* \* Y, M/ o5 | i. U: J0 E# H
#if UPP_DIR_QI==0
: b/ t' T2 f, h- T ~! a2 k4 P upp_dma_receivestart();
5 c* o& r2 w2 i9 m* G" D$ w5 B! T, B ret=1;9 p" Y- _3 s) m% l: }/ j
#endif
' Z d# Q0 Y% D! c* o) o3 A! g }$ w- V4 t) |: R* x |* e
% `1 W3 H: W, G' m( _/ u( y$ Z- z5 |
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件5 o5 W7 ]* i- o0 w# i: O
{* l4 d7 ^" q8 A9 Z' ]
Log_print0(Diags_INFO,"erri.\n");
) b6 t7 k$ n* {' J, E) \5 y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
/ M5 K' O" x- {# M5 f! H upp_error_count++;
, D) {. L5 T" Z' n I) G' F. `2 j }8 \* ^4 \" R% G8 C# X
! o6 j9 A1 ]- B1 U* X: z) I if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
( e ] G2 v+ o9 T {7 i) o/ @0 h4 I0 r+ n: G* j/ T
Log_print0(Diags_INFO,"uori.\n");
$ ]4 e1 Q2 D& r2 n; i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);% @. h3 o+ a1 N$ f
upp_error_count++;
* i5 P6 u2 n% V; f1 [0 V, ^8 a) a, v$ \ }
, n1 c$ u& E/ e6 l/ I: q. G) B, \* E7 g2 i, l, [* q
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
' O9 Z) c' y6 [5 @ {/ c7 Z' C% f& d9 i5 w
Log_print0(Diags_INFO,"dpei.\n");
& {' i% h1 l; p( m7 m0 | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);0 t9 M- O' g5 ~9 S6 D8 }2 z
upp_error_count++;1 M! T% ^ I% T9 E! t/ \5 [8 `" Q
}( q" w* h" c! B4 }
" k, B1 x8 B1 W7 I% Y @ if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
6 ]7 ^% ^4 m7 e" D t' F1 Y {& W7 A9 |$ [+ |. G* G4 _2 m3 w
// Log_print0(Diags_INFO,"eolq.\n");
- X0 s' F9 t/ M- d" l* H) w' r3 D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);2 t5 |. ~# N2 J' n( k, @
}
3 q# ]* U5 a+ v* ^; r* A: H+ u% J/ v0 T, u$ K9 Q4 G) F2 k
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
# g* @. A s1 d3 [ {
( X' F+ q2 O' ^3 w+ c// Log_print0(Diags_INFO,"eowq.\n");
0 [5 @% x2 O! P: E# d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK); h' v3 b. z2 K2 ]3 `
upp_interrupt_count++;
, h$ A& h/ {8 C) Q#if UPP_DIR_QI==1+ P- S2 S& l+ Z
upp_dma_receivestart();
# `- _2 ?7 m3 W! m' @& R7 T7 V ret=1;
4 C# }( |8 m' b3 _5 o( L1 ^# G#endif
3 x8 x% y+ A" Q0 u }% O$ O5 N' y- g& X0 `! L
9 D8 e+ s- c% W" R" ~
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
( Q5 m; f2 W1 x2 z2 u+ X {
; U5 I2 P) [& N) a$ j* _6 y Log_print0(Diags_INFO,"errq.\n");
$ \# s9 E3 i0 x) ? t5 B( V5 f5 m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
" G. l l4 E2 R. D0 B0 R2 d Y2 J upp_error_count++;
0 c. _. x" |+ l9 t. }* c* V }
( q' ^9 I) @- Z D+ V
! Q- ^: Y: r0 m) L* o if (intr_status & CSL_UPP_UPISR_UORQ_MASK)' x( n0 H: n- @) a: f
{
' s! O/ _, s a. o7 \1 i& B Log_print0(Diags_INFO,"uorq.\n");' O4 M6 n1 V0 I" \7 o( B3 v& A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);2 \& C+ Z7 _/ G W5 N
upp_error_count++;: x. o; f' o% e J$ R
}
?9 O1 X: ~" c; N% N
/ I$ L* Q. u9 \1 J/ j if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% I# s0 U6 M1 u |, _ { \$ g4 i8 Q. C& g$ b
Log_print0(Diags_INFO,"dpeq.\n");8 r T' }) |, o3 j7 v6 R
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
/ [8 R: p* S% P" S: G upp_error_count++;. p+ y7 u4 i) E# _
}9 w V K& }- U# j2 I6 q
% ^; |$ }4 _( n- R
// make sure all interrupts are handled
1 j/ t8 L S5 J& U9 K intr_status = upp_reg_hdl->UPIER;
3 ?" I. z, f3 ~, G5 x% B }! C1 H9 V5 {0 o( |) Y$ [
: }* L2 l" ?- B% j4 M7 \9 D
// finally: write 0 to EOI register Z* f; `% ]$ K1 t% {& I- ^% B
upp_reg_hdl->UPEOI = 0;! z0 L6 i4 l# m
return ret;
% w4 t: z: H/ H' _) F. O1 }}! }3 G& {6 ]2 R0 Q) Y, p
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
( ]* K' Z/ W" W l1 i, s. m#define upp_dma_sendstartQI(x) {\
- a1 G' z3 G+ V1 m: f Wait_upp_SendReadyQI(x); \1 V2 v" ?# J7 w2 K7 E4 X7 A. G% b
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \, F1 B7 v3 Z; ^9 o
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \2 f* i/ D1 ~% f D; L' W2 F
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\& N1 i2 o) @* f8 j
}, P: x4 B6 Y5 ~$ z+ q% L! y1 ?
: ~# k8 A9 f0 M& Q _. }+ c1 ?2 p
1 Y$ s- |) \9 \% @9 e8 y8 v#define upp_dma_sendstart() upp_dma_sendstartQI(I)# |" D8 D# k+ [
# r' h, f3 i9 `! g. t) L* N0 a' {' r" Z9 a
想知道uori错误是在什么情况下面出现的,好做出修改。1 |8 W+ H/ W- W; m6 ^2 E# i
5 L: t8 f- y) c+ v6 X
b2 \% H' @+ D/ @: O, { |
|