|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?& I* E" T, I) W' R( R
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:, b; [& V: F9 E1 E2 q
u32 UPP_Isr(). @7 h4 U/ L& I) }# @" s
{' Q/ X, y* k9 u" F, s5 [
Uint32 intr_status = upp_reg_hdl->UPIER;
0 P9 l8 F8 R: T4 `$ m upp_reg_hdl->UPIER = intr_status;//clear
+ t$ g! O: W. _% W1 [// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");8 M! B2 r* n$ N$ {: V" c6 H ?
u32 ret=0;
* N1 f( Y8 m5 A' Y7 B4 W$ C3 `) b) l: Q5 o
// inline functions
& V+ J" t$ Y* l0 o6 c while (intr_status != 0)
# H! s0 L& a/ s( E {1 r" a" T$ \% s6 b0 U+ O! f
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
' \! h3 m: k0 e. H- y. z; `/ X6 Y {
* [& }6 L7 O% @+ E// Log_print0(Diags_INFO,"eoli.\n");
( g1 i3 m. m# ]' X5 z1 P* v: C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
& T4 U0 |5 h% a; h2 Q8 r }
, w( q1 H0 i* C; E W: p8 b' R2 d0 p$ r/ y1 ^ d: P
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件$ \+ m0 u# @7 C+ r5 n. C% j" F& R' D
{" v: e3 p5 i4 Y* z) t
Log_print0(Diags_INFO,"eowi.\n");
' [( t+ X* U' `) A" | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
+ g: f( A. O) @- V upp_interrupt_count++;9 E2 M, S4 T& p' ^$ e1 w& t3 H& {3 L: e
upp_interrupt_eowi_count++;
- L8 V: h* }0 n% @( \4 ^: l* Q
4 w; a1 [4 A. G% V. L* Y#if UPP_DIR_QI==0
; f- F" P2 S7 R3 U upp_dma_receivestart();
1 K: n S- z1 I! I( @9 u ret=1;" s6 { a# P4 e
#endif# e$ u8 N, ?7 X0 o6 C5 ? l
}6 q) g3 Z6 \' _6 q5 `
) N6 N: T& W3 J( _
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
' }& s f/ Q& B* b, m4 v; B6 b {
' L/ r S K, f$ C' q! i Log_print0(Diags_INFO,"erri.\n"); b X% {" f$ Y9 J* L7 I
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
+ h9 ?- m. m) E) o0 Z2 b upp_error_count++;
6 S$ d4 o6 ^2 e/ S& e& B: q; ~ }; }- J* @' \- R4 P
$ r2 Q: N/ |9 L
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件/ `4 G0 v) W8 F0 Y. d
{2 I0 P/ S# t$ a9 g0 a
Log_print0(Diags_INFO,"uori.\n");1 e6 s: D- _% m! j& ^1 ]# r
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
& S3 M5 A: {) A. F& x6 h upp_error_count++;" @9 Q; Z$ F2 T, i
}
_* R9 R4 C. @9 L6 D' L/ L2 N7 G; x9 l! L9 v% Q+ J
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件* O$ E. P1 O1 r- V3 \* b3 M/ l4 D G3 ~; W
{3 Z! f& o6 x) A" e( x* P1 f" z
Log_print0(Diags_INFO,"dpei.\n");" }$ a& A+ x5 P! A! r1 J: n2 x! B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);5 }1 k* N! \+ p N' p
upp_error_count++; |1 S. l& S, A6 M# y" o
}* n. A9 Z# O. ^ G# x0 F1 a: `
_9 c! T5 i# J% x" j7 }4 B+ J% M/ z
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)8 A. r& k {6 ]2 p1 ]
{9 _% N! J' B6 }7 z2 s" \' n
// Log_print0(Diags_INFO,"eolq.\n");1 w9 Y, c1 J* l+ H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
7 U% l2 x' s, t8 I# R% d6 O }6 O) n( d9 ^. _0 a# y/ Q" p/ ^
9 N0 n# f$ `1 P: C2 F2 w if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)6 l7 L9 L( F5 `& v( W! R( h
{
& F: m! K, u. _! {# y// Log_print0(Diags_INFO,"eowq.\n");. b8 J+ l' |0 c' U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
6 U: C1 `$ l- i9 D0 H3 L. ], l4 v' V upp_interrupt_count++;
4 P) C4 [# t& j8 J#if UPP_DIR_QI==1
! R, I. X4 z8 H8 ] f9 l+ V upp_dma_receivestart();
7 m8 G! `* b6 `! x) W& o ret=1;
/ }: Y! p. B" b& a#endif
7 }! A: S% E+ I }
- J% t) ~; t- O. W8 y+ M1 E/ ~
3 V B2 ~1 q* N% T; K if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)4 \& u) e% n# H
{6 p8 e5 a# v8 y" S
Log_print0(Diags_INFO,"errq.\n");
; N w( V) H- _$ c! s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);0 h2 b: L) L: s" |7 q! Q5 N( s
upp_error_count++;! Z1 } Z2 A- P/ R' W2 W+ e/ Y# W' H: N
}
- h. t4 n8 v; q6 ]* D. k3 \9 |# z3 f+ @, a; H5 t" h
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
) ]7 `' U* W$ A' e {! H* a# w8 j k% r- N0 e9 c1 F# \
Log_print0(Diags_INFO,"uorq.\n");" \0 B$ J5 I! W3 `* L* Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);* w+ {+ f6 T; y6 }* R# v
upp_error_count++;; S) z9 x8 E7 [7 L6 {) Z. a
}7 ~+ f( _$ Q4 m4 u
4 ], @" ]2 |& }2 _' R1 F if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- i/ g* X3 ]- S9 a! w {
u' _; W- X' I6 E: [) Q Log_print0(Diags_INFO,"dpeq.\n");
- d: n& ]! w {1 ^4 W: L2 ^ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
% w! O; u' C" ]. _3 D% ^6 ~ upp_error_count++;# B/ T$ l7 q1 [" h
}
- ?. E# R, d6 l% a' F) l) t2 `5 v
! n" B. o- y( G) \0 c // make sure all interrupts are handled& }! f n2 P( L( j% ~/ R
intr_status = upp_reg_hdl->UPIER;
4 b/ h( O) m7 g8 M0 s$ V }
w5 C! E5 h( Z2 I: j' @7 R" p" }( D! M5 {7 a/ P
// finally: write 0 to EOI register& j5 Z! q& c% @
upp_reg_hdl->UPEOI = 0;7 ?- g5 R' o) z# u
return ret;
5 f# c- D& \% x; S$ \( w}7 O- P* L) p9 Y. Q: C3 m6 A
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):6 F6 s0 i& W, F. t5 j Z" B
#define upp_dma_sendstartQI(x) {\1 c. W! j% ^& ~5 W z
Wait_upp_SendReadyQI(x); \
y( H3 s+ Z/ b& u* g6 j o2 C upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
6 m6 b# h( t; B0 x+ |- q) Z upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
3 B- s* m: T B) Z upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
' R, Y* c( G( D- H" a }9 u% _/ O: D0 |0 s
: W4 j' \9 U& e% r6 c6 P
4 Q, H( a' F2 e% E& `3 s+ k
#define upp_dma_sendstart() upp_dma_sendstartQI(I)( e" }: a6 U: s3 m4 f, Y! c
8 z. w' N# y5 @" u
7 A) b( v! t Y- P
想知道uori错误是在什么情况下面出现的,好做出修改。, z0 [2 m5 C$ M
+ |0 I: ~/ o9 h
( _6 |( ~0 @& B4 M- D/ i$ I |
|