|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么? L% r. k2 L0 ~$ d% \$ d: c
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
1 K+ o( l8 N9 U9 i8 pu32 UPP_Isr()- f: g, B! I, H1 e% I
{
9 B% _% J" f) o/ e1 J Uint32 intr_status = upp_reg_hdl->UPIER;) S4 z8 J: G8 s$ c
upp_reg_hdl->UPIER = intr_status;//clear* h( d) J0 L% A3 i
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");/ h2 l; a4 X& Y& U, W: l9 q/ w8 x
u32 ret=0;/ n. O2 O. v1 o. q! m
3 a' ?" x9 H; \$ m$ W I
// inline functions
* b5 p/ `" `5 M( y# |8 C1 V' u- } while (intr_status != 0)
; ?3 t% o3 l" y2 H( F! ] {& r% S! Z: A+ R# h1 g* x
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
; P* A; Z9 ]( a' Z% F# L {
* G$ a& y1 z( B, s$ J* Q// Log_print0(Diags_INFO,"eoli.\n");. I$ e8 r( w s5 q& a; R7 L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
! Q7 ?& y7 ]4 V }& N$ R G6 v5 O
) P7 |3 ~( z- W/ d% r if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件* N3 n) M2 J) H Y
{9 l% |. D' j2 _2 ~; a+ ?$ L
Log_print0(Diags_INFO,"eowi.\n");7 W) R ^: z& f% W0 f7 i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);. j P- O, Z4 `' ^
upp_interrupt_count++;
* M7 s+ H3 z! h5 T upp_interrupt_eowi_count++;3 d# x H$ C$ L2 L( E+ Q7 D
, X! ~2 U' \- D H' ~" Z#if UPP_DIR_QI==0
* F5 W) @) p& E upp_dma_receivestart();0 @- Z5 c7 [* n; [3 f" O
ret=1;3 [# i. S3 N x) L( f& Y$ ?- C5 @
#endif
! Z, n- ? F7 Z$ Z6 ^ }& e! w/ c9 n8 j, [
+ q# n3 X$ c5 G! N8 m
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
! @. x% L- h! O* _) y- W! x% c {
) {8 u6 q; J: u! s1 G Log_print0(Diags_INFO,"erri.\n");! b5 b6 t4 `# T- a( t7 o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);3 c1 N: U# W5 w
upp_error_count++;
$ _# F* H7 y2 }* b) b9 G% G/ y }
8 F7 ~# Z0 o/ g; c5 _/ G+ g' d2 P* V; E7 {$ B$ k; g; b
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件" R b9 d* n- w' K* w
{1 o* S! B, U% T3 ]( ^ Q6 m
Log_print0(Diags_INFO,"uori.\n");
( g; U# T+ L# b- D. ~( ?8 l upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);# D }8 v* Q" `; B7 }
upp_error_count++;: r+ ~* ~ K3 f" D2 H
}
9 X) e& l: m X4 u0 r' I6 S
1 T! }7 h' R9 p; s4 `' p if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件! o/ L% K" P8 `; w5 z
{9 x, K- ?/ `; W
Log_print0(Diags_INFO,"dpei.\n");+ i$ l4 c' x' z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
$ q r% t( @: `0 P upp_error_count++;& o7 b. }# ]' s, C8 c
}+ P3 \" U( y9 M3 k% m- k+ y) U3 R
/ d3 E* d/ ~+ J
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
5 {; \& |& J/ K1 U0 j4 G {' b8 m6 [) e* J# m5 S
// Log_print0(Diags_INFO,"eolq.\n");
. W. X& L! ^% U upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);* t. J; g, Y0 y3 k& C. T
}8 `4 j3 I% J U; x. {! J
& ?7 H$ R4 l2 a
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
& K( N) i" t/ T4 Y6 p- {5 B* X {; |& f- Z' @9 R
// Log_print0(Diags_INFO,"eowq.\n");0 I% U& [7 l/ B- @* |& N- _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);, ~7 U0 C1 L( o& d, {0 z, \
upp_interrupt_count++;
% ]4 j2 ]1 T/ D0 Z" w8 a#if UPP_DIR_QI==1
3 E+ p6 w. {( S) N4 ]2 b# P5 I$ V upp_dma_receivestart();
% ?, X( b$ X$ d& I7 P ret=1;
) |' f. l N6 {9 v7 j#endif) A( w! |- \4 G) ?
}
7 R- ?6 u/ e' E- [0 s; J* r2 n: o2 s% M" Z; _
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
. t9 ]: ? {( @$ r; j! y y2 j: | {
/ C0 L& \1 ?3 f( Q% k# L) } Log_print0(Diags_INFO,"errq.\n");
4 R, N5 B+ n! p7 {9 \8 X; @0 h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);7 S# A, t( p& u# T+ a$ w
upp_error_count++;# c3 O; P' r9 `* Q2 f
}5 p' ]2 `) M' e! J4 T2 X' @
1 y. X* r# m! r" |- d if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
% ^* W) j* L; D1 |5 l3 k& z {) B# y5 @# z O' I; {2 q& U5 l
Log_print0(Diags_INFO,"uorq.\n");
: l! n- ^, [) |, e3 m9 [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);$ X! v( C( I0 a4 I3 O L; y
upp_error_count++;
: B/ T* Y0 a* J! L5 _7 z }
$ m* l- p4 J) c: v
. y Z0 Y7 Q7 ]0 H! \7 V if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)8 l: o4 v ~+ b; T
{& k+ w9 P6 W: u4 i
Log_print0(Diags_INFO,"dpeq.\n");- e0 Y& k4 N# _* X: ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
2 B3 ^1 I# W& x, y upp_error_count++;/ g# e! U/ Z# N" E
}
w* ^0 G( @* J( B6 M
7 L4 M+ \5 \' Z2 f8 v: e // make sure all interrupts are handled
& w4 m7 p9 i. m" Y3 }" r intr_status = upp_reg_hdl->UPIER; t+ ~" @7 [1 z* r0 b: {- f
}
4 F0 a$ x4 M9 |/ ?9 o3 r* B, T2 n, u4 x a1 x
// finally: write 0 to EOI register
; d9 q8 c% Z- o9 a% c% D* o upp_reg_hdl->UPEOI = 0;2 ?/ @" |; H: i: A' D1 X6 o
return ret;
% A% i/ q2 V6 x0 [) e8 O/ S}/ l6 J& Z+ f9 }/ |' l- Q' F6 a
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):; q8 C: h" c, M9 u) F6 F0 W
#define upp_dma_sendstartQI(x) {\. g' n' w+ O% b W A# R; I( r
Wait_upp_SendReadyQI(x); \
/ K* O; E; a! y5 V, S upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
& t9 Z7 z5 X" z upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \) E L! O1 q$ I3 i6 ^5 Z6 p
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\) r' u# H/ \+ s
}8 \4 a# n; T, j5 _: E
- _ l3 }$ L4 _$ Y# v6 U
! O* n0 `4 V! @9 S/ c# \3 d#define upp_dma_sendstart() upp_dma_sendstartQI(I)3 V! ]- O2 n% q0 Y2 Z2 Q$ P
1 U- V4 _" k7 p
$ k1 j* q. B/ k- q想知道uori错误是在什么情况下面出现的,好做出修改。& q% l* Q6 Y* n$ _$ ^# x1 ]% j
2 H7 S" b6 t {3 f. ^2 _3 t8 B
+ X) V9 \! q* |( C8 q |
|