|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?. R U7 G$ E# M% X- S
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
; T5 h8 z- S4 A* c. H1 y, E* ?u32 UPP_Isr()
- D) S( i2 w( H, K4 a0 A9 [! B9 T3 V{
) `9 B+ M7 E3 k4 S% ? Uint32 intr_status = upp_reg_hdl->UPIER;
9 Z- G+ r c% f' ~3 g2 `" `' f upp_reg_hdl->UPIER = intr_status;//clear
' z; o. s3 f& s& D: D// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");$ }- M5 O8 _' B: p' A, }+ ]. ^( K
u32 ret=0;
, Q; \8 z; I8 Z( z3 B" ~9 g+ G) E8 W$ y8 O/ F% \' X
// inline functions! @! { P- h2 b- v' K
while (intr_status != 0)
* i( E' A; Q5 H+ h {
8 f1 k P4 Y9 z3 s if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件' Z) p2 W& l7 l3 C* j
{
* T+ T' `$ G; X7 r9 [% m// Log_print0(Diags_INFO,"eoli.\n");
; x# _5 Y1 }9 v5 G' T$ j3 f1 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
$ R2 v# \+ k& ~0 d$ n" X }$ Y: z& \: p% B+ d5 a) B
% E6 {0 r: p R `3 X7 B% O5 N
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
7 ^+ B+ \+ [6 W/ B" {( C {
, h- E! M7 [, B/ F Log_print0(Diags_INFO,"eowi.\n");
) o. s6 Z& R: N+ ~( d# |6 c, D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
$ o" J1 r* \, I; n upp_interrupt_count++;+ ?: d. C$ E" E
upp_interrupt_eowi_count++;
3 N4 Z, ~4 L# ~- H# t" K* E" a8 N: h
" x' V W, w' h#if UPP_DIR_QI==0& V" d& K! }+ ]4 N' |' X/ `
upp_dma_receivestart();# \+ O3 Q% w) c. N
ret=1;/ b1 U% Z" }$ a
#endif9 R, C0 `6 X! g$ o
}( n d7 Q; }9 o9 Z: {
7 q# f o$ y6 Q) C
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件- E( X. r$ {5 D
{
- V& y: B3 E5 x* l3 g2 c- H. c Log_print0(Diags_INFO,"erri.\n");! x$ v0 N/ ^* {8 x# i; M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);+ }' D. b6 o/ z6 C$ R6 H8 ]: \
upp_error_count++;3 |" O: U) o6 M6 s# @0 |
}- [. t# T9 ]0 Y3 Y, t0 F) p
# A& l+ W; N" L8 q- y2 \' k* ? if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
/ S$ j7 n8 o) V7 C l {
% O+ y1 i3 d7 p6 E Log_print0(Diags_INFO,"uori.\n");0 c X7 \# p, S. U' |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);) n }6 @6 h. I* ~6 T$ l: y
upp_error_count++;
# N8 K4 J, y+ _ }- |3 A1 j h* W2 c G+ D
f) x( c6 ? N" w9 k if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
- k, V; g* }2 y# K" X# s {
0 r* n! ?/ R0 z3 H Log_print0(Diags_INFO,"dpei.\n");1 c+ n- q" {* s: e) S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
3 s# l: q' c( m \- q2 u! ~ upp_error_count++;/ z! N$ x1 b2 G8 E0 i$ D9 c
}! o6 `/ v/ K9 S2 |6 L% G, C; F, u
3 t4 f+ `, p# e+ ]( @5 j4 N if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
5 m' N+ Z5 k4 p9 }6 b {* Z8 n4 N8 `6 Q! g h
// Log_print0(Diags_INFO,"eolq.\n");) _' a E+ c' u3 |) b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
! Z3 N0 y; y7 V8 U1 Q- o' C E }1 X& F7 w( {2 M& K1 X: N
* b, n" c9 N" b! z% s! k% L if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)6 o6 B8 ~" @/ m! p; x" C% w
{
0 Q& n; } Y$ `; r0 s# l. N0 u. w- \// Log_print0(Diags_INFO,"eowq.\n");% m; e. p$ u# z5 g$ T/ N" n: \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);) O$ r# Z. L8 p' M
upp_interrupt_count++;3 F* v% T8 |/ ?- g; v* _, O9 E
#if UPP_DIR_QI==13 c7 f+ o9 \! z
upp_dma_receivestart();
: K& Y$ o, o$ Z! h. }4 I# S ret=1;
( O1 b0 ?: d/ R- l* x5 f#endif0 x' k& B x: U* [( R5 o/ c
}
2 F- a% E% _' g; a3 a9 G; O$ L! n; t1 z% S) t9 U* F
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)- u1 o' A; Z( o% x- [
{
3 J9 m) ?9 ?: `1 Z Log_print0(Diags_INFO,"errq.\n");* W4 x# N: `8 [# K% r
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
8 m) M1 e9 z2 m. D; m upp_error_count++;
0 C: o( K' ]+ k }" ~8 u4 l: q- _
, B, Z2 O" Q% d9 p% J% k. M if (intr_status & CSL_UPP_UPISR_UORQ_MASK) i' v* g! s7 b" i
{
& `* m8 q6 W" Z0 r. v: U1 x Log_print0(Diags_INFO,"uorq.\n");
0 G5 [4 E% J. i- g0 m' z$ C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);6 ?! e- D* T4 C- Q& \+ C9 q, k
upp_error_count++;- R7 B1 i1 R* f5 T5 y8 y
}
! X' J9 M% A0 w5 j
/ i, H* Y. M% E3 `, v6 S if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)# h- e0 x5 r. b
{
+ B, f5 V8 `5 q, Z Log_print0(Diags_INFO,"dpeq.\n");
* M, B0 b0 f) [! X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);# ]* h7 c" o o! |4 P' y
upp_error_count++;
: ]) Z5 Q% R& I9 ^ }2 ]% y0 J/ j* [- ^/ `6 @! U& {& G: X
3 X: d/ k) m) F! v6 a6 j // make sure all interrupts are handled! q* x: a: O4 j! L! Z1 G
intr_status = upp_reg_hdl->UPIER;
1 p. E( f0 F5 u( |& g( E' L$ \ }
1 E. m0 O8 @0 e6 V0 y2 b! n% p& J) c0 c' `, Q6 W9 o
// finally: write 0 to EOI register* ?5 u* h7 W: G- n5 {8 [) N
upp_reg_hdl->UPEOI = 0;) Q: P4 }+ ^/ |. }" `8 h2 Y
return ret;
0 T: z T+ r5 M9 C" o}% q+ k/ N0 J( b6 ^
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
' o5 w: t% T' T% H8 |( P7 X u: v#define upp_dma_sendstartQI(x) {\
( J/ W$ b) z$ Z: C, z Wait_upp_SendReadyQI(x); \
& R/ E% P3 ^* V1 f# e4 S: c- X upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
: u0 l5 a8 }' z' { b0 R8 K upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \9 M+ |( b, Y! S* Q, s0 {3 [8 U
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
: X8 g; ], I0 ` T0 H& O* ^8 s. ] }
# l6 n6 k6 r/ P. h2 W- `: h( e
% C( T. {. F% \2 D' I# M) n, q9 D, r2 V8 p
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
9 e8 w1 ^. ?7 C; E, c" A' i* i. W9 @1 h U3 L
5 {& |# ]. n6 k: Q( j9 B
想知道uori错误是在什么情况下面出现的,好做出修改。
! C3 i; G7 D6 W6 T4 D) ^
# @8 q: U" G8 S( {) d) b2 i" K- h% c
|
|