|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
6 G; C& k7 t: I' I, udsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
. [0 H0 I$ [8 Y' @) C4 n7 ru32 UPP_Isr()
: K5 Q4 u) c. [! Y3 i{( r- p/ G* J7 \; E1 j
Uint32 intr_status = upp_reg_hdl->UPIER;1 s/ P3 D& j) g. w
upp_reg_hdl->UPIER = intr_status;//clear
- d' F; c/ J3 _" q: S' J$ P// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");8 |0 ^# i9 O7 q
u32 ret=0;5 ]- F4 b" d! F: ]: H
; g% Q/ F8 f5 J% L: B/ O // inline functions* x* V# K8 q9 w
while (intr_status != 0)
$ G0 {, ^6 Y2 \6 s {6 y2 f1 i5 }) v" m! E7 J6 Q3 o
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件/ b& q5 e" \$ a# b* E2 a
{
% I2 @; s; z1 w0 ]// Log_print0(Diags_INFO,"eoli.\n");
; A7 j8 y/ y; J f$ D- @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);0 [! V: ` ?6 o1 M
}
4 l7 K% g, I1 j% x, P% O) K" n: O5 r
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件 G2 }0 D' o2 d: P
{: \* S# _( X) s8 H: P1 d& \
Log_print0(Diags_INFO,"eowi.\n");
) i9 e6 n; t4 M2 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);6 Q% p l5 W8 J& f/ S
upp_interrupt_count++;
# l6 l4 _" M4 H! d" n upp_interrupt_eowi_count++;
$ H/ _3 K% {/ E1 D9 \* |; |2 W4 R+ G2 k
#if UPP_DIR_QI==0
# L9 G) r; ~ l! b, I- F3 F upp_dma_receivestart();6 t% u+ R1 X6 [' @6 l- Q8 H' _8 r
ret=1;
; O5 j+ g4 f; Y" o! o9 R#endif
4 M' Y4 y1 Z' a- R% h }
4 E: Y" d5 s' q: w& ~( s: }' r- J& G: V3 [
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件( ~+ }6 E- G) W# Z: j) l- A
{
1 |( _, B* o% e" D Log_print0(Diags_INFO,"erri.\n");: k5 w& S; @& d' B# h* P) d
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
- @; H' s3 d4 S& K7 A upp_error_count++;
7 h1 T& J" O8 U$ n( _ }
% g3 H3 j) D$ u5 b7 S6 E: v$ ^6 f, T/ B( x9 E
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
6 d. r D3 j3 Z8 K1 O9 i {* u( x J& x, K
Log_print0(Diags_INFO,"uori.\n");
0 w7 C$ J' f# ~2 Q+ W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
% ]' E7 k+ b3 X: N. }+ _! |4 p4 | upp_error_count++;
* ]; M# @, l) q, M- l }8 l' U2 _! G4 A# z" }
- J* U1 ?% s; L" l' d if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件( [. C- C# X z& n/ S- s# e
{
. H* S& J4 M* a( P" ^9 r0 p* L9 g Log_print0(Diags_INFO,"dpei.\n");
% x* R; n* S+ ? D2 e7 A# ]) ^0 u( ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
# T' j v* V% Z upp_error_count++;7 i8 F4 h5 n9 H k
}
) M* {9 n- j+ q" N) r8 d/ e* S. k4 [% A# S8 `" n8 _0 d
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
' G- b5 F, `& E. Y$ F7 r Y: a {8 z5 o# b4 G; x# }( z; A4 S
// Log_print0(Diags_INFO,"eolq.\n");* _: |. K b) d# _" B2 L+ z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
; U' j7 q/ P+ Z$ {4 } }5 k2 h! O; ?! f. n. I
: H+ ], }" y, h, ]
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
$ j$ }" c( a2 j {" a/ `5 ~2 h7 D6 L( w1 ^
// Log_print0(Diags_INFO,"eowq.\n");
4 X" N6 O; ?: f upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);0 p0 R- q5 x Y) f
upp_interrupt_count++;
e! l& i/ C% H; ~# ~2 C" U6 \#if UPP_DIR_QI==1
! n" c7 w& \% Q- f upp_dma_receivestart();: ~4 k' ?* j/ B! M+ S7 V
ret=1;
6 H7 U( \6 Y7 x H/ {5 @0 ]#endif2 F7 I, \/ \! {8 T0 K5 r* r
}2 U2 Y6 f: M' b- A
6 v) _1 a1 U/ y* H; I* b
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)6 i, E* {# ~$ n' o
{
/ {! ~: f1 G$ |2 u Log_print0(Diags_INFO,"errq.\n");
/ J' ^0 \& K2 s% |9 r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);# K" i% k2 | k9 t- a8 K X: Z
upp_error_count++;( K T( E5 \; N% l/ N
}
+ k+ L: ?% O% b* W* p
: N, y4 R2 X3 k if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
6 o9 q' G' E9 i' W4 Z6 A. a {
B8 k" {& P. w1 j0 ?1 { Log_print0(Diags_INFO,"uorq.\n");
2 G n- @% S. S) Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);& t- i% K) d! d4 D4 m0 k6 W& G) u) X6 w
upp_error_count++;
, d! w8 g, e+ f( |+ I8 w2 c }; V$ I& k% i! y5 @+ u a( {
* K/ g& \1 n1 |# H1 s1 g$ U9 h if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)$ k0 F* l/ ?+ H6 ^' s
{7 m. F, s% }8 ^- G
Log_print0(Diags_INFO,"dpeq.\n");
/ X. U5 L7 Y! j! D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
_: v+ _( u) G( W upp_error_count++;& ~6 [: p$ k$ v
}
* q% q3 N/ q! I; k, n: O- i6 p, K. y
N, z @! A8 T% E4 v- u // make sure all interrupts are handled
/ I2 ]; U0 v9 E intr_status = upp_reg_hdl->UPIER;
) P# M W5 h4 ]% m }
0 b# i0 v% A; R' c# o1 l
5 P. Y1 G! E0 k0 D // finally: write 0 to EOI register
5 D& Q# K, \7 ` upp_reg_hdl->UPEOI = 0;" {" s' j/ [7 k8 h1 y
return ret;' t) _/ I- @7 q6 o( t
} o! d+ @9 P6 C1 k% |; g0 S0 x% V
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):1 N( z0 E) o6 w( e
#define upp_dma_sendstartQI(x) {\+ {8 b0 l8 a, g Y4 Z( J# `1 v( ?
Wait_upp_SendReadyQI(x); \ y7 c7 D8 t W) s1 a6 U
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
/ V( |) \1 w1 W7 v* O6 h1 B upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
3 h2 w4 d7 |5 o: \: F upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\' L. [* ~# v: `* W$ Z, L: r
}
9 R6 l o" D. ]% p D( R) ?9 I, H# |& t6 `& O% ?# ~
4 f( G8 x, B! e y4 ^#define upp_dma_sendstart() upp_dma_sendstartQI(I)
6 B+ I- I& v a+ E
3 B# V& u" H. Y8 C2 x. _- p& n6 _0 t- ^9 x) D! X1 ^# c+ n, G
想知道uori错误是在什么情况下面出现的,好做出修改。( ~* @- ]# }8 T* m0 [
; q1 j" J. C, o1 N, L' D8 d# }* Z& p% E; W- c5 z/ S! g5 H
|
|