|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?2 ~- F U6 m) g
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:3 x3 @6 v, | v% }6 l# i
u32 UPP_Isr()
$ H' F/ T8 E3 g( Z{0 Q2 b( N! S$ b
Uint32 intr_status = upp_reg_hdl->UPIER;1 K+ w7 q& L* a& L( w
upp_reg_hdl->UPIER = intr_status;//clear$ J/ q4 t$ e! u6 R B, u6 ?
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");% Y, t. W. i. {; ~0 N8 d; m( s
u32 ret=0;
/ a1 I) \: m2 T' `5 n/ c; E: }; [; M3 F
// inline functions2 y4 ]! P. X/ D3 F H' i& R, a
while (intr_status != 0)
1 x g E2 T$ p+ D1 N% x/ \ {
+ G9 E2 V& L. ~/ @: { if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
3 W: v/ E1 g4 Q$ y$ t$ g {
9 L9 M1 k) K% q- f// Log_print0(Diags_INFO,"eoli.\n");
2 q8 F+ i# b' L+ [9 l8 R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);! B- S+ z. C$ X9 Y
}1 {+ D R A* X9 D' B/ K- S
- x4 N9 B3 t. n2 K: z9 U if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件* k5 v! L- ]$ a9 X; h% |
{) I! r* N1 I) j. T5 w1 l
Log_print0(Diags_INFO,"eowi.\n");" j% J7 a w0 @$ v# J& i- M! E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);7 I* ^, b; p7 N" N
upp_interrupt_count++;
; I+ h$ T6 A3 x) m& d$ A& u upp_interrupt_eowi_count++;
9 [) C n/ f) n& C: q1 a( \6 S5 Z. l7 C) i6 f% T/ x7 l" l7 y2 S$ K" \
#if UPP_DIR_QI==0
7 Z( g, V" P: }2 u upp_dma_receivestart();5 m# z! l8 }8 {' g8 l! z' l) F0 o, q
ret=1;
* O* e. I9 N8 }#endif( M3 e o1 A* K0 P6 z* Q1 P
}0 t% ~4 [- D# d
x+ O' z! m; U$ h if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件3 z- B& j# j' a# W( j
{
' g" v1 c3 K) v- H7 @ Log_print0(Diags_INFO,"erri.\n");9 ^5 L8 m' O2 W" [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);/ `" ~) a# i6 F2 l7 V' X7 H
upp_error_count++;1 f) C) c( w# X! m/ }/ S! B
}" d+ Q. s$ o% |/ H8 `2 Y" w, J
7 p6 P) D7 J- [2 W/ o8 _( @& N
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
( g5 i! h0 `7 w- F {
% ^1 D; U1 K: o2 [* I Log_print0(Diags_INFO,"uori.\n");
\9 E! Y1 K n P4 G5 c" g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);3 b( m' v! W- n
upp_error_count++;
7 X/ c5 f2 }- Z2 j2 n) n7 B }
! t+ f4 j- Y3 S0 b
1 L% {, a/ e2 K1 o if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
8 a f: q; u3 v- m {% H4 X& N/ `% S2 z7 L0 ^3 r- k
Log_print0(Diags_INFO,"dpei.\n");! d& [: {( _/ L6 f. k% H% ?
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);0 J; A* U& N( w& ^0 [6 {
upp_error_count++;
# x# h& s0 j. w0 u/ Y2 j }0 H: m9 W$ A8 t8 [, J
5 U& d) k7 }9 K- z. Z, h
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)7 @9 A# f# S/ G2 N* z- }
{
& S2 y( U- W* C( C# ~// Log_print0(Diags_INFO,"eolq.\n");+ \! h. ]1 U1 x3 M. ]3 o/ m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);8 ~& s/ a- S9 F0 n* Q& p
}6 f, g% x. V4 Y- `& }4 M
. F) q, J& J9 L! R# O3 v; j: j
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)& {1 h; m. ~* _, V
{. C* g1 p/ W% C, N: E
// Log_print0(Diags_INFO,"eowq.\n");! x' J0 J `# |/ ^, }. s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
2 @! f2 j* ^2 p upp_interrupt_count++;
: L1 F, L# J; L4 T6 T+ L# S#if UPP_DIR_QI==1/ Y) _3 H" B. S! R0 A; e
upp_dma_receivestart();& Q, Y0 V& c9 X$ C, y
ret=1;
: ~" D% z3 a6 o0 f7 s0 s: v2 [#endif( T0 h" u& z& N2 `" m( p, ?
}
% ]* e3 D2 P% U6 l1 I; m* E7 }+ k u5 g3 U5 Q
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
/ i% J0 S6 Z0 o6 f+ O% ]( K {0 E2 }4 m2 D' W) }! Y/ a9 e4 X8 d
Log_print0(Diags_INFO,"errq.\n");
1 }6 j* \+ v/ C% m1 ]6 @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
. \; q/ {% U+ c$ a3 i( G; y upp_error_count++;
4 J* P3 b3 l4 H }
% k, P2 ?, |8 v3 |$ N6 f: w, Z# K9 l& {# [) f# Y) T. f
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
& i3 x( L! e2 p1 ]8 E {
! k9 G' S* `+ L' j, J+ \ Log_print0(Diags_INFO,"uorq.\n");
! z7 s+ s* m, k6 y' ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);. K. C" P/ r, U5 `% {' `
upp_error_count++; p1 s" g/ j y& X
}- B. D! [* F- j7 P
1 S4 n9 q( Z! [& ^" _ if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
3 k2 u% C4 X+ ]0 f" F {
$ R4 w; {( A8 C, f* ^9 r* @ Log_print0(Diags_INFO,"dpeq.\n");
8 T3 Z9 H5 \# x/ W9 n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
8 Q3 }0 Q6 n G; V6 l: M3 n2 | upp_error_count++;
* p* @* x" v* A$ S. a. S }5 D5 I4 S+ o* D
: f* X9 S0 `! `) H2 |) N4 G* E6 d // make sure all interrupts are handled/ u6 P( j/ G. f$ O+ ~& i
intr_status = upp_reg_hdl->UPIER;
4 H% h4 w- H3 D' L }
5 n' |) F8 S& O. t' s6 V. h g+ S* Q% e$ Z& ]$ l U- q
// finally: write 0 to EOI register1 [, `. k: @# c
upp_reg_hdl->UPEOI = 0;% m3 r, P2 Q R- w
return ret;
' Z- R( c- b6 Y8 I4 J! p# k$ q8 @: D}
1 ?" o Z h T7 |* vdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):) R' C9 l2 t$ A% S# T# M
#define upp_dma_sendstartQI(x) {\" y0 M* A; U. w
Wait_upp_SendReadyQI(x); \
5 \; X6 Y& H2 e- F5 B6 e, b6 w upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \3 V" S: s* z/ o+ R
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
& ~3 z: V5 ?- K4 x$ C upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
" ?- k( Q& ]. M& _+ _ }
6 u" ^+ ~" i f! e' J: V- a" v- J4 a2 O* c. H' n2 u p
( h) f. N8 x( W( f8 M#define upp_dma_sendstart() upp_dma_sendstartQI(I)
/ I3 J& t8 }4 j4 K2 s! w
1 \3 E6 S" Y; c! x$ j6 a1 B( Q
想知道uori错误是在什么情况下面出现的,好做出修改。
3 |- }+ r9 z! K9 Q& _
, C6 i8 E0 [ Q/ k+ j% f: o5 s+ V* ^5 g; E: @! V$ F, y
|
|