|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
4 O( k7 ^% d4 X# Bdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
) g% p+ r( ?5 Fu32 UPP_Isr()
0 _: n' N* j' X" v+ N( E- ]0 j{' a) Q! M* g0 ?7 v/ Y; k9 a
Uint32 intr_status = upp_reg_hdl->UPIER;0 M2 `+ ^0 [/ L3 D. V5 N6 i
upp_reg_hdl->UPIER = intr_status;//clear( o8 L5 i! _& W/ b) [& Y
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");, u- Q0 {' W/ I2 W% ~
u32 ret=0;/ n, |0 @" e1 E, m/ Q1 J5 p' a
7 o4 a% |, a- P
// inline functions
& y$ [9 _" A$ o9 p; i b5 i1 Y while (intr_status != 0)
y/ I9 _* p- c+ X5 E {5 A/ w2 o& Y- R5 L% H7 Y& F0 `1 B
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件: T' ^$ ]+ T) z" h
{* ?, }4 J* [% Y
// Log_print0(Diags_INFO,"eoli.\n");
& \: E$ [; }3 G% P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);1 d+ y% k) Y: t# e
}
9 T; w+ H& e) n2 p5 k& }3 L( \% d) Y6 Y2 a3 y2 C8 Q. c! _5 e, Z7 d- S
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
% ~2 o( r. M. x/ V! A: ] {. w. C& C6 v$ r& F
Log_print0(Diags_INFO,"eowi.\n");, l4 g6 s' w2 ?: g+ Z( g
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);0 O- x4 ], N( ^' U& }
upp_interrupt_count++;
3 S) N& V+ G% [4 @/ E: ]% v upp_interrupt_eowi_count++;3 R H) Y9 P5 R( N! `2 D6 A1 o
. \; r, l3 h* c" K& ^+ R+ u
#if UPP_DIR_QI==07 T! D0 A5 d- M* F" }
upp_dma_receivestart();
0 Q8 r7 u# T/ q3 W ret=1;
9 Z' e& ? e7 e i' z) M- v#endif
G0 h: h9 @, B, r& L% H }; f" O+ J! [/ {9 G9 r1 X
( L: L+ @, O- d
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件6 @/ V% F9 ^+ T- W2 s* o2 T
{, {' r! h4 ?: c/ Z
Log_print0(Diags_INFO,"erri.\n");
8 U4 T& d+ Q m5 b' j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);( G$ ?0 o, R; W7 c
upp_error_count++;' ~% M2 y9 f, h1 c
}/ c6 T, h% e0 ]- a( e8 o k' \
6 ~, ?0 Z: J; W" n. w if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件) J, B: R) c/ B
{ X& b) N5 J; T0 g
Log_print0(Diags_INFO,"uori.\n");; c+ O# q+ G: m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
- l+ J% y! B# d& R+ T upp_error_count++;
1 Y G; i* ]( d* j8 k }# A7 p: S _* a2 M. Z& J8 }. S! }
l$ v1 A1 I! a; A6 ?/ \3 R
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件% K: K* f1 g" s7 h0 ^2 [
{
x, J S: I7 K Log_print0(Diags_INFO,"dpei.\n");
$ ?4 ^! u+ x5 F1 q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);+ F+ @4 L5 X' [/ W0 n: P
upp_error_count++;
9 z& k8 D1 P( M# @5 X }7 y |/ L8 O- e% X, q: d
: ]4 P9 Y6 _, V( _, P# n( s if (intr_status & CSL_UPP_UPISR_EOLQ_MASK). j8 I% N9 Z9 ?" Y7 q
{
. N t d, }2 x, k6 ~// Log_print0(Diags_INFO,"eolq.\n");
/ e) J. S3 L9 @ \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);1 X/ k; B3 u4 ~$ \9 F9 l
}
7 Y( _/ n1 z3 \; r+ |; T* [
8 H j' h# g% p* k( ~, x7 J if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)2 x) \ B6 S/ {$ k& b( P+ f$ O
{
" P# o" @& X( m# D5 j// Log_print0(Diags_INFO,"eowq.\n");
- a: Z/ Q( P5 m+ J! R" @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
s7 @+ L; ?/ d3 w; _$ k' \; ^ upp_interrupt_count++;
$ L8 ^& h+ @7 E2 T#if UPP_DIR_QI==1
" _+ p' G4 y* v) C1 v( X# U upp_dma_receivestart();! P1 C% {* G! ~1 X4 e; H
ret=1;5 [0 O0 n) Z6 m$ T
#endif' Q7 o: Y) E+ m. j2 N! n% |) g
}7 s' R! N6 K |7 W: Z
- j( y n- _) K4 F8 Q+ v1 D/ V
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)' }7 ]8 _; p. k4 x9 `/ I! L1 h s
{
% t3 D% C' E' D% m& Y Log_print0(Diags_INFO,"errq.\n");
7 J7 I3 `7 }* M$ A8 G, s, w# k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);# d2 B Z3 y$ [; Y; ^
upp_error_count++;2 |( V- }; i2 M* ~ ^; o% o: M3 g
}% b0 Y- Y- t/ Q, o3 M0 c$ Z. Z
9 N# r2 Y1 @2 A- S
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
# q' o \0 B$ C7 q6 D {
! Y/ ]# ~. i. o! P Log_print0(Diags_INFO,"uorq.\n");
K, {5 ?* H: ]6 p6 z" j6 K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);/ f$ a- w* }3 x" o& j
upp_error_count++;
$ W) h6 l" F( v0 U8 i }
, u2 L0 e& T0 R' c# G1 ~! E
' ?, _ B v+ Z6 b- N9 w if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
: ]7 p' D* r4 O; A4 g. O" U {0 o5 ~( T' K1 w7 @
Log_print0(Diags_INFO,"dpeq.\n");1 Y7 z4 [* F" s5 i$ b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, Q! i5 `) _7 l
upp_error_count++;3 L" w* Y, w! E- x1 C/ L2 E2 X
}
& O2 ~9 I @8 T. \
; H( t( v1 o; `1 G* Z+ D/ _ // make sure all interrupts are handled
3 ^1 N" ~3 W5 A0 W; o8 X% } R6 z intr_status = upp_reg_hdl->UPIER;
\6 g' i. ?' b5 a3 _ }* H$ ]5 g9 z. y) r# d
. C" g8 U5 v1 g% \
// finally: write 0 to EOI register
( a/ @! \5 j* c3 g5 r- l! z upp_reg_hdl->UPEOI = 0;
3 L8 p% F% \/ ^ V' G return ret;
/ b" d6 b1 o& ^; C c( g& ?}" [9 Q4 Y( |$ z J- |# q5 N5 `+ A7 K
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
! N! N$ I! P1 T* @; ~; c1 ^#define upp_dma_sendstartQI(x) {\
f x+ g$ p3 ^: e+ O X3 j Wait_upp_SendReadyQI(x); \# ^* J1 O! G: u' f( Y) S. W
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
, d, R; r+ I w3 Q upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
# ~$ o- h9 V8 o# Q, u2 W upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
: F- {, ]% W( m( u; S% H) Q }
/ v% ~$ p' K7 M4 E4 v. O9 R: |* R, z0 _
T- I2 r+ ]: E0 V* Y) w
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
# o" f$ _2 I6 i L( I5 Y1 H; O! Y; Q* _
+ P+ y- Z. |9 u7 `( \想知道uori错误是在什么情况下面出现的,好做出修改。
# G" K) r' p9 ?" t2 o% V/ o, I- }3 z9 N
3 H6 B( d& c- L2 g( G$ i1 `
|
|