|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?( d8 T* H; M, B% M; O3 c Z, \4 K
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
0 {" T1 d# D1 `7 hu32 UPP_Isr()
8 M% d' W" N9 T- i{6 \- Q( C L2 T. v9 c: w) M/ i- m8 C8 Q
Uint32 intr_status = upp_reg_hdl->UPIER;) n1 l7 l0 \- ?4 V
upp_reg_hdl->UPIER = intr_status;//clear1 V. e+ o8 M2 ~ R+ @
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");( A; D% ?" B A
u32 ret=0;
4 _5 U# u4 e& }
$ O- w9 X3 j* w' D3 e S$ a // inline functions8 J' a3 | ~8 M5 c7 T
while (intr_status != 0)/ n l* [. K. {
{; ]# R* Q* z( G& |: C
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件4 M/ Z2 k+ }# c
{; h9 W* i/ {$ U: i
// Log_print0(Diags_INFO,"eoli.\n");6 G/ q G" i8 R" j+ j, z! v: W d- o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
+ v' L9 f, i0 ^9 N0 @2 \, k }' c& T; U; E3 {# D
. \% d" f3 ?+ j1 F Z3 s+ o( E% z$ [ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
9 |% w0 y; d5 \- t1 N1 K: n2 T$ D3 [ { B a6 J3 F) f
Log_print0(Diags_INFO,"eowi.\n");/ l2 L3 b4 }) z% b" w5 y& k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);8 R+ l; @; d8 y8 Z
upp_interrupt_count++;
/ N! Y; g; h8 c' D6 Q+ E( M upp_interrupt_eowi_count++;* t5 K; o: t5 X
0 p3 @5 m0 P) Y; z ^' ]
#if UPP_DIR_QI==0' v k8 [: i4 L# s8 H" t% S
upp_dma_receivestart();
2 Z* e, g% k2 v( S# p5 q ret=1;
' B7 a/ G h( o$ X: X8 X# Z#endif
; T2 E& e5 y6 E }% Y8 @/ m4 T$ k# V- i
+ A5 c% w( Y) ]$ W0 I! h( k4 N: z if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件- E9 n" r% k0 R6 h2 i6 N O. G
{: R9 l) a& w0 I& [& }+ a2 J
Log_print0(Diags_INFO,"erri.\n");, z1 y" ?3 v) Y, n$ {' L$ `" g- f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
. x) W% U: ^( S# @5 g4 r+ Q upp_error_count++;/ S9 s4 l6 q2 U, i" ?- w! E
}/ ~1 k) H0 ?5 H+ l" Q3 K
' Z u! U' J/ O4 B. |
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
, K! F# J$ t( R; ?- c8 Z {( N, Q9 P* L) v& ~ \
Log_print0(Diags_INFO,"uori.\n");
/ u4 y/ r' }" ~) b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
& g+ Y: r( L" E! C upp_error_count++;5 O% V9 M; v M+ F" T. G
}
9 S; |0 _$ X9 B- Z6 C `5 T Q U0 u E9 g3 \
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
' I! O" Z8 ]( \$ t0 `2 D {0 u, x% N; o5 |1 }! Z5 F
Log_print0(Diags_INFO,"dpei.\n");
4 g3 L1 D7 M& F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);7 s5 `( _7 {$ t
upp_error_count++;1 d9 \+ ~% H/ L# U' U
}
& p3 t2 e; D \8 t5 J
3 w0 j8 e$ T3 |$ ]) P- t9 v. b if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
: [2 _, `' J' E7 s {
, q$ S9 F; j$ Z// Log_print0(Diags_INFO,"eolq.\n");- l/ [8 [# J" I# h
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);$ V8 S% J7 O, j4 h7 T' O) {
}
; @: F: j/ j/ l9 f) |0 Z8 P3 H- _
& H7 v) f, N6 Q1 S, H3 v) z if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)3 @: h6 F2 f/ ^3 J3 b) ~' h
{5 W2 C: [$ s* H* p) E4 S
// Log_print0(Diags_INFO,"eowq.\n");
% s% S) e: Q, ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);# g7 r/ _6 p$ \+ \. U8 C) E* R) n
upp_interrupt_count++;. N/ J4 h) _) E$ a3 S7 Q% h- Q8 o
#if UPP_DIR_QI==1
1 b( i: d2 f9 E9 c& X upp_dma_receivestart();
" y# x, G4 F: k) g& Z4 f ret=1;
- t8 C: Q0 d7 l7 x: v2 q1 G9 n, L#endif; x* ^& L& _& w$ V% q
}
1 Z5 W/ `8 L4 T' \
% q; j" a7 ~1 @/ x* r; T) _; y1 D& L if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
& O3 X% j; h7 o1 d3 P {
9 K: o' E i3 y$ ^ M( W# {. ] Log_print0(Diags_INFO,"errq.\n"); Z( }& F2 v' S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
( B* L; r5 Z, i9 T/ o9 F5 a upp_error_count++;* h* R' Y* X/ S
}
9 z( w( e6 L) m* t2 R6 T& K3 m+ U6 V& W1 }
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
) e5 {) I' y5 n3 e {
( r( `- m5 X: w7 m Log_print0(Diags_INFO,"uorq.\n");
8 L1 o2 |0 P" K5 B& b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);5 g H3 I% `+ w
upp_error_count++;
8 ^6 p Y1 @- } }
5 W; w+ V3 h6 W: q3 A5 k5 V* P7 N# i
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
/ ~( b7 B: d: p3 [ {2 W1 d9 c# o* e# {
Log_print0(Diags_INFO,"dpeq.\n");0 x O2 ~$ n3 m7 r [4 v6 x
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);0 _" y$ N, Q1 l) [9 I. `" l B( j
upp_error_count++;
* s# h2 a+ E% B* \! ` }0 X: t* x$ t& q6 M2 k
! z6 g/ P+ m; L7 N* z
// make sure all interrupts are handled
! B2 M) d; S7 J' D% y* J- [+ g4 o intr_status = upp_reg_hdl->UPIER;5 T; [! D" P0 A% i$ @
}# d/ {" K/ o( V2 ~- |1 t
" @ G% X8 n* r5 y$ [1 t // finally: write 0 to EOI register
& u* q+ Y2 z8 G6 x& W4 s upp_reg_hdl->UPEOI = 0;# R# X$ }: q( t; O1 d" N6 a
return ret;
4 [) Q# @5 _/ e& N& h( M: Y3 Q}
0 ~& B& l$ W' Kdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):# ^# F. J3 V0 T# q6 Z8 [2 z
#define upp_dma_sendstartQI(x) {\
7 y5 `# T3 E& V$ A/ A8 h Wait_upp_SendReadyQI(x); \
0 b6 a P. h# M upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \4 L& ~7 G- j+ w
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
. O- o7 t) s8 `; X/ W: r upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
; O& i. C9 z8 z) M }
2 W5 w$ }8 K0 w8 A6 _; i; e) z
: C* |# a3 _. t5 y' I/ l# [( ^5 q) D+ s* [2 @" x, l
#define upp_dma_sendstart() upp_dma_sendstartQI(I)/ {& C* B" K/ S5 A0 a
8 x0 I7 k' ~( ^; J9 I
3 M4 {& w) E1 M6 j$ `0 c G- M想知道uori错误是在什么情况下面出现的,好做出修改。7 n5 Y5 v: ]) C! B+ ^
3 i4 {1 J9 d8 ^" ]: R5 L
) G* ^5 M, w) U0 O. z9 ?6 T2 G
|
|