|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?( U+ N( c; I5 X( I: y
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
6 v; O: A' N8 W# }* J6 @5 Y2 Cu32 UPP_Isr(). K7 z# H9 l- y' D1 n# S
{! M2 q. ]; X$ r* ^" v2 n" a
Uint32 intr_status = upp_reg_hdl->UPIER;
/ q* p, {5 F0 {1 R( z upp_reg_hdl->UPIER = intr_status;//clear
* i1 r9 h$ c3 @! Y& z// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
- t( _6 Q: N& l, g$ z, O u32 ret=0;
/ K$ `2 {8 h" N" ?. D7 C
1 D& c9 S4 S, }; M. ^' ] // inline functions
0 n" n1 {' |7 f" i while (intr_status != 0). P4 o. o+ }0 |5 `$ X$ ?" o4 n
{' e- e1 G7 d; g+ U- r% j
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
8 `/ c5 L0 `% n+ U& k B {
# ^6 k; ]8 T+ R0 v Z3 ~// Log_print0(Diags_INFO,"eoli.\n");' W' g; O# u) m$ Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
6 W& `" n9 z6 G }
! B8 v; ^6 o4 o
7 t2 W# l% H7 m* P0 u1 D# n& {' | if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件2 L( X7 A& | \
{
* l9 o- Q5 p# D7 F {2 ? Log_print0(Diags_INFO,"eowi.\n");% S9 b. O6 a7 b5 o( _) g0 A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
5 {1 N' _9 `" D9 e: L& D- J! ? upp_interrupt_count++;
' V6 X8 z' S% ~4 P) G {4 }. C( N upp_interrupt_eowi_count++;4 C# ^& W$ S* F; z
" }7 j( s9 c: M# Y& `3 v#if UPP_DIR_QI==0
1 M d- l4 U, X2 d4 E upp_dma_receivestart();7 K4 |; B4 c0 x- T2 g1 ~
ret=1;7 w3 V1 o+ r: h; o( y
#endif
$ Y ~8 z7 B O }
, q# A+ e" T% A- j) H5 s* N2 e+ S1 w/ N- H8 i
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件0 g! |* G! C* r ^: T6 P
{
$ j- q4 |7 D" O3 N7 I Log_print0(Diags_INFO,"erri.\n");5 w7 d2 b* d# a H, K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);3 v' v( A7 h" Q9 G+ d1 g; A1 h
upp_error_count++;
1 g6 O# ]- ~& u# L( W& T ~$ l2 X }
; c1 H( h. `' U6 `0 p- P3 P/ R; b& j, g9 }
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
5 t1 c7 O% F) O! ?- s" }/ } {
; q" _% c) Z2 ^ Log_print0(Diags_INFO,"uori.\n");3 m, |: q: [$ ]5 T4 r7 M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
/ N$ ]* G3 n9 x. o& e upp_error_count++;) C. F2 k# I5 m& F
}
$ }1 j5 o+ G# Q# u* l: C7 F4 f; a6 ]7 q! D* M
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件0 ~. k+ a5 m( r2 Q7 W @& f' [7 ]
{) \8 `$ L9 j9 a D* `2 \) w
Log_print0(Diags_INFO,"dpei.\n");: j( z* j' u. }" T! |# X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
; J$ u* O3 _; F- _9 h upp_error_count++;
* s) m1 y; ]# M- o$ g; } }3 W4 p3 ]" \: m% q+ C) y+ Y
/ r; U# t' O1 B if (intr_status & CSL_UPP_UPISR_EOLQ_MASK) e) Z B( G" |0 a( V
{7 M9 x+ P8 e; A
// Log_print0(Diags_INFO,"eolq.\n");
" e3 [. p0 N! K; u2 I5 F; ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK); e9 U k4 z: K, Q* a- x
}/ v! ?2 b6 B2 t7 e; C! L
* g0 A/ f! v" v6 \8 H: q5 e
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)+ B4 D3 \9 h9 q4 p1 I. o7 b
{/ f0 s% I& A9 w2 s* }- D# \
// Log_print0(Diags_INFO,"eowq.\n");
( y0 N) E+ O/ W( C0 Q& @. z: b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
# h: M S/ p; n1 W% E- K6 x upp_interrupt_count++;
+ F9 z3 r$ [; | R, ]% F#if UPP_DIR_QI==1& ?8 K; W2 `& P, g# L5 f- U4 Y) d+ R
upp_dma_receivestart();
. v0 w# w/ P& ]3 Y2 m* Z6 Y ret=1;( |! J- ^5 Q! b" `
#endif
8 d! t) _6 D3 C; T) |2 f4 I }
% G0 r9 f7 U9 g, | f+ ?/ A
8 W9 H/ j y- j+ o1 F% k if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)8 d! h. _* o: B f
{6 S$ v* N3 p7 z5 y
Log_print0(Diags_INFO,"errq.\n");, ~' p. h" m. P9 ^) c( C
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);% R" @' p# j O. H; B7 U
upp_error_count++;
( b$ ]* U- b/ A2 T6 n3 x }3 t9 i! a3 q. M3 |: m5 n# }! n
* K7 P" f9 r# u7 C/ \( V
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
4 ]3 z: H5 ^1 V. ^ z! Z {9 S1 k& [6 Q& f8 h2 d- T& F( P
Log_print0(Diags_INFO,"uorq.\n");
5 @4 B* j9 U6 Q. z5 p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);% @' I+ k, {) p. W X
upp_error_count++;% A+ e/ s' E' I; ]2 j2 F% m% _
}
) |9 A7 D. u' O: p: v- }0 c: E% v1 d5 ^. v
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
6 }: j. i: Z: J5 H4 D# ] {
4 Q; w" \; V" [0 h# R) Y/ L Log_print0(Diags_INFO,"dpeq.\n");- w: H' ^5 w+ b6 ^) v; D
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);' y5 D! j5 C( L6 p4 m1 F l% J
upp_error_count++;
& L+ M8 Z, q7 I0 D- f& G1 n" Y }
# w0 U2 f: f7 F: Y% M! f1 F6 ]# \( S1 D. C
// make sure all interrupts are handled
3 F: s s- Y. q intr_status = upp_reg_hdl->UPIER;; s6 J* U: @; h6 R' g
}
7 `! Z, V% j! Q( Y& {% e+ G) F, }! x. d0 Z6 Q
// finally: write 0 to EOI register
" K9 ?+ E5 B$ J2 c upp_reg_hdl->UPEOI = 0;" I& _+ {% w1 C. y) M" f1 m; H7 l, m( u
return ret;9 z) f. \: {3 k5 I# r
}
% n- _3 _) f( j% a. B3 |dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
$ Z* N& z6 F% o4 e* e0 |- ]( i#define upp_dma_sendstartQI(x) {\
) `* {. F8 @4 { Wait_upp_SendReadyQI(x); \7 C! i k2 }' v5 B
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
' h: i# @8 P/ x+ C- Q' Z upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
3 D4 X' Q; x7 |8 I6 j upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
/ b" T2 c V* K# e4 h }, F* A& V1 ]( q4 E
# [, K/ [ A5 E s
$ V# f9 ? \3 {: R7 Y4 x#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 z+ O" C9 v9 T% v$ B0 n: H5 b: A! J! A2 {
. `) Q& S. X5 X! B6 d$ n* L. H1 u
想知道uori错误是在什么情况下面出现的,好做出修改。
/ h( C+ @1 R+ d9 W# Z( b9 F
6 z, [* v' \- \- {
6 {% M! F( Q( d1 n* n3 W. _" t |
|