|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?* ]1 k6 `! d4 A3 q5 Z* o8 [& ?) H
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:8 o: T- d# H4 Z, x6 {0 O) h( ^
u32 UPP_Isr()8 V/ X2 p4 t4 @
{0 c3 x) j5 {% V( O8 O7 C
Uint32 intr_status = upp_reg_hdl->UPIER;- L8 X# \' ]. A' U& p
upp_reg_hdl->UPIER = intr_status;//clear$ s0 Z5 I" L, a }/ R2 R6 z$ x' V4 b
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");" Z6 x V# u& H
u32 ret=0;
- i0 }$ {, [) Y3 w' K! \9 q
. K) X0 a3 u0 ]* k( G2 c // inline functions" W- h2 T) A! N6 R- }7 Z
while (intr_status != 0)
& z" \* S4 \& _! w y {
& Z+ I# \' I& z8 e* m: b if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件' W& I4 h. h0 [, ?
{+ E0 v6 O2 i' x3 ?
// Log_print0(Diags_INFO,"eoli.\n");
" f4 ?& Y; m3 o3 @5 E: w, X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);2 e+ G9 C# D4 u: \4 H
}5 }4 N0 U1 X0 D w
6 r! W$ [& b) o) U1 j7 ?) v3 h% H# s0 ?
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
* M& U4 G( @2 a U6 o {( o& u6 x0 n% z1 u2 Q( K
Log_print0(Diags_INFO,"eowi.\n");
: W3 u$ t/ U0 w, ~: U upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);7 b5 Y W( f2 e3 ?
upp_interrupt_count++;7 R; @# J& U( T' h0 C" ]
upp_interrupt_eowi_count++;
* V0 o1 b% j4 N0 f# F$ g+ a1 y" x& U) I& T+ C+ @( ]$ Z' A- x
#if UPP_DIR_QI==0$ R4 |% z( h0 t- q2 u9 R1 B% ]
upp_dma_receivestart();! z! [- ]+ p" H1 P* P
ret=1;
" U; ?. T7 D. l% @#endif
M/ m3 V; L1 _( j4 w }
! M% m( u' \+ j, R3 ^4 K. d+ h, A) w* y' U8 F$ k* u
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
. m+ t8 e8 K! A6 p {4 s' w2 O% Y- f) Z+ v3 H# d N# K1 N
Log_print0(Diags_INFO,"erri.\n");
* O* i' X# _% l( G% D) O upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);" z( e& b5 T1 n. s* @, c
upp_error_count++;4 f# w& U" T8 d6 e! {
}
4 R; t8 Z' k- @% X! p1 k5 M+ H
/ x4 p& _, r2 Q- U if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
4 V$ `: @& T8 j6 m+ Y {
0 u# p0 e) W8 P0 @% m" _* `- _) e Log_print0(Diags_INFO,"uori.\n");& z/ ]5 T( ], `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
5 W8 @: ]! i4 p0 N8 b) G$ U% h upp_error_count++;$ c) c* ]. k2 X6 T5 Z' w( U
}/ P* ~; a' w6 r% o' a
' W$ y' n! h" k+ x
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
! U) e9 R8 {; w' V! q( l {( @9 f1 A. \( N9 Z4 x
Log_print0(Diags_INFO,"dpei.\n");
( N* z- ?7 Z! q6 C1 _* _. G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
8 J- u0 n- O# F1 W: U upp_error_count++;" M+ {5 A0 r6 ^) D. Q
}& G q B* T X! C$ a' [, A" j
1 R- {: C _5 p, L+ v
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)4 Q+ _; f. j3 e
{
5 F r: |: S: M9 m// Log_print0(Diags_INFO,"eolq.\n");, F. x4 A9 {4 z6 L9 Y% L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
! A- W$ ^ r1 s }
% D& \/ v! [2 |3 w, \" m5 p
; H' H; W6 B5 n1 \4 n; N. ~) I% k if (intr_status & CSL_UPP_UPISR_EOWQ_MASK); u6 c$ ^3 t y: P3 Y' X. N
{1 t" L. |& t: Z' o# b7 t0 k
// Log_print0(Diags_INFO,"eowq.\n");
" p# n \2 k, Y1 W6 `: O6 `( _2 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
8 _ S) ]6 ^% q4 J/ ~: ]! y upp_interrupt_count++;
) ?6 t( R5 L. u! t; }#if UPP_DIR_QI==1
, R8 Z: T6 u' E1 G0 z( f upp_dma_receivestart();! ~. L% r* I) N( q
ret=1;, N, l6 D5 T) _9 H) ?
#endif
* _9 c" ]" \3 D+ m9 p9 W }
" S/ F. b$ Z3 a! l% O: |/ m/ ?6 ]% ~2 D
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
# s3 v. F" I- Z! T { V6 v4 H9 o. Z
Log_print0(Diags_INFO,"errq.\n");
! ~& @/ Q* j9 B$ H* N( e8 ?7 Q& k8 Y4 { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);% R0 o% s6 G% H' @/ y, k7 [; s
upp_error_count++;2 A0 e0 j, }- y! x4 b- P
}1 y# O% s% w- P5 M. ]. m% z6 y
Q0 ?( l$ _ z0 G+ {3 P& g8 k, \ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)4 m" y: f: X8 o# [
{* y- B$ g7 F' y0 C" T" o
Log_print0(Diags_INFO,"uorq.\n");
" k8 d, g! E4 J- c" Y4 ~+ f9 q, ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);6 U! |& z N, j4 Y
upp_error_count++;2 N3 e- Q- K: C4 \
}
5 y) e @5 e0 z! }( H" ]) G ?. I. S+ n3 U9 E) M& s
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- f8 {) v) _& U2 ]9 |' R {
% N+ {% o# O) k. o7 U. r- ^+ D" a Log_print0(Diags_INFO,"dpeq.\n");
. `* d- s9 T: b! a% A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);& k" r# L$ {. ?% U" U2 A2 W" M
upp_error_count++; `# G w9 Q" n1 t
}
( c. v* _5 G7 k, C. W# f5 T# O q$ N3 \# u" J+ @( P K( u
// make sure all interrupts are handled. p: q/ T! i* _: ^( d
intr_status = upp_reg_hdl->UPIER;- f# D1 [. m. ?4 E( ~0 C. {
}, O: N6 n/ _: z2 b/ e
6 d# d5 y0 k- R+ ?5 a2 B0 K* J // finally: write 0 to EOI register4 c5 x; K$ h! b: U+ i
upp_reg_hdl->UPEOI = 0;' U+ i1 V8 t5 h& o9 N
return ret;
8 @/ T: ~% S7 A% q}# _6 r# D: e. ]2 n! p
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
: }; M7 m2 R) E# ^, g, e#define upp_dma_sendstartQI(x) {\
1 ]) f3 P! |7 w W+ o; X) F. Q- F" D Wait_upp_SendReadyQI(x); \# B' }6 ` R$ {, V- G
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \9 z0 M5 [& b9 W# [+ X+ {
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
7 G7 b6 E2 r' E$ q upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
$ w; G4 o3 _" f( ~ }2 C* e4 v, R- q T8 H
; H# A! H2 Z$ q( O7 ^
4 k7 V4 _' R0 s' d' }# \+ M#define upp_dma_sendstart() upp_dma_sendstartQI(I)
$ f" P' `2 ^/ ~, H0 b$ g
+ S5 S4 M$ p$ p# ?
8 E0 r* |& C5 j8 q8 _" g' ^想知道uori错误是在什么情况下面出现的,好做出修改。$ n6 W( k2 ]2 o O# m4 V* T. ?
' r/ F' Y! X T
& b) \ \# @$ ^) W( r B% _ |
|