|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
- Y o; V6 F. E3 ydsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:- Z: }/ Q4 P+ w0 h* b" N
u32 UPP_Isr()
8 ?( r) j' v; r8 r5 F V8 l$ ]{$ R; k. G4 `! J9 C0 R4 T( v* r( G5 r
Uint32 intr_status = upp_reg_hdl->UPIER;6 k3 ]8 K Q; d. O/ g
upp_reg_hdl->UPIER = intr_status;//clear
' z7 k# }7 `4 e* d3 ?2 b) n' D// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");+ g$ t% B) a) e; W
u32 ret=0;' J. C9 v% E/ G# {
/ G, f: z7 c) h
// inline functions
0 I; R+ J s7 o: L while (intr_status != 0)$ P$ j1 Z4 [+ x0 N9 [, e; ^
{% c* G1 h' R5 e0 a- M$ q9 L
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
s, Q+ x. B+ {, g, N7 n& j. { {
* B* s( O9 k/ y% }5 C// Log_print0(Diags_INFO,"eoli.\n");
' G+ E$ J) {: o* w% M5 a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);" \: M$ w% v* Q6 r. o, {
}
: I4 o. x9 x* c) V2 V3 T
/ P' u3 P/ A" Q$ U+ q7 ` if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
3 C2 U$ V9 B2 N3 k a% ` {
& }2 b0 X+ v6 J# d+ Q, u9 A4 u, K Log_print0(Diags_INFO,"eowi.\n");
* Q' S, k9 L: x$ e, Q( I7 @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
. h& Q0 S$ M) b+ L, q upp_interrupt_count++;! G$ i, X/ H4 ?$ J2 O' W) S
upp_interrupt_eowi_count++;7 |! W' i+ v7 {, c7 Q5 N
! s* N; [. F) Q6 G4 a
#if UPP_DIR_QI==0( r ^ N @$ Y6 d. `$ B
upp_dma_receivestart();' v+ k k5 G! O6 E; o/ Z% K
ret=1;
; K! K- m% s& K#endif# E4 K {! {+ N! I: `, r) K+ W
}
- S* ~/ w# w) v- ^, f, C
' Y) B p- g; ]4 b8 v if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件$ j7 _% J" x: j. n$ i
{
2 @' L7 f! w+ ~/ C Log_print0(Diags_INFO,"erri.\n");
8 D" f4 _6 U7 I4 S- Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);6 m, }( R+ z6 s7 Y& K, {1 h X, L
upp_error_count++;
( X. {) B1 s: L/ {2 m2 n$ U! h8 D }4 {* c2 U! O( \ w
! b; J- P8 \* T
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
' H T1 ~: A' r* b$ i. b( F {! P7 o5 D; ^2 O7 ^
Log_print0(Diags_INFO,"uori.\n");& L' E3 C7 M4 ]& v f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
1 f4 r8 ~* ^( x. h9 U upp_error_count++;0 I+ p S" v/ l& M) _
}
1 X- c/ \7 \( `$ d, T* F) c3 u; s# [! W9 h
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件' }* T& g0 [) [& H: ~
{ Y8 F3 b% e; Z. _4 Z
Log_print0(Diags_INFO,"dpei.\n");
. J0 X& s9 y/ H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);7 f7 _9 [7 R( c% h5 ~: ~) f5 ]
upp_error_count++;
6 y; A5 r/ Y9 e# S) D0 B2 x2 Q }- J* J6 T9 w) q, H" n0 u
. K$ {7 B' f0 t7 z' c( P
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK) {, N \3 N0 |5 O$ A; X1 F2 N% s
{
6 U! G i* ]5 p6 o" `" i// Log_print0(Diags_INFO,"eolq.\n");/ }" w9 s$ L. B; M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);( o9 m# @( S. z. ]
}
- R; G6 x X* Z6 b3 f8 d
- u" ^' M8 a7 M4 s* z if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)0 ~; z# u& X( W* h3 u& B
{8 H) H, P' r' @
// Log_print0(Diags_INFO,"eowq.\n");
. F* m M. W8 I$ H* `/ w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
4 y. ]' T8 F+ P7 ~' D upp_interrupt_count++;
* F& f- ^7 k; U' x#if UPP_DIR_QI==1" t; U/ W( A* v" d: f
upp_dma_receivestart();; v" u& U) r! u0 Z4 [
ret=1;
7 R3 q; Y* _4 i* u. a1 {#endif- _5 L D) Q; f
}
- r, B$ M3 y* N. V7 d( S& @4 R
0 N8 Y( T0 A: Q5 K if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
/ r" u9 g6 @4 H3 |$ R/ W" c { Q+ n& ~( F# c* d2 d1 d- g3 @
Log_print0(Diags_INFO,"errq.\n");1 M O/ [# ]1 n# V* b+ j2 C, s- ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);. f% @; x7 e, ~; P! B8 t# z& [+ {
upp_error_count++;* I' M2 t: @/ N# K2 c6 e
}- h( e- C/ B8 @# T2 f" q0 B$ J4 o
: \% l7 [! `4 w+ v
if (intr_status & CSL_UPP_UPISR_UORQ_MASK); l9 g7 t: i9 p& x! ?
{
4 b5 K4 S. I2 g" R, X$ x6 H Log_print0(Diags_INFO,"uorq.\n");
& T0 p* I) o7 O, Q6 T! ?' l upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);; _3 T: A' [9 d
upp_error_count++;
! c! L( \9 R! h# ?2 v& c }9 L/ T k: O" R
/ M% k' x; p( d8 i4 l- d
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)3 j8 w' z$ }) ?
{
. ` Q% v! c6 K" c1 x1 c$ G l Log_print0(Diags_INFO,"dpeq.\n");
& Q* ~! ` ]4 z5 i6 i- S5 S9 N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);6 K( w% o- f* N, c0 p% k0 U
upp_error_count++;# {% [7 p, o- L {/ Z$ @
}
6 _# C3 t1 I4 s. a
! F' j: a, r/ J- D- w, w // make sure all interrupts are handled
/ L9 g9 k7 N7 w intr_status = upp_reg_hdl->UPIER;
% ^% `3 T5 K+ {( N+ i' n9 P }
. k/ `$ m( o0 G( k- P- M
: f, ~* z3 j1 z+ x, Q // finally: write 0 to EOI register
, H) b! h& t+ a# C upp_reg_hdl->UPEOI = 0;. d& r* B$ F4 C8 N2 Y: E1 t
return ret;
9 c) b! P5 Q3 u4 R; n" e- H}( R% j A( @2 K1 _1 u! y, ^ s% F
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
, H' f1 A* ^" B9 u3 \#define upp_dma_sendstartQI(x) {\
, c/ D- s0 e1 ?' L( G" w* F2 X Wait_upp_SendReadyQI(x); \; X' ~2 s; G7 f
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
$ s6 G6 C+ o6 a" z' n+ b! [ upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \) ], i. U. S+ d
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
+ R1 B2 T$ J+ _ }
! R: w# B! O. N, v& ~% L! x
8 J0 f$ J3 a# F" W0 _# Y' ^7 ?% @& o' u! Y& p0 l. K& }7 y/ ?+ b! E) ]
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
2 ?2 D8 C5 c }+ H
# k7 F! I o4 F" |4 D, {9 \* Z3 L
9 q( ^$ z8 q' M- t5 \3 [想知道uori错误是在什么情况下面出现的,好做出修改。
6 J2 {& U" R# H' i$ R/ K8 _. n% ~; l" ~
9 p, }$ D+ H. p+ w- M5 o+ g4 F( L |
|