|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?* Y/ A5 ]; e+ A
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
1 a0 O$ C" X6 ^/ Wu32 UPP_Isr()' A% G# q4 T4 W; I: X
{ D6 p3 m, T9 g! ` S, ?1 W
Uint32 intr_status = upp_reg_hdl->UPIER;
# A& F: S1 c# c3 ~7 G upp_reg_hdl->UPIER = intr_status;//clear
2 k1 M6 q- m# h// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
" @6 H( H1 T1 m s9 _6 W5 J* u u32 ret=0;
. `- |9 c6 `0 N" ]: \
, ~4 q: [" d4 V5 q' o' ]0 A. C9 W // inline functions
9 S, L) m- n! K& L. H; y/ Y while (intr_status != 0)% L9 d" _4 C% z( ?! y
{
: X! f) P& y* _, W$ k( b' ?0 T& E if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
2 E$ }0 x3 h2 `5 _8 G( Y# X& f {5 k( Y! i2 y- P( k0 S/ `6 q
// Log_print0(Diags_INFO,"eoli.\n");
0 O7 o7 o- G: A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK); j9 | q- W+ ]6 G" M
}- |6 b# S! r+ j- `
0 V$ }" ]& ]+ D1 ^ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件" j# J0 C. n( @3 |1 c
{$ L6 ^% B3 D: h& X" e2 M
Log_print0(Diags_INFO,"eowi.\n");" q9 s! g% M9 x0 ^/ i, D
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
7 H% C- [& C& }4 \' T upp_interrupt_count++;* X8 c& b3 U6 L$ ~+ V# V0 {( j$ J
upp_interrupt_eowi_count++;0 u$ ~+ z& ~0 c6 W+ o+ }
" ^# \; L( @( ^7 v- j" c#if UPP_DIR_QI==0
x4 f, O1 f9 D' v2 C upp_dma_receivestart();2 {) L- ]$ _& `) x$ ~0 K# x
ret=1;9 W7 ~7 u# w4 x, `) I5 g
#endif* G7 J4 K8 k, H# H1 \; g
}
. p5 Y u) `4 T% W/ w; t
% T) f! h& j( ^, |4 q3 L if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
0 `4 J! V6 O. M, [ {$ g3 d0 {! Y+ z+ q
Log_print0(Diags_INFO,"erri.\n");4 P; |* X" G- ]) z7 T0 q5 s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);) B/ a w' ^7 [8 ~
upp_error_count++;
5 ^: o3 |9 [: N& w" | }
' q! D7 ?! }$ m J& R" v, Q! O( ^% e. z1 z8 n
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
8 O! Q6 r! y, U N3 w {
+ Y/ e' F+ R# f) q- |* M" I7 c Log_print0(Diags_INFO,"uori.\n");
9 t4 a1 J9 N5 J; N7 c; c! s* N. w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);1 |* E- }8 O& j( u* N) C, H1 n/ u/ B
upp_error_count++;7 U) m5 s$ V# S
}8 m4 `4 C/ a* n$ R0 A
. f& m+ A7 M; ]
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
1 W8 X) ~5 M% O1 D7 n, | {* A3 a* G, L! ~0 y
Log_print0(Diags_INFO,"dpei.\n");
3 {7 J+ p3 W7 p4 _3 l. e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
7 n. u# z! H/ v" o- c, e upp_error_count++;5 A; i( d, j; ]* ?8 C" {* [
}$ ~6 W* i$ b- b7 h' E
) K3 t7 j5 Y# D; k if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)# y* W: s" c$ q# u6 N& O$ L' m
{
3 W( b: q/ a, y+ j# e1 c( Y: J// Log_print0(Diags_INFO,"eolq.\n");; m, ^$ C I/ ]2 j% n- @: q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
1 B Z9 x( t4 y; I' b! Q2 i5 x }
$ {" w# C1 K& `. U) j6 h$ c% E4 s
4 B( G' S! ]$ l d if (intr_status & CSL_UPP_UPISR_EOWQ_MASK): z& U3 _: W$ t0 p7 p
{
5 d9 j" i( [7 x; N) k// Log_print0(Diags_INFO,"eowq.\n");
% _- `: |3 [* B X( y% d2 p5 b' d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
; ]! L3 w& c7 ^; T3 J! f- F upp_interrupt_count++;
" `" b" d1 i, ^. d ^% L#if UPP_DIR_QI==1+ `! [ }8 Q# L; w8 v
upp_dma_receivestart();
. \4 ?% A0 H7 ^% F# j ret=1;- F7 @0 e Q. z5 z+ ]7 w' t' N t
#endif+ Z' D2 S) w8 r) \
}
- Y/ r: Z, y* s" N6 [5 d# k4 g# ?* i; Z( @4 k2 {
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)# F4 z, R) V5 M, h8 i) j$ g
{0 x1 ] R* o2 W5 H# C$ x/ C
Log_print0(Diags_INFO,"errq.\n");
z& j6 l/ P$ `9 P, g+ V* @' c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
% b% F1 {! O% L; F8 F6 r6 K$ R upp_error_count++;
/ K8 J4 c; v, t0 T0 g }
, e8 s; t! P. p: k1 S @. ?5 t+ P ~/ ~, P7 T% ^
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
$ W/ X5 E& d! H+ \ {% c/ [" \2 L3 }; O
Log_print0(Diags_INFO,"uorq.\n");
4 r- X6 \: }: |+ o upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
7 l3 h$ F: I* h0 U% F2 s* f4 X( \ upp_error_count++;; F' k' _' e4 ^: u# \ t; }$ m
}5 r8 N. c7 R9 T9 [
2 G, p8 [1 Y c8 d6 k0 v( h% v6 g if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)9 G9 s; _ P0 i
{! H4 V q( a3 `/ C3 F: {
Log_print0(Diags_INFO,"dpeq.\n");' q0 o; v) X7 V# m2 y) J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
- b% Z! ^, ]7 `5 U upp_error_count++;
1 M; h- F' B. c }( @9 e" c2 C. f% u* H
3 W* i+ F6 q7 M; w& k. x
// make sure all interrupts are handled5 K/ m8 M @& h% D# p8 `; K
intr_status = upp_reg_hdl->UPIER;3 K, z6 L0 @, B. J9 C( _
}5 z" \. s4 O3 A) R, ]
* z. K2 J/ r! i // finally: write 0 to EOI register: @) W: S9 ?$ n: @/ a& Z: h
upp_reg_hdl->UPEOI = 0;
5 V. t" `' v' _3 B8 L( t return ret;' ^, N6 J2 l8 k! D1 z9 q; o
}
; S w0 {$ G9 D. Hdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):: n% m4 l: a# ^8 h% q' F
#define upp_dma_sendstartQI(x) {\
: ?0 y( m- } A* q+ ?- A2 d Wait_upp_SendReadyQI(x); \$ S7 \% b1 [: N8 {( y' [7 Y, H' o
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \3 `' I" x5 U2 Z2 {; l- K5 s' v
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \9 D' e. S7 X7 t) h/ w Y
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
& a m. h# z y5 d }' n F+ |/ \- J" E4 c; b
& N) V& ?6 m' m: b' T
M. W6 w6 J2 }#define upp_dma_sendstart() upp_dma_sendstartQI(I)# K/ |. L R5 C, e, y0 z V
) \: C0 b! {- d, g) O0 L. @* x# l ]5 [6 l4 S
想知道uori错误是在什么情况下面出现的,好做出修改。
" b2 r2 a5 h) | M5 ?
6 @: }+ C& n) d- K0 b" Z* y8 f0 L' `- @. j0 G$ E- }
|
|