|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?. h% g3 ^ p! b- |+ H: @
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:8 }0 \: `5 k1 K" p* I
u32 UPP_Isr()
; a5 I# d" n* z7 D3 w$ {' ]{
+ O* X2 o& K# j$ d1 Y, q" J3 e+ x Uint32 intr_status = upp_reg_hdl->UPIER;
- H9 O# h& c* m% D upp_reg_hdl->UPIER = intr_status;//clear
- d* w7 }8 C( Q# ^- O h/ d// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
# k3 q3 P+ C; I( n' x# W u32 ret=0;0 t+ d7 V- w* b4 b+ }
1 ]5 ~. i8 y& P // inline functions
/ c# p& I# |' ^# ]0 _ while (intr_status != 0)$ H$ [5 J6 A& { O/ ^! W' F
{
9 \! q: [* Y) A5 T6 r if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件- ]& L9 H! b5 P5 c3 I
{
6 b" L. H9 W' n// Log_print0(Diags_INFO,"eoli.\n");' @4 {5 J$ }% }, k' h% N: I7 P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
* y" {* r0 _6 Z7 E) S }6 ^* S: O4 [! ]9 s
1 z, s. c5 n" _8 y
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
+ z+ o5 X1 G7 j! k6 _4 Q {
4 P3 `/ e- |+ E9 N Log_print0(Diags_INFO,"eowi.\n");
, @2 T* u, K* u5 v5 z- }: p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK); b) G' Q2 D* s
upp_interrupt_count++;
5 ~$ {+ s m- d upp_interrupt_eowi_count++;
! p0 F5 M, l: Q( T
" I4 U; y: U- M$ n+ g3 o#if UPP_DIR_QI==0
3 E& G: [4 {# {6 }( f& i upp_dma_receivestart();! i) y4 v6 [3 Q1 o# }0 M
ret=1;) T3 h8 }" S5 d2 J g, o
#endif% o0 \, k8 V- {
}
2 M$ X) _# s1 k5 }* e3 A; J& G' k7 d% d5 Z3 {
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件2 ^( D8 ]4 _& ~& ?( k6 n
{% d3 D S1 J+ i
Log_print0(Diags_INFO,"erri.\n");
z* L$ i2 T* H8 o# ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);9 [9 v* d" Q* o& H- f7 D
upp_error_count++;2 ~4 [* O3 Z8 D: p7 r
}% i# D- }1 e7 w9 j- j! }( j: J' I. r& E
# }5 g! S$ Z+ N+ C8 w7 A* w: r if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件5 h' U' l o3 H/ J3 L
{2 x8 U+ e- R _5 ], W) p- _
Log_print0(Diags_INFO,"uori.\n");( A' a7 c3 s% R% I: d0 k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
' z: D. x2 a. ]1 A g upp_error_count++;
5 p% X; f6 J2 ^/ K }( q0 Q9 k1 a7 f8 H# N
, y* ^! P. K6 _. U, V5 Z- v
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
1 t1 ]! O. Z; v0 u5 Y3 f {* y d: O9 i5 b
Log_print0(Diags_INFO,"dpei.\n");9 p" }9 T% z6 q( [- E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
1 ]; E/ U7 w2 N, M upp_error_count++;
$ N& z# i; m4 F& t L8 [+ K+ ] }
( D5 \+ z* v) `* k% a
: Q- ?9 V+ h" K if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
1 _7 a3 `. H4 z& P7 q+ U5 X, N- |. L {
# \5 a6 F, D+ t! |// Log_print0(Diags_INFO,"eolq.\n");" b+ V1 b) M n6 S# X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);& y6 @# L; Z$ U0 W: @: t" W
} ~* i5 T+ Y' M8 H8 c0 X
+ r. X( I4 J% A( J; r- w" L ` if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)/ Z$ d L" |& ?! `
{, z4 ]4 \0 J2 F x
// Log_print0(Diags_INFO,"eowq.\n");8 T7 g5 \$ o' s$ ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);, Z2 I+ l8 o Q9 Z+ d& h- H8 a$ V
upp_interrupt_count++;6 U- [$ ?' a7 ^
#if UPP_DIR_QI==1! z' c, H' Z( h$ w3 H
upp_dma_receivestart();$ g2 r$ s. b. R9 e; P0 }# k
ret=1;. y) e2 `6 t8 U
#endif; _: n g8 w. y9 n
}4 V$ p, b# J- z4 k
* y) U: f2 [4 R# O* ~ if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
P- N" d% [* m3 B2 Q) a: V1 D {
+ B( c' ~) F, E: V9 m/ A Log_print0(Diags_INFO,"errq.\n");
- a4 e- L! N& [8 j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);* [3 E6 Z9 P: J
upp_error_count++;
3 q# b9 h& P6 D R }
# g" B9 p' O9 {6 U) A+ n4 \2 e2 l$ ]& h1 W5 v7 \! @
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
4 ^6 B" }$ Y8 H6 n( s9 [ { Z/ n! d+ Z, o' L6 m5 | m
Log_print0(Diags_INFO,"uorq.\n");
2 L( S$ P p! \" ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
' ?' j0 G. O1 j. ~9 U& x! N0 s upp_error_count++;
& j8 k8 \4 U& ]( f6 O# O }
! N9 }. A$ W: o \2 z* a# H' E/ t
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)' n' J* o/ H0 k8 I
{
6 L ^1 |- i1 B; @+ a0 S$ o Log_print0(Diags_INFO,"dpeq.\n");$ s& b1 L5 ]' B$ y, ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
# k! {8 [# J8 j6 A b# g1 J upp_error_count++;' v: Y; b" t7 X. M1 k
}% e* V+ H. ?2 T3 f) ? x5 x
7 G! b. @& Z; J7 y2 ?6 f
// make sure all interrupts are handled" X9 j- T/ V( y
intr_status = upp_reg_hdl->UPIER;8 \: X5 ?: }8 X
}
2 @8 A2 m$ z, Q5 I: a! y. l! {( ?, L; H! N2 H: r
// finally: write 0 to EOI register
$ v5 i3 x) i1 ]7 s9 s upp_reg_hdl->UPEOI = 0;) K v; k4 S( N) e P3 N
return ret;' T1 W1 W& d7 a6 D5 o c+ D4 ? Y
}" s3 V0 @3 g# O
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
3 K y* c) o7 I6 N$ [#define upp_dma_sendstartQI(x) {\
9 t& ?2 Z. M4 G! B3 k* w: L Wait_upp_SendReadyQI(x); \
1 @; [1 O0 B' p5 M# v upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \8 P; h% F5 R6 @
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
9 Q/ W' ]3 B( J7 W7 V upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
2 r( i# c* \5 h+ B' @; V: R }
3 H( w6 i; G; }. X( T$ x/ o9 N( g; z. u5 n" v! o; B, M9 D8 `- C
7 z: w3 p0 j! ~' J" B3 K4 l#define upp_dma_sendstart() upp_dma_sendstartQI(I)
9 q5 D t8 p# \4 X+ v1 L1 I1 s& Z3 S% r0 {' X; [
( ~- E: j6 ^. I+ O想知道uori错误是在什么情况下面出现的,好做出修改。
2 Y; U: K7 z: o$ p3 M3 w5 x
3 n6 b3 K1 n0 x1 _6 Y2 k) ~( k" I4 z: i2 o4 i( f5 c; ~- I9 \9 L
|
|