|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
/ M4 w9 ?1 }+ f- Xdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
2 K5 O$ l8 Q$ x! c8 |9 qu32 UPP_Isr()/ a3 a5 M% ?7 V
{
0 C, _6 [# O+ E9 } Uint32 intr_status = upp_reg_hdl->UPIER;" Q9 f0 y. v7 C
upp_reg_hdl->UPIER = intr_status;//clear% x/ p: @6 O9 P) F" ]9 h H
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");- x/ q9 V& V9 \0 S9 M, I& ?! |7 C
u32 ret=0;
/ }' @3 I4 x$ j- d( X
, f( {) u# R5 z( V // inline functions6 }* |3 d; q4 r2 z
while (intr_status != 0); j, V& ?, ^( p- m+ V
{
/ l" s6 c5 \( Z: N if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
) \- e8 P q6 {8 d" }. ? {
2 j" A3 i6 ?1 T$ [// Log_print0(Diags_INFO,"eoli.\n");
& I0 A+ I& J+ W) u) e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
) p; `) w4 @6 a% |1 d* K }
: c3 I& Q* g: z6 W8 g( t
; Z' b! S, G! l5 ~# K5 k if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
8 T% ], @' x. j% m7 T5 ^# H4 e6 N {
6 ^+ w, P- T& ?& J Log_print0(Diags_INFO,"eowi.\n");
, `: V, R7 m* ]. v1 { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);- j2 j4 F% ^ m2 v, T) S, h; m
upp_interrupt_count++;
& c E) D( D2 ~# J upp_interrupt_eowi_count++;3 @/ T5 {; r8 ~, E% t- }0 x
+ s# j h: Z$ E& _+ t
#if UPP_DIR_QI==04 q4 D2 `& F* T4 }/ Z+ p, U
upp_dma_receivestart();# F; T2 s$ b: Y" O! h6 E/ i( ?# {; L
ret=1;, u: V. u8 N& }$ y# f) \
#endif
/ Q$ j$ l8 L" s& a7 q }7 ]3 D) r' N0 Z
& P0 a% s% d1 t0 Y: { if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件; \: l& b) ^) Q( L
{
) v/ i% z. x5 l, ?5 O0 Q Log_print0(Diags_INFO,"erri.\n");
$ {8 t1 G2 ^1 N8 T+ O/ \$ c3 D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
% a, i; T; S2 c' D7 w+ a# d upp_error_count++;/ J" i# d% I+ D0 @
}
) }+ O9 }$ P* \3 T$ \
1 S Y- `, ?; r, T- r/ n4 O+ s if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件& A4 V& A: o3 _% E8 x
{
6 N, D6 ~. m; f, j s Log_print0(Diags_INFO,"uori.\n");
3 _/ m4 d8 A$ c/ y5 O+ k+ X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);& s) A, R7 g% M1 D" Z* K( e. {
upp_error_count++;
* v) v2 z/ N% H" |7 ^5 l7 Q5 _" I }
4 l6 N2 v, C N3 U% S
5 U2 p I+ `" ~ if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
* q: b: ^: K2 R& ^- q {
4 D$ b, q/ |2 t7 T Log_print0(Diags_INFO,"dpei.\n");. Q! n+ V+ C: j9 e' l4 O/ k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
. u# y( {7 }: g, O; t5 h upp_error_count++;
7 ?5 Q* V' G8 M }( V2 r) v! e' [7 k6 w) i
8 ~8 Z& |* m/ I8 p
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
# f4 F$ d6 i( V& i {
5 _) B+ D+ M( b5 M' F# c$ B// Log_print0(Diags_INFO,"eolq.\n");
: ]7 b- r& _ n) W% ~; l) o) a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);8 z, R% x2 m7 {
}
9 E5 Q/ T+ J% q' f- K4 T+ F: k5 Y$ @6 }
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
1 j' |$ R5 O( j. U {3 d) W) x2 \9 A I
// Log_print0(Diags_INFO,"eowq.\n");& {6 {; ?4 n4 j, L3 \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
) r2 ]' W4 E# B! F upp_interrupt_count++;* h2 i/ i8 T' T5 ?
#if UPP_DIR_QI==14 |4 Z7 h; C: \8 c' d& ]
upp_dma_receivestart();! p$ t3 i2 _' A6 d- q6 m
ret=1;' v- Q9 u {* [& O! r) i
#endif, e: f* V, q; R
}
3 C" M: b5 [& u1 o& Y( l- h2 d3 c& S9 i: g& h M( l
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
! q: l& m9 a% P0 c {
9 x- C$ o" X/ y% H2 G, m$ q2 Y Log_print0(Diags_INFO,"errq.\n");3 A: ]" w; ^( f9 _: s+ }$ U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);. u6 n) c" c; F' r
upp_error_count++; W/ `* G8 w0 b$ D6 M( H8 g# z
}" s. F J' G2 p0 Q2 q
! X4 c F8 H7 Q6 x/ t
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
6 C5 u( y, t1 ?8 @ } {
" Q. y; D8 @. z- I7 Q Log_print0(Diags_INFO,"uorq.\n");
, T$ T& F; N, `- O upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);) U4 ?- ~$ K# r3 y* q
upp_error_count++;9 U5 k" B' W! C& i% m, \5 p
}( E0 X! Q9 ?/ ^5 n
9 ~$ s( h: e+ O5 ]( @
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
5 e; N c6 s9 T% G. i1 Z- | {; r1 J! S# x5 Y) W8 \
Log_print0(Diags_INFO,"dpeq.\n");
O- A" Y$ x. B+ k) a% _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
) f6 p! g/ K5 Z" R6 h upp_error_count++;( N% ~- _2 j) R8 L
}! |' q+ T, ~4 N u: b
& y# V/ L- r6 h" ]1 Z // make sure all interrupts are handled
. i1 P- b- M: J5 B. O* w intr_status = upp_reg_hdl->UPIER;
6 v; S5 \2 e0 _% ~, u }
$ K$ @) j& O {( i( d" c% X
. X) K, W" k4 ?' n! `! e3 O // finally: write 0 to EOI register1 H1 W# ~- `9 \! D) e
upp_reg_hdl->UPEOI = 0;
7 ]% L2 l( U/ A. o1 Y0 }+ [ return ret;' L$ e4 f. `! \
}
2 a( J( }7 t5 _( o. E& a) @9 Kdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):9 B/ M+ Z8 U: U, X8 Z7 S [. F, J
#define upp_dma_sendstartQI(x) {\
0 E/ `' _0 c5 L* a- L% Z Wait_upp_SendReadyQI(x); \
( y; w+ M3 W8 g$ O, s upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
- v; d% }/ r; k$ z4 k4 N upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \/ ~5 N& ^; B5 z& _9 ]
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\" X7 o% r. Q2 u* g6 }
} U$ b: C5 q/ w$ k* U7 {; ?. G# {9 w
6 b% |4 g! m) U5 E; H/ p: O
* f1 U: O& s* T$ [#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 T+ |! z* t, R% Z4 S% r
, ~4 v3 f1 W+ X$ Q; V
) T; x% A% b( M! m+ u& z想知道uori错误是在什么情况下面出现的,好做出修改。) i: U% ^2 v" r: R6 |+ q
- R+ c$ v- E& ^% i: t' ?( [' p) ~ B. q5 p; J9 h; ^$ n0 F0 @
|
|