|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?$ X. M3 t' ?$ [7 f: c
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
) y9 Z, ~0 r+ P$ i* Mu32 UPP_Isr()5 m8 ~- f( j/ B, M+ o& Q. @
{- Q, R8 v/ y/ ? Z; S2 |
Uint32 intr_status = upp_reg_hdl->UPIER;/ Q- q6 @4 n0 |% O6 W
upp_reg_hdl->UPIER = intr_status;//clear" _- I3 |4 `: Q( R/ ~
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");: Q6 L- ]; e7 P
u32 ret=0;
3 B+ c) C# K9 U1 n: Z, y
$ `3 z; E: _3 ] // inline functions5 g) s6 K4 B% K1 G& [3 ~) x2 s
while (intr_status != 0)
6 f% b- k" ]+ O& U {9 k% X0 w* }5 g% o. t
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
; g3 q, ~* v( F/ C) u3 t {) A0 B; d7 r* R2 s. ^8 k1 W
// Log_print0(Diags_INFO,"eoli.\n");
/ a% K' n( o( ~. T& a- T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);3 j6 E9 R: @9 v% E. v7 ~% H
}
/ a& ~; E. H$ J8 o' b1 E# B4 N) c- {2 E2 f0 ?, A
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
3 i+ C* I7 I) L6 K8 g3 ~ _ {& r0 }7 j+ F1 ~. R3 X9 Z. w% B" R
Log_print0(Diags_INFO,"eowi.\n");# t# J: O. ~6 w: K# k8 g
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);+ t. g, ?$ n$ }4 J
upp_interrupt_count++;: j. G1 ]9 W. y. y/ u
upp_interrupt_eowi_count++;
2 d' F' h9 e- O3 |, Y
# P) ^6 K7 t5 O0 S& d& R& L- x#if UPP_DIR_QI==04 I% ^5 R* x. V2 m
upp_dma_receivestart();
, U- K9 |6 R. S& \$ f ret=1;
& Z! U9 u% V' I* z#endif
. y I+ \ P1 f% |' L }/ M+ s8 Z J( D8 v7 P; c
8 D g3 j2 y# ~* Y9 \" @, ]3 o
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
# O) Y( C4 I5 R( a# s" d {
2 V q! {& W5 i3 M2 N; ?3 a' j+ k Log_print0(Diags_INFO,"erri.\n");+ U: _" ]; `1 e3 r, W) Q0 [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);' s0 Y2 r& h! O' t4 l# S" W" {
upp_error_count++;
0 x7 O3 a0 o& L! J6 i: k% F }& |8 @% t! T! p" r4 G' B
9 L$ A2 h4 T! j" U0 R; ~9 r6 q: } if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
Y4 z) o! W, i+ d2 z {# g$ }- O. W$ v6 ]2 X
Log_print0(Diags_INFO,"uori.\n");
" m5 v/ N8 ]7 v6 j- \3 h8 [- t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
0 |* C) N$ A: C: h+ K7 H5 e0 { upp_error_count++;8 w8 L. s" f# [& z
}' M4 L5 V+ o& U0 i: b; J, j0 w3 C
7 t" e" X# C2 ?! v N1 z if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
Q+ p" C3 x/ m3 |$ W1 | {
0 R3 V0 a- W$ p" L- S# z b Log_print0(Diags_INFO,"dpei.\n");: c& T- h4 D3 |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
% p; U! V0 d( J8 f6 |6 i upp_error_count++;
6 v' e1 O7 ]. b }
' n7 f# c# c& }7 n3 U7 d4 W1 i: P6 d6 |4 E9 I' Z/ \0 U& k, @+ l
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)* G" g% ?: W1 d) l' j& n* u
{) }. q) K8 E3 \+ [0 \
// Log_print0(Diags_INFO,"eolq.\n");
/ c# Q; e9 `, h1 T: Y3 [: a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
) A" P: G, F) }0 o l5 s+ K3 L) } }
$ y0 S1 H9 M0 u; }0 K$ o5 ^9 N, B/ `: g! K# D% ~
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
+ \- x! [0 v* w- ^( A {3 p& ?. Q; y6 y3 G+ E0 U/ l# K
// Log_print0(Diags_INFO,"eowq.\n");
O' x! C- D* G& y7 K& w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
: A; l8 F8 K/ L* Y7 F% v0 C3 z# K upp_interrupt_count++;1 X( v X, ~" g- d* d, ~
#if UPP_DIR_QI==18 O) Z$ c I+ F2 w c+ f5 ^. G
upp_dma_receivestart();
" A3 g% b5 C! w/ ^3 u, L% t ret=1;
& ^; b$ @, |/ w: f8 P% x5 G#endif3 V1 F3 Z- X5 y( e$ V7 y
}
X; F, A! _( M6 f4 T$ p0 j2 T2 g8 f' r$ A8 y) h. Y9 {
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)! j8 x" @( n0 ^& \' {
{+ x8 Z# ~# `: B4 U; Q% l- y6 c
Log_print0(Diags_INFO,"errq.\n");
1 V1 Z9 f2 I* W: B2 M3 x" k( G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
/ L$ I! h5 |( y& ]0 D) p; O9 ^ upp_error_count++;
4 R d% A- R" l5 v" O9 l* V% O }
y) U2 D, {, Z2 T+ I7 {. t) s z, H3 B9 p
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
) i. w! {! E, W9 R i& r {3 ~, c" N. q( x, v
Log_print0(Diags_INFO,"uorq.\n");0 w) B6 p1 `& Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
, x; w2 P* \+ _5 {+ | K6 D/ y upp_error_count++;1 c& `4 Q9 W4 W5 _0 Z
}
$ B9 x- O4 Z3 r0 |" @ C$ |0 w5 X' _* ]0 |% i# K
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
+ a0 i J: t V$ n0 K {# d" [5 w* J: X3 K0 H6 `9 D3 F" |
Log_print0(Diags_INFO,"dpeq.\n");1 @; k# P$ E' x% E. P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
$ a1 W3 |( O X* X/ \. O2 w upp_error_count++;
9 W' {2 N0 P( z4 V# L% p2 ` }
$ e7 {( k% T. M8 p# M/ W/ K- Y8 g! O' j1 D+ R$ ]2 X+ \
// make sure all interrupts are handled
, W0 ~9 T ?; [5 g! H8 ]7 ?4 _ intr_status = upp_reg_hdl->UPIER;9 q2 r3 k7 J$ Y6 Y, S( B
}
% L5 }% e" l2 [$ V
0 Q' M- I' b5 ` // finally: write 0 to EOI register
8 V8 n! n6 J" c- t: z1 g upp_reg_hdl->UPEOI = 0;
7 E- \7 X) z0 K. @$ y5 I8 [ return ret; `4 ^3 n6 p/ K$ G1 Z
}
( p, S- A5 Z! `" g/ |dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):7 {6 j5 Z2 |$ v6 f9 Q
#define upp_dma_sendstartQI(x) {\3 i- ~! }& x/ G
Wait_upp_SendReadyQI(x); \: W' o5 t8 a8 M; y5 K/ R+ \
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
* f' }# X i7 ]' { upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \5 O ^; V( L$ w% i1 I7 f
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\# z1 g, r) }( b" O. ?
}
7 Z5 h0 k( h2 ^7 V( [* z7 b. _! L; t# V# f
: d- \" T: m ^#define upp_dma_sendstart() upp_dma_sendstartQI(I)
# i: H# w! K9 Q4 w, k: ]2 K
' k- a. A" A; o' E0 p. r. i4 c0 M% L4 g; N( }
想知道uori错误是在什么情况下面出现的,好做出修改。
1 d4 A) t2 S& E$ S& s" I1 x# A) T6 i. a7 T
+ U8 E6 {; ^7 S& s, u" j
|
|