|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
# P0 i, D$ v: J; ~dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:; \; \# T% q) Z+ [& X/ y" w
u32 UPP_Isr()8 d/ z4 [! e) O
{. b) t% r9 Y- R* Y
Uint32 intr_status = upp_reg_hdl->UPIER;5 r/ H- _: S- u% p" Q! |
upp_reg_hdl->UPIER = intr_status;//clear
( ?& w7 a3 Q" H/ y2 B8 ~7 }3 j% L @// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");- P5 [0 x! x( u$ B( P5 \, C
u32 ret=0;3 B; `: E& {& W& O- N" q3 {$ A
1 H3 ?0 T* A# J2 R# I // inline functions% _: I# ]: M3 s6 g- Z! }
while (intr_status != 0)
% X8 r( z1 d" R; ~% t {% C4 N- i) |+ {* ]# o. V
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
( x) i: R6 W" g; g, S* o- A0 p {) {- [7 }- O4 h& ]; Y* h
// Log_print0(Diags_INFO,"eoli.\n");
! V' t. \4 V0 X4 W' @ ^7 p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);$ _* ^/ D0 }. [
}
$ D- A! n. B: N8 |) E1 }1 R, x8 Y" s' R$ D
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件9 q" s8 ~9 [1 t p2 `
{
, D+ }/ G5 ?3 R' R& s Log_print0(Diags_INFO,"eowi.\n");+ a9 N$ {6 K. O8 r7 _2 c
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);( Z7 |7 \: }& P8 l# w
upp_interrupt_count++; @. ]* S0 ~# o3 m8 Y
upp_interrupt_eowi_count++;
/ y: M8 T. b0 ^+ B) b6 [+ N4 ?2 j8 d4 Y, d5 \, m
#if UPP_DIR_QI==0; x) E( L4 L) ?) }" ]7 l
upp_dma_receivestart();
% H/ a- k& X6 A# O0 A. [6 M7 u ret=1;- e- c, P) @4 O; G T- ?7 ~) O
#endif
8 c" g. _; e+ y+ F2 e( \+ Y }
! y ]( l1 q( D$ X8 P: R3 {; F! z S' C+ Y5 Z* Q {& A
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件, i. Q+ _* h0 ]4 X
{6 q+ s$ }% k, g" W& m( U. B: q
Log_print0(Diags_INFO,"erri.\n");$ V {* F6 t/ q- E9 Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
% w, ]6 B0 d% y( u8 [ upp_error_count++;
, q2 |0 ?3 V# ]* S" C0 H: f( ? }, V- e# Q1 M4 g% V6 j
" {' h; w& I/ x, Q3 w1 F/ t2 d if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件0 W) E: w$ K6 S& `4 j/ H3 x* D) ?
{7 E- t# n! I' K9 ]9 I% H
Log_print0(Diags_INFO,"uori.\n");
$ _0 T$ V- n8 E; y8 {9 G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);9 Q; |+ t$ i+ P; z2 t/ K l
upp_error_count++;& C. t% x3 J/ I& U+ G
}# I: S% }6 [0 D! n3 e. K% z
$ P& i( y4 p/ h t8 {4 }) @( b- l if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件* C- J& a( E2 {' c1 f$ @
{5 U; s' E) T( @, r1 @
Log_print0(Diags_INFO,"dpei.\n");9 G8 O9 e! i p! X4 h7 N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);( `5 T8 X. L* M& X% }7 J
upp_error_count++;
, N8 ]) }8 _# P, V) N }
s0 n! U7 v+ {) e
( K0 Y; k9 H% n* r' r if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)+ b! x( K, ^3 t# x6 L
{
4 {4 F/ @: j3 b! h2 {$ I// Log_print0(Diags_INFO,"eolq.\n");
- l8 f( \7 B G' ~2 m- @/ z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);* n4 o- z/ p h" t
}# Y) H% V% t* T; v
) L8 C" C* M* i
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
4 c' l7 d9 V* R2 h* Y {
6 w1 c: S/ k" M1 [ s5 y// Log_print0(Diags_INFO,"eowq.\n");8 F {& Y0 E$ h# S, ]# z/ e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
- z/ G+ Y9 @( L* l( O upp_interrupt_count++;
. w* i! N4 l: _% u! g: _* S9 Y#if UPP_DIR_QI==1+ f) S4 n" t( A1 c# E/ O* K
upp_dma_receivestart();, p0 Q1 H7 F# P" d6 y! N$ u
ret=1;9 Q, H9 J5 _2 q, }+ j3 t1 C
#endif
1 K( A( W0 z* h# W }5 B- B% k1 c# q ]# I7 {/ q
" s3 S H9 F7 b5 A' a8 ]
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK) \+ u5 i; i- [. [
{7 \5 V; d; K* P, d' h
Log_print0(Diags_INFO,"errq.\n");; J; q- i& N/ ]% X) F+ Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);3 b) Z: v$ r& g8 D: P
upp_error_count++;
( W- b- u$ s0 _ }
8 h. [) \6 C1 T, E1 T1 |+ S+ W! ?: k7 _/ ^% v6 @4 Q
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)+ {" ?5 ]+ r4 h
{# k. U& _1 O; t& D
Log_print0(Diags_INFO,"uorq.\n");. H$ E' L @$ Q( h6 j: h c5 ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
$ [% l5 e. ?2 \$ H2 S upp_error_count++;7 Q# A/ a9 X, V" p/ W7 k
}2 f' v7 Z, U* ^+ ?* `5 u, }/ d
# b+ @$ U2 a: _+ v9 L
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)( x4 E. H& j9 b7 w( v% t; p$ r
{/ y' u0 n" M% X8 i* T" I" ?9 G+ A
Log_print0(Diags_INFO,"dpeq.\n");6 m: {/ |' @7 Q" z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);5 J5 F& q/ e K" R
upp_error_count++;" D% m; s; [+ R/ }2 _6 ?. }
}
( T& i9 i, B O6 d4 [/ f8 {+ s) A6 b# \( K) c9 L
// make sure all interrupts are handled q" ?+ a4 }/ N( H
intr_status = upp_reg_hdl->UPIER;! L" q' ]( d/ W$ V( x a: R
}
3 n$ W( j+ T- h# g* k! J; H7 S+ I9 f7 a8 _- Y% ~# }3 r- U' G
// finally: write 0 to EOI register
; l' i: G6 w# Z2 Q* J2 j upp_reg_hdl->UPEOI = 0;3 z1 {9 C. H- C# x
return ret;1 w) v0 N% p6 i6 L% h
}. \, x7 @+ h* A/ Z
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
1 h3 e! D: B2 Y8 g ~0 h7 m1 l#define upp_dma_sendstartQI(x) {\+ c0 D" y& x) w0 U
Wait_upp_SendReadyQI(x); \
& U$ W3 b! k) c4 p1 p upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \ G1 W! F8 q6 o4 g& C4 |
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
# z( U T1 f; n! i3 F! y upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
: j' i6 v! V, H; T( R3 s }
8 p5 l/ K' a! j. X7 a# @. h# a& ], [& K$ E# M
' u( M% ?: o6 w- ~; _! h) J
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
/ c7 V- s" [: K2 t% n: C( F+ R
9 z9 F e0 P' O. N1 N# Z
Z y* R9 U4 Y) |想知道uori错误是在什么情况下面出现的,好做出修改。
( F: h8 d8 \: [( h5 \& Z) Q: }: V: ]+ {9 U4 P" b
$ b1 z! Y( o3 s4 k# d( I, J4 f! O |
|