|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
0 \2 _5 t: _( wdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
: D7 t. y* V. S3 Au32 UPP_Isr()
- g0 Z7 f! i! a( f8 V/ ^* x{
1 c8 |9 A6 k# |6 `; r Uint32 intr_status = upp_reg_hdl->UPIER;+ U" {! _3 ~, M' C; A/ g
upp_reg_hdl->UPIER = intr_status;//clear3 u+ M1 v# O6 |$ ~5 Q3 I
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");7 x' j! e, C, X3 {: V( O* m! t
u32 ret=0;3 b6 G: k" E/ Q( K
l/ Z; N2 ^7 y' {& E F
// inline functions# F) H4 g& v" c {' X6 W
while (intr_status != 0)
: V2 U I! }$ `( k1 H: K& \ {
0 Z+ S5 ~ r( _ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
! c( p, N5 W/ X7 L( b. } {; S' V0 r7 X5 t
// Log_print0(Diags_INFO,"eoli.\n");3 Z# t# d7 G0 o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
4 u4 k! e" x# q* M( q }: F5 X; E* [/ }. x# z) H! f' W
! A2 W; B w, P+ p. }/ }( C if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件7 m- v$ W: J/ }6 l+ M; J. `9 X) z5 I
{( @+ ~0 P5 G! i
Log_print0(Diags_INFO,"eowi.\n");2 X' b3 f0 m5 q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);3 Y% u9 R" k- P& o$ B
upp_interrupt_count++;) T+ ^" L5 n, G; r
upp_interrupt_eowi_count++;9 ?# r3 ?1 t% w( I" y: p
- q* t0 h7 h% x' d1 S#if UPP_DIR_QI==0+ _; h8 [2 v C0 C; Q, S6 |1 ]' S
upp_dma_receivestart();! c) O/ L0 f" w' ^0 s6 t# k$ u/ G6 [
ret=1;) C9 M ]& }8 o# ^3 G- L
#endif
" d$ N# t3 Q+ Z% r }3 c+ h# w4 V8 j3 a
1 S' M7 W& k1 v" H if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件5 M' \ { f, _9 m- g. E; O
{
& f; [2 T% X2 f& Y Log_print0(Diags_INFO,"erri.\n");% f5 U/ U# o2 p/ O. }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);+ u9 L8 g% _0 J, c- S9 {9 k4 K4 c
upp_error_count++;
5 R! ?5 \) i g# w" R7 q }
, w0 e5 Q$ c+ R) e1 e! m
5 t |; K' c y9 } if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件4 q+ o7 p! J9 o& l p, W k) |# n
{
) h0 g/ J }. C# J% i; { Log_print0(Diags_INFO,"uori.\n");
- e6 q n7 B0 C2 v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
9 }9 _2 S6 r y upp_error_count++; q7 Z7 V$ k! X, W) C' h3 v
}
% X- T# ?; |+ k7 h! N0 u0 e3 v
- }9 Z2 \9 `4 f4 U3 { Q if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
' s; c. e5 T) T {
# E, S) g3 g- U- \ Log_print0(Diags_INFO,"dpei.\n");
2 @5 ^ a2 V+ s" U* H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);2 x; a4 @8 y6 Y! D) h4 h" n( m1 L+ }
upp_error_count++;: t% @ n% E1 N3 d W6 |
}; N1 W8 f' t& o/ V! i/ L
' x0 Y G: z7 s
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
1 V1 c8 z" r6 }/ o# F2 p+ ?3 e {
8 J. v( a8 \* W" Y# w// Log_print0(Diags_INFO,"eolq.\n");$ d2 O1 ~* e( X: T4 R& d" k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
" i @: h" I1 h0 W9 } \6 } }, a9 G$ L7 A1 u6 y3 B
* J0 o) R8 S, @ if (intr_status & CSL_UPP_UPISR_EOWQ_MASK), \2 R+ V0 C4 ^; \2 m& {( z
{
& d% D7 F$ v# r7 r% f+ Q# A9 |// Log_print0(Diags_INFO,"eowq.\n");
% Z& j: o% q8 h) w( s$ b' j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);4 l) A7 O0 `! m# v# y
upp_interrupt_count++;
m3 m- o, Z5 k9 M( g9 T7 K1 C#if UPP_DIR_QI==1
t( G8 ^ L0 x& q upp_dma_receivestart();& A/ n) G/ [) T
ret=1;8 `7 [- A3 |+ s; j
#endif
) B- @% y4 f; J2 |3 r3 v }/ [3 y! ]8 {, k- B4 Z- }
* w$ g$ `7 J9 M# g9 d# a if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
( p# O+ L/ E/ a {: _# ^1 `# v5 J% J
Log_print0(Diags_INFO,"errq.\n");
& A; |4 w" K( i) L# Y& `/ }$ S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);. k( ]6 r& O$ A8 b8 O. L* A( ?
upp_error_count++;
; W' `# k% r' q/ X7 ^8 G+ N8 Q }
) S5 O/ a% v" X4 G7 e7 r6 m
, z( j( f6 [" f& k5 [ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)2 m- B% l o9 L& X
{' U8 x, t L; E: H! _
Log_print0(Diags_INFO,"uorq.\n");$ X# \) d4 N C) R% i c: S) f. ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);: ^ b& {) q- T6 y( S
upp_error_count++;0 w. I+ Q. a1 }' x
}
6 j/ T/ p( {; |- ^( L$ r1 Z# N- P3 M3 g& z: c- ^+ z! t& y
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)4 x# }+ [4 ]- M7 s. b4 ~3 |0 ~
{% k, G8 m Q+ Z6 n! x' ?$ F! i6 |
Log_print0(Diags_INFO,"dpeq.\n");
; }5 [6 U: ]* C) E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);" D: ^4 U; B- _: w- F% x0 F
upp_error_count++;) e" I4 K% p1 O+ `: J! h5 s
}
( x" D" |+ s; s( q
/ W% B; U* m( I, f: R* | // make sure all interrupts are handled
, e( Q3 a2 ?! C* D# _0 | intr_status = upp_reg_hdl->UPIER;
1 {/ L I. z" i& |' k7 m- b" W5 w }
' Y, n) ?4 n) o) E4 H
1 q- @4 R& B t( ?2 T$ }3 R // finally: write 0 to EOI register
) H1 r& o7 T( }+ q upp_reg_hdl->UPEOI = 0;
: S5 j$ L+ p% m return ret;
/ G+ ~# \# n* K}
2 v) ?3 }9 t. Odsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):7 A' P+ S5 b! T3 [9 O
#define upp_dma_sendstartQI(x) {\$ f! r/ k6 E* d8 I. {
Wait_upp_SendReadyQI(x); \8 ]* p( T8 o6 b6 a8 H3 y
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \# w8 ~% M7 S5 F4 U
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \1 Q" B9 ^ T+ b3 P9 Y" `% h
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\% W, B4 P' j4 r" [3 }8 @4 N, q
}
; @" t& e! m/ `) E1 P/ c5 b( x8 t; `9 L/ Q6 q
: h! C% ^; G) ]1 {+ R# p+ }5 k
#define upp_dma_sendstart() upp_dma_sendstartQI(I)( z+ j8 Y8 k0 q7 ]6 s" b0 ^# v
/ Y* K) y$ }# O7 V
# ~5 L) W2 s5 o' R想知道uori错误是在什么情况下面出现的,好做出修改。$ |) Z1 [3 P! G- | ^
, b. s& Y, `' @ t, n! y9 O
9 |8 J: U! m$ f6 J1 F- Y7 } |
|