|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
) o4 ?. F4 L4 l; s' X. mdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:6 X9 Y: i" t" D* m( x- ]
u32 UPP_Isr()
9 T6 L0 H8 `3 ^" U& U: [* e{4 l1 `/ `) x5 B% K1 M/ ?4 O Y: i
Uint32 intr_status = upp_reg_hdl->UPIER;
8 j4 ^3 k! K( r4 ?& g3 x! P upp_reg_hdl->UPIER = intr_status;//clear
& |: r9 z" Q1 T; t& d// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");4 u; R' h+ ]4 H0 E% a% N- e. E1 p
u32 ret=0;
' X) a1 t+ Z2 Y' M+ I# n9 K& `
// inline functions
. {; D- }+ W) ]) a while (intr_status != 0)
# x8 j3 i9 i- _& ?& r {
* U% ~. ^; p: D1 u: P) i1 f2 ?) Z' R if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
/ L- \/ b8 S: [* Q& X {
, ^ ~+ _/ m/ h// Log_print0(Diags_INFO,"eoli.\n");8 m6 }, m3 z3 O- S9 \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);* L2 A* ?! E9 i( q0 o
}6 Y3 v0 q# [) v+ e; G
! K4 Z3 m, P+ ^# _" h8 F if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
+ v: o8 F% u6 a' |0 S3 _ {3 F2 [# ~7 B! J. S$ D
Log_print0(Diags_INFO,"eowi.\n");/ m/ V3 X$ C$ R# ]6 X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
' `1 t7 l6 d" u. H8 z upp_interrupt_count++;4 O. O u8 u- H8 _
upp_interrupt_eowi_count++;/ q2 D9 Y* x2 y/ x8 h
$ F0 m. z2 @5 E. {; J: J; f#if UPP_DIR_QI==0
y8 ]$ E$ p { upp_dma_receivestart();9 u$ J# q1 H) W) r$ l9 K0 r
ret=1;
$ \( Y5 Z" p* m/ z- Z( H4 \#endif( ]; ^" P# }7 u
}) s( r- u/ e& Q: ]0 e
5 J/ B, v' m2 K- m+ M& @) K" z e if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件0 O2 f: L$ a; F
{. U! ?, B( V7 T6 j
Log_print0(Diags_INFO,"erri.\n");
8 z( s9 p3 R, ~! d, {& D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);! }6 s4 f& J; ]4 \
upp_error_count++;
$ q- x! a8 _9 r9 S$ j6 C7 G }# ^2 [: y5 u" M+ x+ g
4 D; C3 O6 i& c$ c$ P9 w2 T- F
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件9 O$ E% |4 m, W4 w8 a: i
{1 B# }* G: `$ G2 p$ t
Log_print0(Diags_INFO,"uori.\n");
; s0 ]+ u( Y# e) M2 Q: \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);+ a1 v. w" ]% c
upp_error_count++;
! u ~. f& @+ X" z! q8 U }; P9 J: l* V$ `+ t7 ^( U
/ _- F0 i* [& f' U5 ^0 D0 q* K if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件( }/ E5 h0 G( d3 p6 F) t2 g/ v- v
{1 F& f! H0 p7 z( O& L$ O
Log_print0(Diags_INFO,"dpei.\n");
" Q h& J: N" { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);3 Q5 B/ q6 T3 f' v
upp_error_count++;
& \% ?7 I1 }9 I5 H+ L; X }) \. L S9 i' v. ?6 q' z
4 n5 C5 L. r+ K7 y+ I
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)2 u2 K$ w0 I5 A, q% Z- X, t
{
8 x w' Y }% j. q+ z9 h// Log_print0(Diags_INFO,"eolq.\n");
1 Z, V2 c @/ i( K, ]+ n1 Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
! c9 h" s6 a; c5 `; p. m* b' Z6 o0 G3 ? }
9 o1 \; Q# c+ ~6 S2 l \9 s3 Z6 ]$ s4 S+ k( R4 h$ ~
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)8 ]# E+ @0 [0 J) E2 V3 j
{
! i. u( R3 u' E N// Log_print0(Diags_INFO,"eowq.\n");
( s/ i+ B8 Y8 J0 \8 o" \$ Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
! @& r3 T, l& R# X upp_interrupt_count++;3 y% \9 U! f0 Y( P( w
#if UPP_DIR_QI==1
( ?0 ^: L7 t: w v/ i upp_dma_receivestart();
7 \$ e G1 W. }. N% a" n, i! u ret=1;
0 p3 I! T9 J) |# n#endif1 S2 }. m, F1 r! Y! P& u9 f; s4 I
}/ ?/ E9 B p& V9 {
3 o: ]2 ]/ V& Z' I, g8 |
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)/ `6 j$ S- i$ @
{# s/ w( P% m1 Y7 w3 i6 Q1 v& U
Log_print0(Diags_INFO,"errq.\n");
7 c- m+ z" M% H0 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
) R" @+ H( c) b" c1 ]3 w, u upp_error_count++;& A4 b: h3 w1 ]* m1 X
}
* O& x8 D% ]: E1 ]0 j
: B% r( ]& A/ \4 m9 y$ H if (intr_status & CSL_UPP_UPISR_UORQ_MASK)) s7 V/ |) \/ x5 h- a; |1 F
{
: {; h R4 G7 q4 j t- P% b+ g7 _ Log_print0(Diags_INFO,"uorq.\n");
7 {# t( ^6 r- R5 ]4 w8 t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);& A" n4 ^; m6 o9 Z
upp_error_count++;
0 ^* Q& H' I: j% p/ T+ [. V }* x! G+ [, {8 D, _
2 E3 h/ M/ p5 V J3 L) H& ? if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)$ L8 `" l/ I: r. ]! k& a7 G
{
2 E$ Q$ Y$ m# n/ |2 m$ b3 W Log_print0(Diags_INFO,"dpeq.\n");' k- Y2 N9 [0 I( ^% d" Y6 s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);4 i& R6 L& c6 g& ]! A7 L' z- ?
upp_error_count++;
) h. x$ h6 W- M! N% z) k4 b6 O# O7 G }
! |2 K* ~/ ]( S; u2 _: w6 L; D2 i
2 F: E+ X9 v. w$ b% G // make sure all interrupts are handled
2 O) P; @4 ~3 ?0 P" U* ]2 ^! t intr_status = upp_reg_hdl->UPIER;* O( z- c3 Z& r3 S. e
}4 \0 U+ A! Q) B6 q
% [% l; q! U7 @) o1 C( [3 D
// finally: write 0 to EOI register
8 r7 Y: H) i8 T upp_reg_hdl->UPEOI = 0;( U# Z6 W# G- U" X
return ret;% v- `& b* J1 L: [% J
}+ v% P8 L" @* Y6 C) J
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):4 d+ O3 v8 C2 g% g! ~6 [& f
#define upp_dma_sendstartQI(x) {\
: v& ]* j: c& T! y3 P9 O0 v0 b3 } Wait_upp_SendReadyQI(x); \
7 D3 _- M" b4 R' ~. a; T7 x4 d upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
2 t* G& T- G+ ]7 U upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \/ O0 L- z% y! [5 p j
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
6 y5 A2 S8 F; o }; ?/ a, F- a2 Y& t
0 T' Y! x( P/ b
- q, J3 g% ~- Y2 r: g( R6 m1 y
#define upp_dma_sendstart() upp_dma_sendstartQI(I)4 D2 V- a4 U* z$ `( B
$ }4 P7 R- l; F8 H9 V# j$ O& d3 e. j" v& O1 b2 |1 c
想知道uori错误是在什么情况下面出现的,好做出修改。
- C6 p' X- W v, B G6 I
, N1 f7 r( u' }0 z K2 m( T4 R' n! |6 T( f: Z! R! ^
|
|