|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
) o! f: Z5 T$ w$ Edsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
. K7 B B: v% H$ ^' s& \6 H+ `u32 UPP_Isr()
+ p" d5 O% ?% X2 d5 p{
$ ^0 G; ]2 m9 C5 ]' \ Uint32 intr_status = upp_reg_hdl->UPIER;8 ~" N4 F5 L* i% w) v2 l: N9 t
upp_reg_hdl->UPIER = intr_status;//clear
6 ~! X# _+ B3 I$ ~: }# N/ b// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");7 I7 P- H: ^* Y, m# E2 l K
u32 ret=0;# {( w+ e( T! S: ~# p
, k" R) y, b' D' t; D
// inline functions
: |3 Q W, q: W% X1 c' q while (intr_status != 0)
8 \1 D5 Q+ ^7 c* E {. F4 {0 L& T8 E0 A# V( c) `& t
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
& M" i; e* X2 n1 B0 ^% m {9 K6 i8 j* b% m
// Log_print0(Diags_INFO,"eoli.\n");) a" |( h+ u$ S1 p; X( m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);' V% f; [7 x+ u1 a
}# ~& H9 J% L( U4 \* l' t
2 X: O4 l" B$ h) G6 u: w if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件' |, w3 y7 @0 \# c2 u# H' I4 F" ^
{
, h' k. N2 B- O2 G# _ Log_print0(Diags_INFO,"eowi.\n");* s! I! `( _4 a! d; r- L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
' t# J7 Q* a: G& H' y, ? upp_interrupt_count++;7 ^& T' B3 P4 f
upp_interrupt_eowi_count++;
, l7 E; g- q; k
5 o- K1 B+ X4 |* Y#if UPP_DIR_QI==0
4 g( I& X. K$ x upp_dma_receivestart();
2 H9 a* u9 n, C8 M' X% S ret=1;, a# t) t# l6 x
#endif5 {# h. R. y: D2 Y
}' k0 V+ z1 G' r) h& N
% F+ y D2 f- U- K' k if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
# D; [. G) H% h% U* R. n; p$ J2 _ {3 m U& B q* i
Log_print0(Diags_INFO,"erri.\n");6 |$ l) ^* I9 x) @* [7 u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
$ S# k( c$ J5 v; g) ?/ [- e upp_error_count++;3 }5 Q' [7 b8 O
}
$ W. l2 b& b; }$ f; z- W
8 u: z' @+ h) N: t if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
; }, z2 c( i! Y3 B' P& A$ T6 b {/ b( ^9 K- Y# X0 n0 w
Log_print0(Diags_INFO,"uori.\n");: _0 A2 F$ y1 R/ C, p6 v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);$ X8 r. {8 r; ~0 N' H
upp_error_count++;
1 e& K% W1 ?, t' w8 |. V* Q* `# T }: }9 [8 k A6 p5 j, C
- B6 f0 j& s1 @0 A) S* A% |9 N% o if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件) y, }; \! K5 M5 R! C( i
{8 T+ I+ ~( o4 N; `8 Q7 ^" q7 D
Log_print0(Diags_INFO,"dpei.\n");
- [7 T* Z5 n0 b5 c$ m5 ~8 |6 n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);7 u+ C+ r5 h/ R* R
upp_error_count++;
8 H: u+ ?4 S+ ~ }
2 b. O8 \/ e9 N4 J4 _
$ V+ G$ \: a- [; h if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
x) }; s Z$ b7 ]* s {: ~" B7 B |6 J
// Log_print0(Diags_INFO,"eolq.\n");
/ p. o! g+ Y5 p7 H4 [1 } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
9 m* j1 a z- P9 |# s# ?+ x: I$ p0 v }
* M! T* B* p# B' u8 |* T; A% k0 s- Q0 m* M
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
+ u9 J* `! y) d9 {+ @, k {/ s$ }- E6 C- b( U/ ~, a: |
// Log_print0(Diags_INFO,"eowq.\n");
* a6 }. K4 r, v' J' }: H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
( \* R4 h2 }1 W+ R upp_interrupt_count++;8 d2 z0 ? C$ r% F
#if UPP_DIR_QI==15 C, R5 F3 H. r3 [
upp_dma_receivestart();
. q9 S3 {9 ~1 \5 }8 ~& D. [ ret=1;$ `9 m$ e8 Q# y4 c1 M9 x
#endif2 M0 \; s W1 s# k; {
}
2 E" }; W, D6 }* O' N; v V
2 i( `& i c+ |0 w8 h- Q4 P if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)# Y ~4 [; d7 Z" |1 g3 L
{8 n1 L+ y; g. X$ m" Q
Log_print0(Diags_INFO,"errq.\n");, J4 V! C$ c0 A2 H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);7 O% w/ r: Y7 ?: s$ d; x; i
upp_error_count++;. {" W+ B% t z( N1 V
}% C6 M. F) g/ p# R* |" c
! I! U4 l* s3 X1 D: X; S+ w if (intr_status & CSL_UPP_UPISR_UORQ_MASK)0 l. E6 L6 Y. U3 G2 J5 [
{4 _7 i2 k- J/ i0 u. w
Log_print0(Diags_INFO,"uorq.\n");( z1 N: \7 x) N, c. z9 N7 \/ d7 @8 Z, G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);- u4 U& ]+ L) s! U4 i4 h
upp_error_count++;3 ^- ^( Y; i# R* J" g
} `3 k. \7 ]4 G( `* x @0 B5 \1 E7 }
- f: E% M2 g* q" O if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
5 K' h# c/ t7 t5 L0 [* }/ t# U {
- J, S2 |5 h, ~4 C* g: R Log_print0(Diags_INFO,"dpeq.\n");
; P9 o8 o5 ?$ j2 I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
% Z; ?* C7 x: o3 x upp_error_count++;
! C, X7 R- L5 x2 {8 b# Y }
" o' [, K; l' y; _: S' T. C9 C; ?9 Z1 r3 M0 B6 ^7 _% B
// make sure all interrupts are handled
) ]. L( J# H0 N6 }' d; R8 ^ intr_status = upp_reg_hdl->UPIER;# Q( b9 s& b: v% f+ [
}
" O- B X! P l0 R I. {5 Q; v
" v9 ~+ ?, }/ ^& n // finally: write 0 to EOI register$ H0 v6 I* G0 Z R9 O
upp_reg_hdl->UPEOI = 0;
$ x# d" p8 Y: e3 l: B z return ret;
! f3 k. U S) Q) ?4 V3 P} }( v8 M; x \ {" q
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
' d. r" U* T- _# Q#define upp_dma_sendstartQI(x) {\5 d2 T! K1 |* M& A. [/ h* y9 A
Wait_upp_SendReadyQI(x); \- @" ~% u3 {+ F0 i/ Z1 Q
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \/ G3 R z% x: Y" F0 t9 h
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
4 c* Q( _3 C K# n upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\+ s6 {% P3 j3 [0 P0 b: V
}: ]5 H0 s4 }" I8 e4 V" t; t) N
" G. g: V9 ^ i) A
- j1 s" b! s$ t/ }#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 ]! E1 g! [ H1 s+ Y6 k
5 Q" E9 N o" W2 w* S2 X+ ~" k1 j( C! M" E; m
想知道uori错误是在什么情况下面出现的,好做出修改。: S6 ~; I' k: a% a
1 z- A) D2 u5 r& W3 Q/ s
& f5 l2 U' v5 F% A% B8 a& i" K8 { |
|