|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
6 }* G) H/ h P" j- B' udsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:3 h* e: i; _4 ]
u32 UPP_Isr()% ~' C" g8 m! \( a& I
{
3 A" E }* J, @( j& n Uint32 intr_status = upp_reg_hdl->UPIER;6 W1 {- q% }. z2 }+ q1 p/ ?6 P: ^3 q
upp_reg_hdl->UPIER = intr_status;//clear7 w# |0 H9 J) E+ S! }4 X
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
. `. z1 \5 N3 W# r! m- y! u u32 ret=0;
; C0 ?; c/ f0 M8 j; V$ X4 ]4 t
6 r; }* R \' \$ B- ~ // inline functions8 `' ^2 D( W/ ?
while (intr_status != 0)
2 I& E- O' t6 ~! Q {: E2 y4 m6 }8 O) y+ U
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件8 x% M4 z5 s) W3 R& y
{
) R. J& B: }2 f1 l// Log_print0(Diags_INFO,"eoli.\n");" |6 ~) `: f" ~" X( [, m- G- Y6 B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
, U! U# a& p6 m }0 Z" }) a* J( }7 t/ A# h- @1 r
2 z9 W* [0 m' d/ O+ \7 ]; _ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
9 y6 v% ]+ V; C6 S. Z. f {
" C0 B* g% Y+ B1 @% R2 c4 s! K Log_print0(Diags_INFO,"eowi.\n");
' v9 w- a( e2 z8 |: ~! B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
% J$ U- }4 x! f0 V) i upp_interrupt_count++;1 O3 u. Z4 w& P6 {; n# Y
upp_interrupt_eowi_count++;; d: u! }, y& ]; d2 h K
5 E7 |8 W6 t7 g3 V. I8 X' u- v4 ^#if UPP_DIR_QI==0( l; s+ M& e% N6 ?, k
upp_dma_receivestart();$ D1 F9 A/ J, v* ?
ret=1;
/ @9 O# E; C. O3 `5 W# J4 z' v#endif8 x4 c, q6 |7 g$ k! f' k( x1 R0 H
}8 ` B" K, g: _& G6 p* I9 Q7 ~: L
' d* I. u. ^; X B, Z* J if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件8 t$ K! d* V* }/ n1 [
{
6 P/ Z. f3 M* ~) A3 g3 R* L Log_print0(Diags_INFO,"erri.\n");" ?) R( J# C$ P3 d3 G4 N% X7 ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
, D" ^& k* H2 ^' y upp_error_count++;
" b! H, o: ?* D0 |# |! w6 _. Z }
4 _, x3 y6 Y! g( W) `8 E. t4 c( d+ L' d; D1 |0 h/ w6 N
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件, L: H. k- j( g6 `
{( u9 p& X, [) |1 Q; a* M: [/ m
Log_print0(Diags_INFO,"uori.\n");
1 g( V! K n A% @ `7 Z' ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);2 s/ F1 j6 H O6 G, M/ M' l
upp_error_count++;
& M- H3 P2 Z, y2 j" j }
) w% T. v- m: G3 U' ?9 ^1 r* H' u
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
) X t" G3 R( C {
. W% E# J& I& {7 m* l9 G Log_print0(Diags_INFO,"dpei.\n");* F+ M- y2 j/ j* K9 }" @ F, W3 o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
: @2 N0 K( j' N) y7 {/ `7 j upp_error_count++;# c( H* L5 _2 s; L" C) }% M& \
}; w' ]( }" a' O" x; V# b1 c6 s
- t" g9 [. m3 u- u% M; g- m* `2 Y if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)+ ?0 I/ Q' l2 c: _, R* X/ N3 n0 J
{( s1 J% g K% J- @: s/ L( ?
// Log_print0(Diags_INFO,"eolq.\n");
4 F" m% u8 f$ E5 Y7 M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
7 S) g, W& z8 e! @ }) o- ^* @) L1 T3 t
( C7 W( x: Z }- } if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)8 e/ V) E/ v/ C; N3 p: ~) s4 G1 U8 ]
{
' J+ x, @3 Q. r9 n2 y// Log_print0(Diags_INFO,"eowq.\n");
6 ]- p$ b& _7 S5 `- ?4 {% [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);- O4 Z6 ~) u$ t1 y2 w. g
upp_interrupt_count++;$ C6 M& y" K. `! K& l: B4 o
#if UPP_DIR_QI==1
2 q* }- z! _! U/ l upp_dma_receivestart();" B6 D! d3 }" T' J ?
ret=1;; p/ d) I! A; K9 n
#endif
1 }4 m- ~: l4 x/ M }& S' i& g8 Q8 P# _; g6 X, |. I4 E
0 P4 c) |. @/ l U) H
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
7 s% C/ P) ^' l* _# x {
9 Y/ Y6 o* y3 P% a; n9 ~ Log_print0(Diags_INFO,"errq.\n");
% r, S- w) A' K1 X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);# Z6 ?: }/ l9 T( O7 E
upp_error_count++;
4 S- q2 g( d1 y }
_4 Z8 ~4 Z# i) c5 o( L8 u+ U9 C( V
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)' W, K) O! B% m0 U! Q6 ^
{ u6 E F* z Y1 Z$ {% c. [* W! b( k
Log_print0(Diags_INFO,"uorq.\n");
% D+ ?7 c9 c% t! ], A' J- _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
: \/ G9 `, r9 Q9 x, w# L upp_error_count++;
+ ?! A; c1 A; a. z9 Y }
" l% G$ N2 V+ L9 B& N8 g
' B) y; K8 H$ c( U2 S2 R if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)0 O9 ^) E5 _; n! R& j
{
8 h5 }$ ~' y5 c. e9 N Log_print0(Diags_INFO,"dpeq.\n");3 H8 i L) _5 O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
+ |; a+ K6 Z) k( h0 [ upp_error_count++;
$ i: ]0 x; d( U8 Y% ]9 B }
7 ^1 o# }' R& G+ D0 {, h0 k! c# F9 @9 ?8 h' y# Q
// make sure all interrupts are handled7 }& z3 f0 h6 [
intr_status = upp_reg_hdl->UPIER;
; Q# _$ x! o2 V }' z8 m) {4 P @5 _" @
8 _; [" m: q6 s0 ~
// finally: write 0 to EOI register; a1 G- E: q) @- Y
upp_reg_hdl->UPEOI = 0;9 Q7 [ R: q" {# F& h
return ret;
& ^$ \/ J9 Y1 O* l: C, ]* w k}- }1 X0 B( @- ^8 k
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
/ D- f( ]+ K& Q. I#define upp_dma_sendstartQI(x) {\+ B" ~& T5 m1 h4 k$ {
Wait_upp_SendReadyQI(x); \
& V! D, N5 D J upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 t% P1 ]' k7 T) G9 V upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
' k2 {7 u; d1 o upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\) Q0 m! W- \4 m$ d8 p
}" S2 M7 B3 ^& E7 e
' |+ I" T% `8 u) h$ Q9 j
0 p4 q6 ?" J. |% n3 x6 c4 V- `#define upp_dma_sendstart() upp_dma_sendstartQI(I)
+ V, y1 M% }4 H% h$ k+ ]
8 ?3 a( S0 A) [5 \+ I8 z
" S( C7 m# h2 F B8 q$ |想知道uori错误是在什么情况下面出现的,好做出修改。
& s3 X d1 ~0 O) d: A% ]/ C- m. f5 w! Y D# W. K/ p& A
9 ?3 e" `8 u2 [8 c9 b! g$ V
|
|