|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
{! ~9 T8 A3 ^2 i% vdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
! ~# i4 q# `" h1 P2 Xu32 UPP_Isr()
8 I7 J: A* P' X& v: w1 i{& ^; c! ~6 W& \+ K4 W+ l; K
Uint32 intr_status = upp_reg_hdl->UPIER;% R" x& R# q/ f+ U1 ^' X
upp_reg_hdl->UPIER = intr_status;//clear
' o. ?( P$ q- h7 @// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");" x7 _& `; B/ i; ~- `2 }# k
u32 ret=0;
% f& y+ {0 Z; x( k! h5 P2 I/ g. H6 m7 f+ ~
// inline functions+ _" v2 |9 w) j; G1 B0 `' B( Z, B: Q
while (intr_status != 0) ]' j; w7 I$ ?: k, [. o$ G
{9 H# X% f: B/ I: E4 r
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件! I& n: n* ?& A$ U x, _2 c
{# N1 V) F5 |: V, P
// Log_print0(Diags_INFO,"eoli.\n");% n" R" b/ e) {1 i9 O! ~7 {7 g0 x
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
' d: U1 F+ Z4 N }, _' v5 k% l; b' M: L
# k; [% S4 D6 V/ \9 S if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
5 [0 S. p; G6 u6 r {
$ X, a9 Z; V. D2 T9 K' B" w2 O5 \ Log_print0(Diags_INFO,"eowi.\n");
3 b: V7 O- ] S& B- S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
) U$ p' u3 c0 o2 n& w& P upp_interrupt_count++;
/ e2 Z7 q8 T8 d& n8 D2 b0 A* u6 ^ upp_interrupt_eowi_count++;
6 h$ B0 T5 U5 j4 g! n2 a% c6 {" w0 F* b7 u7 X
#if UPP_DIR_QI==0
- q+ D+ |, S a& e" c/ R upp_dma_receivestart();# C# V2 f6 B# w; ^% n3 _
ret=1;
( Y6 \; g% `# ]- e0 w ~: W#endif8 e2 x. k9 L& a# J9 N
}
9 v4 p2 C% X+ L) y1 {% u4 e# @7 [8 i1 f& G# \% K
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件- K) \& F% R- e4 y7 f
{& G5 [5 Y- U' R X) H' s2 |
Log_print0(Diags_INFO,"erri.\n");9 a/ j! |8 M8 I3 G' ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);) e$ G9 H2 |; ]0 A- u6 X' V1 ^
upp_error_count++;9 Q' X8 v( z2 U/ }6 E
}: O; f8 E& o, j6 |! N$ c
6 v. R6 }3 P! E1 F; f& x2 [1 R; ^ if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 v2 ?3 g- _/ v8 j6 k: {
{
" a$ v% q8 e3 A Log_print0(Diags_INFO,"uori.\n");
% K% r2 s: {0 W; y1 t% b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);9 B" A& G+ `# p; J* @5 S. K
upp_error_count++;
& L' P( w' R$ Z5 H G1 x7 A: o }
# e4 Z6 {4 L2 z- u1 H
8 I0 _9 z: b' S; x# y% P3 S M6 B if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
+ _8 Q- x5 s, Y2 V( F% p; e {
* e% h* n$ l2 ` l5 h6 b Log_print0(Diags_INFO,"dpei.\n");0 v- c- y5 D8 |* N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
! V' K1 A" {8 q. h" T7 _ upp_error_count++;
F: o3 a; ^0 ~: e d9 u* a }# W! G8 }; E. s; J) U
) p/ h- n `( r1 i4 r7 r4 v
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)/ N0 z: a. V: {
{# Q0 q8 w; @7 w9 ]
// Log_print0(Diags_INFO,"eolq.\n");: _8 O) `/ \! ?9 l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
: I: r; h) k9 w }
- ~/ w6 Q7 a z# T2 a0 B
; T" J" I& ]+ u if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)3 z2 o0 u! H+ x$ o0 E4 ~
{8 u: |$ B* E0 J/ {8 f
// Log_print0(Diags_INFO,"eowq.\n");2 Q4 z$ x5 C/ [ N0 r. E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
* Q1 T0 K V4 _% H upp_interrupt_count++;! o# j& M1 L$ O- o
#if UPP_DIR_QI==1; Q8 U: ^4 T5 [& {$ b# x
upp_dma_receivestart();5 \: P9 s$ b7 }9 p% y
ret=1;
# U0 U. w/ t, s; f#endif
% R6 a1 Z) _$ T0 g }
7 Q& [' m( H) y2 P( `4 X0 v2 ^6 O3 j& B3 z/ G+ y/ L, j9 h
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
1 [% W1 H0 L7 Z& ^9 z9 d7 } {8 ^) h" V5 \* \# s/ I
Log_print0(Diags_INFO,"errq.\n");
8 d3 `4 y4 F E8 d( ~" s5 b( t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
- ^ l* j* I2 ?" V" B2 S; f+ g+ q. s upp_error_count++;2 R( \4 d9 k* R% t% v% m# w
}& r; ?7 E0 G1 D0 S A& `
k7 `3 j% E$ y! n" l if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
+ Y# v: t/ |' } {
+ B; A4 _% i$ D* n Log_print0(Diags_INFO,"uorq.\n");5 B5 O/ ~. k5 s3 |# ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);3 v m/ h( N* r' `3 ]' v1 v4 l" C
upp_error_count++; T" B) Q# v1 J; T% g
}
: N2 Z S Q! W5 L9 S
# d. R9 @6 `6 }2 n if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
V5 j7 b' v" c4 f' X8 q {4 R1 @2 c3 M- C
Log_print0(Diags_INFO,"dpeq.\n");
- V, z; h: l, r) G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
9 F2 I2 j4 m* X1 P/ b upp_error_count++;
4 y _8 \% h" [: r/ ` }
1 {& n% f% i1 T3 q4 g% _: \
u! t' K6 L; b( N3 P' v- M" } // make sure all interrupts are handled8 t: `2 G6 e/ g0 g q
intr_status = upp_reg_hdl->UPIER;0 E% t7 J1 [3 Q, v' V8 ^' ?
}6 {3 N" J, X9 v7 w) w
( ^# j. b" n# X! l$ M // finally: write 0 to EOI register0 _# m' Q6 }) T
upp_reg_hdl->UPEOI = 0;
- {4 a9 k7 }+ a return ret;8 M( Z$ e! G4 ^: B. s
}6 u4 Y1 G. U; T0 I. S
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):( h4 r- o ]7 c% v5 n& J* o) [) `
#define upp_dma_sendstartQI(x) {\: D2 P8 i& G% o
Wait_upp_SendReadyQI(x); \
. j3 a# |7 F" I upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
$ K. z7 i# n, z( d upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \/ o6 _9 F9 G2 j( h* o/ S0 ~
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\; e6 |, Q& C: I2 ?
}: h" @; }* H0 ^) w5 K" |# d7 ]+ @
& A. J3 P0 P6 e. I% O4 W/ a
( l. s! ?% Y3 G7 [$ L$ {#define upp_dma_sendstart() upp_dma_sendstartQI(I)
s* A& s- x' a" C: j; U+ U& H, Z5 A# D
]4 t; _' @8 j4 i2 |想知道uori错误是在什么情况下面出现的,好做出修改。
: z6 a9 M8 n9 j$ {
1 [( l* T v# Z* G
* w+ ?. m$ i+ I; Q' V+ `5 o0 I" e |
|