|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?& F+ t6 e; s) O! G* Y
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
: h# N2 c. n9 F' L' d; o ~u32 UPP_Isr()5 [% C% L7 j* m m5 X
{
( L I7 m2 P6 u& m: H1 o; i Uint32 intr_status = upp_reg_hdl->UPIER;. `# h# Y) ~" v6 `
upp_reg_hdl->UPIER = intr_status;//clear
$ H' `+ f7 ~0 `9 h! ^9 a) ~// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");7 @; j4 V1 T! C4 Y9 S# U+ R: J$ E
u32 ret=0;. I: B- S) J) b: M: w& k
; n$ F* N/ p: W s4 I
// inline functions9 C4 Z+ E& S; {0 e9 }. m9 {
while (intr_status != 0)
& `9 e" l9 v/ x& @ {$ r; O& \2 l4 ~6 T* p4 I
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
( g& A- _! @3 Z1 L+ o {
% G( ]) N K3 R# D4 E// Log_print0(Diags_INFO,"eoli.\n");% ]7 b! W$ f# w! W4 T2 ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);: j i# i+ z6 R; M$ a( ?5 P
}
: t; _! D6 [# I3 u5 ]8 o/ F# V6 d. c6 _
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件& a% f) R* s8 g: o; r7 b$ u
{$ V/ o6 ^2 D8 T. ~
Log_print0(Diags_INFO,"eowi.\n");
; S7 o9 q$ \3 {* G& G c0 e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ l* X& I% C" V upp_interrupt_count++;
5 Q1 p) `- B: w upp_interrupt_eowi_count++;: w. d) V* G( |- r* w% t
% o0 `% Z* y# `& ^) P' o" U#if UPP_DIR_QI==0
0 z; Y. w7 L, w( W2 G5 F3 o upp_dma_receivestart();, K- n. g9 X8 ~& C5 f
ret=1;( v+ Z- v8 t, m5 m# ~
#endif" p0 V* y: N! f4 x/ D8 c
}! Z4 M2 H8 {- K
% G5 ^7 O& \- E" u4 [ if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
0 g0 Z1 K; E, [6 |7 n4 b {3 l4 H1 H9 H$ a. X6 j
Log_print0(Diags_INFO,"erri.\n");
0 I$ C& i# c/ L% h/ P5 u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);/ [3 {* [6 |: Z% L: i; T& Z
upp_error_count++;
- v8 \- W5 E; M7 ^ }
5 w a7 e( E0 m& @# l: Z5 w9 Y8 o1 r5 c8 \) @6 O! Z8 I
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
1 a% U: f8 B% b- h {
4 G* q" t0 G$ O& k! f4 | t3 x Log_print0(Diags_INFO,"uori.\n");, M6 f4 d. i% j2 ]0 T1 `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);. {( t0 x: _; E) V( q
upp_error_count++;
}3 u8 L; b4 \' s$ W- I0 ~1 T5 B } Z+ L; M& w' I7 c/ B* m4 u
1 f+ P7 G( _% G
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
6 G \8 y( ^$ g9 \4 o" L {
$ C7 O1 p- @& u# `% {; u5 Z' Z Log_print0(Diags_INFO,"dpei.\n");
! T0 x- `, K1 E: S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);7 A% b' f" s4 |2 c2 O
upp_error_count++;
+ B( A3 y5 a( [/ F }
9 j, ]* R6 y% |1 E
% ^% ?# f0 o8 ]% J( E1 ^ if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
$ F1 K- `$ H4 P c$ D% s {
% V p! y$ z2 h3 @$ M& p// Log_print0(Diags_INFO,"eolq.\n");, |" Z, c+ K: l* H: k1 m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
: _" m; [' G2 _/ V! U9 O: q }$ A6 u- a0 H9 L4 o- I7 ^ x" E5 v
( O) S( x' m9 j if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
6 q/ \$ |1 t. ^( F: }/ F% v5 Y- ` {/ z- v) W* t' f; W. A
// Log_print0(Diags_INFO,"eowq.\n");
, e7 x* I/ I8 i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
( W( V2 ~) i T X upp_interrupt_count++;' s" R5 ^! C6 B' N
#if UPP_DIR_QI==1
3 ?: U2 b/ @0 W1 K) ? upp_dma_receivestart();
" X( s) M+ |7 ]' a+ R6 p7 S ret=1;
0 d3 L3 J- e, B# J& a1 W. @ ~#endif
0 k) r# {5 I' }- O( x8 o! n: K }
0 \# x7 Z3 z1 w& U2 ~, P2 J: f$ d7 I/ ~6 r7 E$ V( z
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
3 V5 @! e1 r) O5 Z0 f( Y Y {# L* d, R0 f- @" F! R- Z
Log_print0(Diags_INFO,"errq.\n");
/ X3 C3 k& \) c) z5 c) K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
. P# c$ |3 {7 |+ J9 @: N! ? upp_error_count++;+ {) r' ~1 ^/ A% U- C, R) N
}2 f4 P* l j' D/ A2 U" Z( A
2 }/ ^& b) y1 y( U/ O3 t4 i if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
! y+ u% W* }6 O* Q) \3 ]. ~" v {
$ i: m0 G& p C( u, V Log_print0(Diags_INFO,"uorq.\n");& C1 X/ k7 i0 O- E2 c: O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
9 Q! u0 y% ~' _8 B1 ^' h. C7 n0 @ upp_error_count++;
: z6 \1 J4 ~( y }2 a6 d! T. r( {9 S' q
5 ~$ u b2 I# }: }! G+ S9 K2 z if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- C Z5 W5 R3 ~) }0 ^ {7 M! X* J, H; l7 d5 v
Log_print0(Diags_INFO,"dpeq.\n");
2 R; ~8 p/ V8 d6 i) u& z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);4 h& ^0 k; W$ b3 I
upp_error_count++;
0 J) o: i6 u- t$ z1 l; N# m8 u! x }$ D7 K- `( O7 O' u5 A
& F+ R5 v" q; ~% f // make sure all interrupts are handled! O2 F% P! V, `( J
intr_status = upp_reg_hdl->UPIER;
5 w% F& l. x* O/ |' f7 q" Y }# |1 D+ P" P# x- z5 @0 G1 k; J
( J5 Q, g6 N K. x$ I5 q
// finally: write 0 to EOI register
/ |& N$ E5 D0 Z" _" L5 U/ ^; Y upp_reg_hdl->UPEOI = 0;9 r Z2 M, k, U' m' Y! i& V
return ret;& j' ^, S' M7 Q( Z9 X2 v+ |
}
" e1 K: }$ R: ^# L; E2 C% t0 H/ ldsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
. E! i% b2 I3 Y# c! |/ B9 v#define upp_dma_sendstartQI(x) {\
. X; o7 R0 L3 D b- K b Wait_upp_SendReadyQI(x); \
: F' I8 s0 c$ ~ upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
6 q4 a2 F9 |% ]# V" o1 f. M upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
9 }$ y/ h$ z- n- B upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\# Q! L$ P, W6 D) k+ N5 H' r1 g
}
7 V6 Q2 V5 A, D& A& F1 T) @5 P' _: i9 t/ P/ |
6 f) J. U6 x5 d
#define upp_dma_sendstart() upp_dma_sendstartQI(I)8 j k' z# S- \0 K# s: y+ u3 n
" c& T. n0 n& p7 l0 P8 {; Y! A
. x5 D- ?$ k2 i! C* R想知道uori错误是在什么情况下面出现的,好做出修改。8 x, C% B8 @# p e
# F c, ?$ D1 L
5 ~" m- X ^. u# v% V% E0 r |
|