|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?) Q; w: W1 d4 r" `2 O* b
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
# W' G6 }4 F' d3 L7 vu32 UPP_Isr()
3 s* `3 M n: n- V3 I{7 v8 l+ } X& T, m
Uint32 intr_status = upp_reg_hdl->UPIER;
$ [. W5 c! v @ upp_reg_hdl->UPIER = intr_status;//clear
) R6 a5 j* B( t// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
; P6 }9 c% i4 u! w" Q u32 ret=0;2 a8 _. L `- o M
# {. y: {$ K- P+ ?2 X0 x/ ~
// inline functions7 ~+ f- I* b6 o
while (intr_status != 0)1 H# T) g7 G L. f3 v
{
& z) N7 {( x8 k" S' a if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件& }* w d g% W0 e% m% V7 w. o; v
{4 `( S7 @/ Z7 O
// Log_print0(Diags_INFO,"eoli.\n");
2 e+ S6 }. D' B& [; M+ a, d6 z8 m4 G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
4 `+ j4 y/ m8 K( L }: ]' a* V7 d& T# Y4 z; J- Y' t
( q8 y- A& k9 t9 K& c* G/ f if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件8 Y5 l, L5 T8 K8 k* j
{7 D2 |& ^8 @+ |* J; f4 D
Log_print0(Diags_INFO,"eowi.\n");
& B/ m; b% r; t: {3 Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
7 w7 C) _1 B, g' m/ g upp_interrupt_count++;3 _6 P5 h; i/ P! i3 P; y
upp_interrupt_eowi_count++;" q, `& ?4 ]1 S% k) |" m, D9 ?
% s0 X6 A0 f/ W# w& p
#if UPP_DIR_QI==0
5 m) P! M% ?9 q upp_dma_receivestart();
1 O3 L8 T/ C6 y4 X1 D1 c ret=1;1 G" B) p3 |* N( @- x; y
#endif" Y5 _$ h' j9 K
}* D! U7 M$ r/ Z
* \3 p/ M) ?* i
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
' ^; x. _7 R* W# Q* h2 u$ p7 ]) O {& g. I# S3 h( P& c S
Log_print0(Diags_INFO,"erri.\n");: X" A" s5 l: q" g% X1 `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
6 v' u1 h. _% z/ E+ j$ t upp_error_count++;5 d& N3 f6 u, X' }% M
}. X( ~' @# b' ~) O: @, [
. V: u% I; Z, f( _ S7 ? if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件 ^: \ o% m; P/ H# a
{
+ u+ k# O0 l0 G9 J' L Log_print0(Diags_INFO,"uori.\n");$ x& G' L& K# N: y6 T0 Q# K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);9 }% k) }/ L I5 H4 |7 ?$ z
upp_error_count++;( W* W3 b2 \9 m
}5 l- ^/ G; F S. K& `. ]3 w# o' I
# I! W* |+ O( N6 ~, N
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
+ \% D7 ^$ W9 X {
/ B# a3 B$ b E4 V' s1 K Log_print0(Diags_INFO,"dpei.\n");
+ A6 j( Q6 ]- f7 Q! } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
) d% R5 Z9 B; v4 D3 t- k3 s0 w7 e upp_error_count++;
A+ ^ v8 k- p5 n1 a; E }
: r _2 l8 ~9 ]) [! r0 i2 A& Y5 v0 }) ^4 v6 O9 X0 G7 k7 B5 U% o
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)* |6 y" s! t; X9 C# M- r
{& U( D0 ]2 z h) B- R4 ]
// Log_print0(Diags_INFO,"eolq.\n");
/ ~' g. U! o: P W2 l, o" y. R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
* v0 f% U: f/ C, I" Q }
! E& Z; \6 r+ [9 `3 g% _9 X' ?
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)9 p7 w% L6 e, r% }
{
( X( x( w. l2 Z: U+ b* s// Log_print0(Diags_INFO,"eowq.\n");6 V# N2 V8 K. W) q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
- j" U1 c3 N1 D6 {" U w4 s upp_interrupt_count++;
) D: n3 b+ ]2 n/ i4 L#if UPP_DIR_QI==1
5 m& p5 ^; u! z; N, G" ] upp_dma_receivestart();& T% L& ^* C* u5 O1 @- X* h
ret=1;
! v0 b$ c4 {1 c. B/ ?$ q" f#endif
: W" D! a7 p& m1 b }
+ P* T! M$ [4 U
" @9 X6 A# z' d7 J) E' V8 F0 t if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)& a- l5 }* P1 p0 i: Z; r
{) _ `! R1 ?1 p A: S2 C0 _$ P
Log_print0(Diags_INFO,"errq.\n");& X* Z Y: y, X3 I+ G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
2 ~7 o8 _+ Y" @) K/ f2 x7 Y upp_error_count++; M: h1 f% x& ]5 y5 Q
}
) _8 e* |& S1 ]# t. \
9 w c( [5 }7 m) X' [6 d if (intr_status & CSL_UPP_UPISR_UORQ_MASK), G/ z" h3 |8 N' y6 M$ c5 m6 Z
{
% E0 \: }# E& Q6 p Log_print0(Diags_INFO,"uorq.\n");1 X, C) @5 Q( T- ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);1 i7 Y9 i( a6 ~) T) n! [* d' N9 V
upp_error_count++;
9 \0 q8 {. n" N }3 J D! e; f" S( ]0 ]
4 D# c t/ n f
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)% T# d5 F( v( ]) u- w- [3 j
{
1 O' t6 @. S3 O# k. ` Log_print0(Diags_INFO,"dpeq.\n");: s% w. J0 u" z4 [0 A1 H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK); K$ y4 E& }( p9 u9 W
upp_error_count++;
# z+ K$ T1 D) x! M/ P( r$ M* ? }
. X' M+ ~. V' W
4 x5 n0 I! W% V // make sure all interrupts are handled$ B9 x" K6 L9 t4 E- j
intr_status = upp_reg_hdl->UPIER;
+ e V+ B9 O1 D+ q }
! K6 n9 p6 B/ g7 a+ F+ ^
; V3 G4 f# B, x# p, o8 P. t // finally: write 0 to EOI register
$ y( N0 Q( }# `( V) P upp_reg_hdl->UPEOI = 0;8 S: B+ _( `4 z$ Y p
return ret;
. M. W1 _% |0 L& u1 J}
# l8 _( u4 r9 L4 Ydsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
h9 l; U; ]( c! w* X#define upp_dma_sendstartQI(x) {\1 j* k5 [1 Y8 D2 V1 c) `2 x
Wait_upp_SendReadyQI(x); \
, i, d' L8 |8 u5 X& c0 g upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \' h4 w1 H$ T% n0 B% t0 {. g+ `0 Q
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
1 V: E3 Z/ k5 Z* k9 { upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\% J9 o/ L$ O3 U6 e" a; ?
}
" J" ^% i! B. X0 \ x2 F+ Q% i5 S7 s3 f" `( N h
1 ~! C0 e/ v6 A6 {6 t) \
#define upp_dma_sendstart() upp_dma_sendstartQI(I)3 ]. ], ~' A9 Y
; \, N2 F3 y. `/ {6 C& b( A/ c" R* A! J K& U
想知道uori错误是在什么情况下面出现的,好做出修改。
/ W, I& k& ?9 K- K: A$ f
4 G) a: D' Q5 O: F, _6 H" A
+ J3 ~& }" ^! L h; k! y, s) u |
|