|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?! V+ j) W+ b3 X+ P/ z8 Y7 @
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:. q0 d9 y8 [( E' q
u32 UPP_Isr()
0 y1 L4 v. t1 } m{
' u3 D" z$ W+ `; k8 U Uint32 intr_status = upp_reg_hdl->UPIER;4 a* s4 A8 i9 ?1 Z" i/ Y; |! R
upp_reg_hdl->UPIER = intr_status;//clear
( g$ u/ d0 I% Y: w; W// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
$ n+ l2 N7 @1 I8 K! {" j8 L7 f u32 ret=0;
7 m, N& Z. J5 @. @, _) l. O% |2 Y
// inline functions
+ A$ B! J' h2 c' I* ]; c) { while (intr_status != 0)
( U. h8 m% N8 W5 F. C {
( c% j, A* {( F if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
3 r o/ N. k8 g: M* o u {
, t- _2 [1 `; Q1 g4 ]/ U// Log_print0(Diags_INFO,"eoli.\n");. ~7 r# L( b( O& y6 Y# M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
8 P/ f7 n' w; c8 X }" u6 r# S3 O3 g3 a
5 F* G( A9 R. L+ X if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
$ {1 O( K) _' j" ~, ` {
! L, S& Y4 [' c; i. ]7 j7 u' ~ Log_print0(Diags_INFO,"eowi.\n");
: _6 a2 e: } [8 N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
( n7 N) p% y- J. E- G upp_interrupt_count++;
4 a3 p* b: A- ]8 |" N+ m upp_interrupt_eowi_count++;* i4 G8 t$ u4 E" X: ^
6 j4 B5 n1 ^' K$ p# g
#if UPP_DIR_QI==0
9 P& j5 w8 A7 I" v5 l8 }7 F upp_dma_receivestart();
; t: [$ j ^1 c4 D5 Y ret=1;
" a, o; s% ~2 E% m#endif
0 ~, k! y. @& X; H }
. g j3 F0 B2 z3 R2 y6 s0 N5 V$ b2 f9 M% n
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
! R% Y: ~+ t, A) a$ m- c. ~ {
! k2 L( c ?1 d$ m Log_print0(Diags_INFO,"erri.\n");
- N D: ?) q7 F6 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
8 `. z3 l# p$ H" i% }" \3 H' H upp_error_count++;0 E( _) G0 Z) H7 G+ w& n( d
}1 I, d2 y9 |& t' D2 D8 K* b" T; i
& p0 P% h3 ?* H% ]7 `% F7 _8 X( F( Z+ H
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件: X" J6 Y+ B8 L& z Q
{( n7 U J* Z8 B2 _% ~
Log_print0(Diags_INFO,"uori.\n");1 @' J" m- C, m1 W$ h6 n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
$ V! B9 o! J* ^) y! V upp_error_count++;
/ |' v( T. o/ d, C }
w0 [( H* z6 M3 _6 q' Y! c8 \! P2 z: i$ A6 y' a& a" q
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件+ }- z& Z+ B1 ?
{
9 D) ~/ B- A1 k8 p Log_print0(Diags_INFO,"dpei.\n");: i" I2 L# P& K9 N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
' r$ b. O' s) E- y- Z" l3 L4 s upp_error_count++;
# }7 `: l3 x9 Z: P S }
0 {$ ^- H, j/ s: N2 p0 m" X
% k; y6 }9 j& l3 {3 P: v( N" j) \ if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
, X5 _) ]# \/ R0 r* T7 M; S7 C {
g4 \# P! R4 c: Z8 A// Log_print0(Diags_INFO,"eolq.\n");
4 U& ^. U8 N. U3 R, X3 f( r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);7 N/ ] K2 ^) @; p5 @: W, H9 e
}0 h% T5 L" M- s3 U" @2 \& k5 e0 T, x
' J8 l& m- R: b h& m6 C if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
( D4 K1 `( D: X5 @ J# {1 n. [( l$ X/ m {
' O$ r: l6 x& U/ |! e+ S// Log_print0(Diags_INFO,"eowq.\n");
4 V$ _# Y7 y9 D! S/ G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);9 ]( I* K( d4 H$ E9 g- @! r3 d1 R
upp_interrupt_count++;
& ^7 L; U6 m( Z+ `#if UPP_DIR_QI==10 ^: Y6 {% |. h- E: ?
upp_dma_receivestart();5 a# o7 n+ {3 O9 c$ m7 o6 b* f
ret=1;2 b5 \) |# N" g( M% u
#endif
0 B$ n& p( T+ [8 y6 r3 H }
7 K! h" F1 ^" s$ R
* @: s. l4 l: P if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
9 ^. M' [% ~4 x7 |3 S. } {
9 @* P8 W* ?1 J* v Log_print0(Diags_INFO,"errq.\n");
$ E) [* n& o+ \0 ~) V6 P' s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
2 M' H+ s' ?% K6 o! x6 U+ ?0 s' \ upp_error_count++;
- y3 F; I1 s6 U: w6 a }
5 f, Y3 F1 K* @1 R" y* R$ c8 J
: u( p% l2 k0 J& S( W! A7 u if (intr_status & CSL_UPP_UPISR_UORQ_MASK)2 d7 E8 ^: |( R
{
; ]4 ~; I7 i" J0 { Log_print0(Diags_INFO,"uorq.\n");
6 z7 h( k8 l5 E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
* D3 c6 f2 X) v: e% |0 L; z9 Y% ~ upp_error_count++;+ E5 {% v4 H/ T: H5 w) d$ A
}
% H0 O) v; L7 t: ?4 \0 e( Z
' q; g' \$ u- \ if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
6 Z; G$ ]* h8 N! J) Q# o% B {
3 y" D1 t' q+ P1 E- A Log_print0(Diags_INFO,"dpeq.\n");
! m c' z: _. C% o/ Q7 i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. z8 j- M) w# m& _( K( l1 I/ ? upp_error_count++;
. v' X6 g) [) N' G }' A& r) ^; ~. q `: {7 |, e
( H# n6 b4 {$ Q7 C: z // make sure all interrupts are handled5 V. z) b7 R8 H, M, V& h
intr_status = upp_reg_hdl->UPIER;
) c4 r) d w$ D1 T }
* J8 p, ^; }$ V
6 j! O3 R& k {- N: `. G1 i // finally: write 0 to EOI register8 E- O9 @# z/ D( I. O1 n" K
upp_reg_hdl->UPEOI = 0;
7 ?1 j( u# ~' {& U return ret;& n7 |5 F4 `0 p
}
/ v, I# y" f6 ]0 c7 p8 Mdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
" }- f7 `; H r3 k" Z8 k#define upp_dma_sendstartQI(x) {\
. }$ k& v* v( [1 I( z2 D, @ Wait_upp_SendReadyQI(x); \
7 `! i) L$ J; H$ a2 s upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
* S$ k& p$ G! Z& ] upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
* B0 }; e5 [5 a1 L* b. R3 ?; _% v upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
& C+ h% U+ l0 t6 f* P% k4 O" F }" X. ]% Q: a( X: l# Y% |
( Z( p# c6 v3 b- i7 X
, i. C, V. M) J! }( J- n/ s#define upp_dma_sendstart() upp_dma_sendstartQI(I)
h- q0 D( m( W$ }' s# F
9 @% g7 B1 O8 n4 B& {7 z$ a3 ^0 \ p" J& u
想知道uori错误是在什么情况下面出现的,好做出修改。
; ?. @5 l, s/ i- k& W0 z3 P. L' \) i- q4 ~+ i5 M9 I
, F1 {, I( t! O5 a( R |
|