|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
- p, X; X2 i- P, q) Ndsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
2 l0 h9 T- g& Y) ` Uu32 UPP_Isr()
8 B V# c$ e$ o* F3 G8 E$ b- A5 l{
' Q; L* Z& o! V Uint32 intr_status = upp_reg_hdl->UPIER;
( S4 Q; N. g# d upp_reg_hdl->UPIER = intr_status;//clear
9 ~9 n: [" l3 g# B% ~// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
: Z# z; q4 S. A2 t: t* P; ^- K" { u32 ret=0;( ^& ~; v; ?9 {0 E! a& E
# g! Y5 F3 A0 c5 ?0 N! I& j5 \/ |5 V
// inline functions) i, Z: c( T( v# I8 u d& M6 Q
while (intr_status != 0)
& @# l1 B4 w6 r/ O {1 @+ y/ G: o% ~+ F' y4 D
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件2 Q& c' T* @& a( m& q- @0 T- P
{
. {0 O+ a# V6 M4 M; h1 y& w// Log_print0(Diags_INFO,"eoli.\n");- C) g: `% T/ G7 t. m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
& e8 g4 k$ i# y' X4 C9 z }
! Z" }5 p( r+ n# N3 q l; f% N9 [1 {- ^9 }6 c( @
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
3 C4 Q1 _' _5 F6 p6 f! X% { {
$ i: j2 K5 K& Y- A% f( E$ x; O8 v Log_print0(Diags_INFO,"eowi.\n");
- ~+ I W% F5 l# E3 l, V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);( S+ }- H# t6 J
upp_interrupt_count++;
8 O/ D4 u/ n* b: U. o% Y9 Q upp_interrupt_eowi_count++;5 \3 t# D! |/ ]( R" X0 C$ M
; p# M9 j' l) h1 g#if UPP_DIR_QI==0, d+ v" B# L; T. i6 `+ q4 P4 T
upp_dma_receivestart();9 e! s! K6 t0 t5 E- O* }
ret=1;
; W/ ~+ m! G7 S' n! C#endif
X |, m: C# }. k }( C( k2 c. ~/ H4 [6 k0 o( v
% {$ [" T$ x$ [. t' {2 {3 p0 s* l1 M if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件3 u5 s5 X, c }8 A$ F, ~
{
4 g8 j2 f L& U7 z0 ` Log_print0(Diags_INFO,"erri.\n");! A9 T( J/ C) }+ H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);: I# o0 f( g, A" E6 ]6 B
upp_error_count++;) P! p2 m) X* @7 F8 L' V
}
1 Y9 `( R% P2 L6 L7 w6 u
1 {0 P7 d; B! \$ J3 u% D6 f4 T2 ` if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
" g8 E+ H' S ]3 D) B {
6 d I4 n" S) H* ]; [ Log_print0(Diags_INFO,"uori.\n");
" e: Q; r: ]; z2 K8 ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
7 K: A) z; X: m5 [. M upp_error_count++;
f+ Z8 ?+ M+ }/ w R. D5 f }
; [; S. Q4 a/ [+ k( N# E5 x, u+ \% o$ C# w9 |9 ]8 d& X- k
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
1 f7 E5 B+ `9 M2 J% ?& A; L1 x3 g {8 u; R$ r. p( z7 z2 H3 U( I2 H, e
Log_print0(Diags_INFO,"dpei.\n");" g3 {% N( l! C: L7 v% Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);" C) L1 n } m& Q
upp_error_count++;1 [% w$ U, o% b& A& K* [9 j' R9 \& r
}
: h4 d5 k4 o2 R7 c L8 G
- Q. b$ n: f) E! q3 t0 K& U if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)1 ^8 S: y( [* S
{0 Y" E5 ~' C1 _ O$ q
// Log_print0(Diags_INFO,"eolq.\n");
3 y4 ?2 `& f6 p, L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);+ f, K5 U( C% y/ y; ~& E, T$ M- V# r
}" d% a9 \2 r4 l9 K
& c* g# y* P/ e9 T' a& { if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
y3 o( F6 `3 } {. m4 s' u: ?" @; D& x) {6 q$ E, Q
// Log_print0(Diags_INFO,"eowq.\n");
/ Z5 K* ^, t1 l% V. i2 [: ], G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
, x( `- j1 p) W: F upp_interrupt_count++;9 e6 s) d/ V+ o6 K
#if UPP_DIR_QI==1
# _* J# w+ ?1 z& z% m. t upp_dma_receivestart();
1 ~# \8 N2 m1 B' f ret=1;$ p+ H/ k& T4 g Q
#endif9 z' R( P% V3 u9 d
}2 s1 F3 C& N8 [2 Q
, o$ h1 G7 D t' P) P
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)& J% Q0 h: A6 J, l
{
2 l* ?1 J6 w! o Log_print0(Diags_INFO,"errq.\n");
' S+ v6 r6 D7 V) M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
! [2 z6 w. B; c' ~7 l upp_error_count++;
: S: z# s2 |0 i5 O4 @ }" S( {, Y5 O5 @4 D
+ v3 i0 D F! U0 K4 x6 T( w! N
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
/ E4 v& F$ S0 a) k {/ }- t. Y! z+ j% v! z# t, y
Log_print0(Diags_INFO,"uorq.\n");
- e4 i3 R2 \4 W% i6 o9 u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! \, _9 v& a, C& M upp_error_count++;8 L2 R& C7 x& n# o) i6 b! p( A5 O7 M( G
}- R: A) @8 S" Z( N" z/ ^
+ j" Q5 o* k6 u" K if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
' U6 {) \; ]4 S8 Y7 v {
3 J. L8 _3 I2 f3 u: d. j Log_print0(Diags_INFO,"dpeq.\n");
) S$ Q% O! v. e, P/ Y( l) X2 L) m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);; \* x+ L+ p4 |5 ~9 v
upp_error_count++;, M: z4 a" W$ E1 d; g3 e% A
}
6 ^/ @; k0 `( [% f- U2 p- p! ^" S" L8 w
& R: |8 Z: |, J% s$ H: s* P9 q // make sure all interrupts are handled
& S; D! d- l+ s8 ^ a% K intr_status = upp_reg_hdl->UPIER;
1 c5 h2 e$ {! q4 }$ B! m }
: m) ^) J: v2 _- E
3 g0 ?& [$ {4 y& z // finally: write 0 to EOI register
7 d: {' x/ P* a4 Q$ ~ upp_reg_hdl->UPEOI = 0;
/ ~- Z* W4 ^/ ]/ d return ret;
7 }& U# X' d( Y8 x3 L}' ^( ^9 Z W5 T- \( M
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):1 D" u+ Y7 N" t
#define upp_dma_sendstartQI(x) {\+ O( l) w* N2 h0 R2 @, u
Wait_upp_SendReadyQI(x); \
% m. ^3 S {1 \: |( n upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \7 H) r; f2 b/ X3 K
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
3 [( C- _5 R& i" b R upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
" G X# m4 y4 x4 Z8 N. z, [/ R }
+ j$ a8 w/ o" H. X9 {
$ r3 Z8 S0 S7 w9 v* g T" F9 I, V0 _# e5 i" } k$ g
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
! N6 S5 r8 v, E8 B% S$ e+ |2 z) I3 K1 ~1 T/ C5 p2 Y: q2 U2 o9 `
5 I) ^0 Q! B; w$ X7 D' ?6 b
想知道uori错误是在什么情况下面出现的,好做出修改。9 ~& s6 c( N0 U5 H# _
( t. r3 f& j( y7 F. s# T8 ?' m
: D$ y6 J5 q' Z" {/ U( I3 F- D |
|