|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
; f9 z: I! v0 M0 jdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下: J0 D. K/ I; l1 S. x+ ]
u32 UPP_Isr()
' M, U7 |) n0 e. p{
+ \6 C! N2 {* v" N$ Y Uint32 intr_status = upp_reg_hdl->UPIER; n2 U4 Y" |5 k" f
upp_reg_hdl->UPIER = intr_status;//clear
* T8 A, e7 r. k) _" C" G+ Q// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");4 x# F- c) P r' K; e$ R, l
u32 ret=0;
* A# h8 F0 L' K2 j8 L
5 N C4 `7 x! ~8 r0 n+ M // inline functions; T0 }+ }1 P' a8 {" r
while (intr_status != 0)
4 _% l' O& i2 w# N( C) W; n {5 [" T4 x u, z1 z5 I8 ^
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件7 q6 s5 ]" O, \
{: t; R( ~! [$ Z0 ?
// Log_print0(Diags_INFO,"eoli.\n");" M7 |2 [& m0 A, t
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);% ]: b% b8 k% P( E) u) @
}: _0 J" R7 s2 @( U
% y4 B5 ?" i1 P& o' e5 `7 }
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件, G/ \8 X: V) V
{
|8 P! I. v& e; }5 X3 n Log_print0(Diags_INFO,"eowi.\n");0 u8 c% c! _8 U8 A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);& ^) ~8 F' q& t: x: [0 J) }
upp_interrupt_count++;6 L$ x5 o5 g3 C4 k/ q0 H
upp_interrupt_eowi_count++;8 B2 c c5 m! S8 C/ P; Q* _
# ^( D2 z+ v, K' N2 g, m#if UPP_DIR_QI==0
% K; p/ S! L( z* M! b" _% K upp_dma_receivestart();
5 Z& P! A# u& l+ w. K ret=1;. t: D9 a5 V- _4 Q
#endif/ [4 I1 A" C8 _# ^: ~9 O
}4 h) m+ ]- o( r4 T! M3 r6 c
7 D' u) C/ T8 s if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& P S/ J! W6 G; K
{3 ]4 v3 B/ ^, w4 D3 Z
Log_print0(Diags_INFO,"erri.\n");
$ H7 {; C; o7 Z9 `( l' _4 v; } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
" e, p/ u. q; H! | upp_error_count++;1 G8 W1 B2 i6 ^/ a! }( f
}/ y9 a: O) p& u- I. Y
0 J% l* ~2 s2 I4 S# X if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件7 l$ {5 g1 ?" x% O
{4 ~7 Q' h+ ~' Y- L3 T, {3 D
Log_print0(Diags_INFO,"uori.\n");% r1 _; H3 U' i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);4 \, B, `: W' u9 t6 v# ~
upp_error_count++;- c1 {* x: d7 |, x; E% o
}
2 y% U- S6 a( Y1 Q1 L8 k1 @
?" M; ~& F9 H- G5 k* ^ if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
9 r8 A; E, d6 I% A; e4 m" b {
4 v1 J8 @6 H+ a6 q% G" O Log_print0(Diags_INFO,"dpei.\n");
; `5 B( a4 ~# d% v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK); \. o/ j7 t- s; J3 a; d
upp_error_count++;
0 h4 c4 _4 t' k1 z+ M, b5 N2 _7 D }6 \# n" H0 }) ^+ ^8 W
5 B) _3 B# `# q' R: M' I
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)/ q' v3 R0 O0 `0 R; k. h: o, |4 P2 Q
{6 K( {% W( V* o2 T
// Log_print0(Diags_INFO,"eolq.\n");& Q0 X3 d1 k, v3 W5 a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);% g/ ?! A5 i( k" Y/ R1 `& z% l
} f, a& v+ k4 T8 X
4 V- r0 h8 O4 K! O8 k1 |2 v6 ^4 x if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
y; V* v+ w4 H. f1 S/ } {, r/ @# N* ?2 R$ r1 v
// Log_print0(Diags_INFO,"eowq.\n");: Z& u, _" q, c$ C4 ~0 L# U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);8 G" k3 x, c) Q# ~* n q# Y9 z
upp_interrupt_count++;
( z" C6 Z! ]- f4 U#if UPP_DIR_QI==1
' i) j* A! A7 f6 j( ] upp_dma_receivestart();
0 u# e4 w6 ~ S# U% N3 l ret=1; E) c$ i. h5 E6 t" t) o
#endif
3 A# r: h. I) y7 U$ ~. k" v W }7 N; m0 b1 F( {; ?
/ r" {/ ]! ?7 S! O if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)# z4 N) O, O+ @; E8 _' |( ^
{
* `: u4 N' K0 X& \ Log_print0(Diags_INFO,"errq.\n"); E! q0 R$ ?; c; @ ~2 ]+ p
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);! q3 h! t6 D# x* b5 u/ ^$ a+ N
upp_error_count++;
8 ]" f1 y' f S }
6 R" J3 s) @) d$ q {: F) ~
% T- z- ^; M# j" L, @* F+ _( a if (intr_status & CSL_UPP_UPISR_UORQ_MASK)/ ]. u- L2 J3 S% C. |
{
# \! z" F2 J8 d S Log_print0(Diags_INFO,"uorq.\n");, c/ U/ C3 B2 i$ _9 J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
2 `1 O7 d! H0 e/ [. D upp_error_count++;
) F& J% J8 n$ p- o$ l }, i5 y# ^/ r; K+ C; _
+ W' ?7 M' a/ e' d* J if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
& \% P4 g$ N5 x! k2 g {
6 k" X* I l/ a0 c9 ` Log_print0(Diags_INFO,"dpeq.\n");2 d% W/ B) F! w, p
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
4 _* ?# v: I: Q) \: k upp_error_count++;
) U! s @* ]; l0 g: }8 X- x }
4 q2 {' O5 \' |+ g: B( C
: w5 J3 F2 ^2 b1 u // make sure all interrupts are handled
; ?9 H: }* x( Y' k0 c intr_status = upp_reg_hdl->UPIER;3 h- w$ q' H; N2 }& x% ^ k
}
6 s- ^/ ^" n, x& T% }
( y1 c$ A4 n) r. q- V& D: T U // finally: write 0 to EOI register
$ _' d6 S+ ~+ _2 F. P upp_reg_hdl->UPEOI = 0;, C3 E, o. M- g( F! U* b0 O
return ret;7 {9 t* V' [! `) X
}5 B: O* l7 `3 l) {
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
) u8 ^, K2 {! I8 `# C, r* a+ A& Q( r#define upp_dma_sendstartQI(x) {\
) |- G6 P2 ^2 E7 T* e3 a Wait_upp_SendReadyQI(x); \
E1 O+ R( _; z) _. z upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \) T- }+ x9 W! s! ^) C8 z
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
5 o8 o+ b, ~6 O( a upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\; D: }% p7 v. U ^" K) P4 _
}
% P7 Y& i; ]! {0 s4 T6 C( v8 D9 C( H5 k4 y' T8 X5 t5 n
8 S7 L* i* Q$ P6 V( I3 x#define upp_dma_sendstart() upp_dma_sendstartQI(I)
# `7 n" h5 q+ R! j8 |1 O- i5 W8 o$ ]. F6 ^0 K9 W4 L" L8 e
V% g; h) E% s' q0 l9 w+ l* l- Z* n: ]想知道uori错误是在什么情况下面出现的,好做出修改。
0 s: z; P( e# h# j/ x- z: k4 u( E5 D' t+ v, ~# h( z- c+ s6 \1 b
2 H7 |9 |4 u7 }; V( n# R
|
|