|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
9 u6 f6 R8 [- N$ V3 Edsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:9 x1 V! L7 z2 g5 ~1 f `
u32 UPP_Isr()
* J$ ^* \* w" J/ |; k. k{
. g2 M9 L& p( S2 d% T; n$ c Uint32 intr_status = upp_reg_hdl->UPIER;
. c/ A! A; q$ K upp_reg_hdl->UPIER = intr_status;//clear
: `$ J" k4 A' @// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");; p8 Y+ B2 l% K6 a6 D' v
u32 ret=0;" @; Q" |0 d3 ?% ~$ ~ x
5 j7 g5 b3 g5 H$ K' z // inline functions
- `! i) v2 R5 s. _ while (intr_status != 0); @) h5 w: t5 d9 P
{
* Q! M' `6 k7 c: ]! } if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
6 N; p- b4 Q0 u2 O1 g- p# e {
1 a0 z, O. ^: t$ g* w' W% g// Log_print0(Diags_INFO,"eoli.\n");9 r. A% J" \! r& C
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);2 g! c% a) A; J: ~
}
7 k7 B Y- W( y, n5 Z! o
! E) B, i" @2 C N0 A! {; }# | if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件" p% s9 T8 P- x7 d: p
{: K$ g e7 j# W4 Y
Log_print0(Diags_INFO,"eowi.\n");
1 q' f$ @& b; V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);0 Z# a# P' T) {5 L- k
upp_interrupt_count++;
) M; v. ]' l9 R' O5 [ upp_interrupt_eowi_count++;6 ~) X7 E- p) O- u5 ]) c; n8 G
" C% F3 @4 x, F4 x) z2 n" r
#if UPP_DIR_QI==0& Q2 y! C! B# u7 t
upp_dma_receivestart();
2 y7 h4 W* \. e# G8 E& e ret=1;) g: n5 g# _# C( t
#endif5 |: p' _6 L9 q
}
% j$ ~2 t$ |0 A6 K# B. \" \% t
/ \) I; z) t) x( P: }, N2 D if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件$ \( u0 }" m; E" P7 O* m
{+ s9 A& E: b. i# u( e- R2 x
Log_print0(Diags_INFO,"erri.\n");$ u9 Q1 a5 {3 f9 B9 g2 v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
4 o0 A% A. B3 i upp_error_count++;9 n* a' Y/ a* j$ p4 q% q1 m6 \! p
}
3 J9 w9 t( S; M$ i) h5 J2 A7 A& K* ^8 ^7 m4 k( _0 T
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 D1 x6 N# n5 l6 d. o
{
" E5 Q; L0 m0 ], E- n, k9 M2 s Log_print0(Diags_INFO,"uori.\n");
$ m y1 H2 Z1 I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);# @6 e- I& C+ P3 w+ n; ?! j
upp_error_count++;
) s- n, B& ]. b8 j# I4 z' e }
# H$ K$ w. l& ]2 A- g) r/ S5 o5 T* L, S% ? |8 w9 A
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件& Z5 P! i5 E; g; W, n
{* |! B0 [; U4 v8 v" V
Log_print0(Diags_INFO,"dpei.\n");$ E& ^& a5 @# X2 A# x% f* V& o$ i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);4 A( X7 M" |9 p
upp_error_count++;
4 k) Z9 D+ H" q7 K9 V }$ Y8 { k+ m# H8 Z$ k& ]3 Z
' l6 T( }& H7 M/ v( b2 ^: b if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
6 l/ X' C/ b3 @+ V2 C8 Z6 u: J4 H {
! D& E$ Y. E0 @// Log_print0(Diags_INFO,"eolq.\n");9 g& W7 u% p6 V h1 z$ T7 Z! U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
6 y- ]* }/ v- W% G8 M3 T }
2 h8 ^7 ^+ j7 V- h" ^/ z Q+ Y9 ^1 _* l" ^
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)& G) i0 e8 i; b* O
{0 n7 u: f, S: f& C: I g
// Log_print0(Diags_INFO,"eowq.\n");* E3 F7 ^& ]7 z; q0 A* j2 V& F% g
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);! _3 h: X0 g0 F% \5 z
upp_interrupt_count++;
* ?* Q+ c7 `/ v% \#if UPP_DIR_QI==1" T1 |; N& l! Z- M; y
upp_dma_receivestart();5 A! ]8 g& L' a6 C4 N7 u& u
ret=1;( h, a# f3 ~1 B; T
#endif
; H& r+ Z5 h5 u/ n }
' N) T. B" \9 X# l) }4 m- l( f, o7 _& g
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
, O( g% K6 S' P! ^ {0 ?* | f$ Q3 G' _1 o, X
Log_print0(Diags_INFO,"errq.\n");
+ ?& l& K% h1 w! Q T0 E3 ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
( t e1 Z# R+ N6 e( Y; A upp_error_count++;8 C% ]6 R) D& B+ G$ W9 Z
}! ?% m0 K5 S3 h, G7 I& l
, P$ H; \1 v$ _" w( B2 j6 T if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
$ O) k, X! X0 ]; I/ b/ f {% `; |6 J* u' S5 R
Log_print0(Diags_INFO,"uorq.\n");; j, p: a; {( T5 B/ ?$ u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
' l G6 h$ R U+ c& F upp_error_count++;3 i1 @- n( E/ r% q, [, H: o
}
: n @6 J! L9 p' S5 U' E4 f
9 Q& P4 O5 S% I3 G) @ if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
5 N8 L4 ]5 ?1 @# v {1 V- n+ {( @' I1 h+ O. |; y
Log_print0(Diags_INFO,"dpeq.\n");, |9 d) T, m% Z8 ]0 S8 P) {
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
" {: }1 v3 s+ H, K5 Y: Z' }0 d upp_error_count++;
8 f9 {4 T! `! P& }8 E }4 ]& @+ O: M: @4 ]3 H
: F/ l: J( _" z4 T1 w/ N
// make sure all interrupts are handled
8 q. j) J$ e+ k intr_status = upp_reg_hdl->UPIER;
; e% Z6 A, e" c$ b. s1 ~; q }
2 }9 P$ k: A B# Z; h* Y' y0 N4 z& W* h( ]& `+ }. i
// finally: write 0 to EOI register( n7 j2 Z. G0 q7 u% [
upp_reg_hdl->UPEOI = 0;
. Q: Z8 e9 Z. G4 G C3 H return ret;; b4 C. L) C' Y& Z
}
( n: C$ b6 L9 S2 a7 d, bdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
2 O" R/ ]5 G; @7 q9 L+ w#define upp_dma_sendstartQI(x) {\
6 t1 I5 L5 m: w7 f Wait_upp_SendReadyQI(x); \% n/ L2 j3 { F+ ]+ x0 |) q5 f
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
8 }; Z6 j3 e& M, H6 ` e; q upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \" @$ _% k1 @+ A, y
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
2 I X; ]) Y, U0 B9 { }) Z, u/ n" O4 C& H1 P. q/ H7 n' x
- f$ t! ^: B. n4 s$ N% z- x. `$ E3 o
; l# @. b$ F7 g; |#define upp_dma_sendstart() upp_dma_sendstartQI(I)
$ v, f# `) Z c. `; b4 Y4 l1 J- f! S0 [: [5 U! _
1 ]+ i5 _8 a5 Y' M% a9 i想知道uori错误是在什么情况下面出现的,好做出修改。
+ ]2 W( ?5 k+ {- S6 k3 m7 t) s* F# L( Q0 V+ y- ` @- R
5 R7 I4 e' z0 A2 Z( R |
|