|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?- {, p1 ?1 }9 V' R% t* S. o- ^
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:0 y) ]. ~( r; }0 X: W# k. E
u32 UPP_Isr()1 d' y. ~* _: ]3 n/ v
{5 c, T! `3 p+ H# Q
Uint32 intr_status = upp_reg_hdl->UPIER;
+ V1 [# E: ]9 [, h# F" f upp_reg_hdl->UPIER = intr_status;//clear P7 _/ s/ M) @$ u4 p# S
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");7 A! Y5 {7 s2 C
u32 ret=0;
& _8 E( |9 s2 R3 N
0 J4 m) A. l( |% q4 \ // inline functions
. E3 L L4 B( Q; | while (intr_status != 0)
* |: F: Y* R. \5 J" k- t {; _, K x. ?& X; z, I* y
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
* F) d' G4 h& H( C {
$ X3 v2 N& l) @' N; k3 p U1 A// Log_print0(Diags_INFO,"eoli.\n");
0 Z, n- P3 N" [1 f: K4 u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
( w& _( ?) h3 Q0 I; S }
5 z$ g- w5 c8 y+ z
# s$ O3 j* g" ?8 \ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
. o( O% u3 g* D {4 R1 G- z1 e2 F- k8 F3 @9 Y0 H
Log_print0(Diags_INFO,"eowi.\n");
% k5 M4 |+ Y8 K. N6 k m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);$ u1 M9 T- `% ?/ P: u2 d
upp_interrupt_count++;
! z9 C4 f* k' v1 x$ x upp_interrupt_eowi_count++;' J) Z1 a# R1 V6 H+ _& f' X7 Z
' w$ i$ j% _8 {) D& W
#if UPP_DIR_QI==0
# b' r" i% g+ D) W. X upp_dma_receivestart();
3 f$ `/ P4 ]+ S4 L ret=1;
+ ]3 V8 E& X1 K. n$ v#endif4 |+ \! H- C3 ^$ a5 V
}. x& ]2 K. h7 h5 l9 Y6 x
% b7 P! A0 @0 T, f" f3 V if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
1 ~! c# i+ j/ d6 P- G) c {
- L/ n7 f2 b# B Log_print0(Diags_INFO,"erri.\n");
# M3 U3 T$ m2 o, X4 r- Y5 Y: X* w, ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
! X0 b4 T$ ~+ m# ]* i, W upp_error_count++;
8 W( T2 x) B8 }8 O+ W }
F- \( ^1 K9 e2 I7 d0 L- C; } j, _+ Q
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
6 I; E. t' z* H) X2 q, X- U" r {
4 a( v# s) |3 b3 u; t Log_print0(Diags_INFO,"uori.\n");
. }" p+ l' F$ r8 ]/ B V# [6 L) e" P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
4 B f1 O+ _ Q, Y' H3 D9 i+ \4 m upp_error_count++;# V5 Q; M4 f' ~5 n! z7 n2 W
}- A- X; n: K; E+ q1 o3 I
$ m; f" Z6 {# B# ~: c& h( n if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件5 `3 R, r2 N$ w; U4 z
{
. U* Y8 p; G4 K: H% h$ ?5 d# y Log_print0(Diags_INFO,"dpei.\n");
; x: K# Z9 {9 R) G. [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);5 N; M! R7 h- Z2 r# j
upp_error_count++;
5 \' f# h5 }) u b; v }
5 z! b, [+ y- d; |5 A; L# O1 I K7 Y! q- J
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
3 Q* X1 ]* r$ x! p3 R {' K3 A' B! A: S. e ^/ E5 n
// Log_print0(Diags_INFO,"eolq.\n");9 Q) g, p+ X+ Y& o/ p- K8 K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);% Q& L: _5 V1 z7 t0 C4 P7 k
}9 M) C& {. [3 q; }- m, z
6 J& W, V, J# ]" R9 Q# C9 ]" F; u
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
8 o' R( C5 R$ x6 q( V) b6 G {
+ b' Q Y: ?; I' a: b// Log_print0(Diags_INFO,"eowq.\n");
. u, u8 c( ?9 {$ U5 K0 L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
$ |" i, g ] u6 R3 p7 m upp_interrupt_count++;
+ m# K2 R, A+ Q9 l' ]7 }/ ^#if UPP_DIR_QI==1
' h$ B; R) f) {/ V# u7 B3 [1 R6 j, J upp_dma_receivestart();
: V/ [8 Q o8 E9 ~& Q) K ret=1;
8 D" h) w/ e$ ~+ Q5 R* z9 h#endif
6 _9 b0 ^" H0 ?3 }" g1 [/ y H }
" {# D5 j" G; ]6 g: g' A k8 [3 F$ f3 V& m, c) E4 W
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)& R1 z2 _/ c0 u% r9 o' o7 |
{# N$ a2 i' R$ G
Log_print0(Diags_INFO,"errq.\n");7 C# B5 @* b( @3 y4 {
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
! g+ _" M1 Z: V% [, v" p% |" z upp_error_count++;2 }% p& w! N- J/ x
}
. T7 @( ~( L; N5 U) J t' b$ {) I. B1 |
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
! M7 T. k! b+ r$ T" c( y {1 n" M( A# H: @) D# ^
Log_print0(Diags_INFO,"uorq.\n");" A6 e- l6 `: `' P+ h. T# c4 N. a. J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
. F) c! E7 z; v" z8 V5 C upp_error_count++;. j6 `$ ]5 h2 O$ A
}
& w. t. r, i6 r! i3 A/ W: F
& Q3 C2 {" H0 g if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)' o& t3 y/ a% o7 o
{9 `5 B j8 J' O! ?' D0 b
Log_print0(Diags_INFO,"dpeq.\n");
6 U! P j( N7 w- t' ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
* J+ m6 d8 K; m. Q upp_error_count++;
* i0 h, @/ o' k" _ }
* v& e$ k3 n5 \* Z* D, D0 Q: o7 v& f7 I( j& G2 \; `
// make sure all interrupts are handled
: h( ?. L' i+ O% |* G3 H. O/ x intr_status = upp_reg_hdl->UPIER;
; U9 l- N% ~# D0 G' v }& D, ^& h* |- s0 t: S
* R) m- l A( n g6 R // finally: write 0 to EOI register
. S# U% {& o9 e5 V4 D T3 G' Z7 t upp_reg_hdl->UPEOI = 0;& a1 V; k* t0 x$ E1 h$ `
return ret;6 ^- K; z4 o' f! t" K# Q% z% K
}
+ }( L% m- F* j# Kdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
( x5 c: q4 g' y* ^0 P3 n( O7 K#define upp_dma_sendstartQI(x) {\
7 L: Y* g' F* I2 k) Y% I Wait_upp_SendReadyQI(x); \" i$ F# j6 H" k8 O5 w3 J- a2 d
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 Y/ L$ ]1 i3 {7 c# b. k9 m* s upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \0 t6 F6 L" ?: q7 A
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
( e9 s* {) D3 ^5 ? }
! N/ `) m: o2 C1 R" L% t
2 j" A! E3 H8 }! o: G( h; ^/ w5 v( X6 ?. r$ |" w
#define upp_dma_sendstart() upp_dma_sendstartQI(I)6 V* }# x0 u- Q- z
* l) J4 Q7 X0 m. U3 w- }
1 X- \% F0 S: w' ]2 v# P想知道uori错误是在什么情况下面出现的,好做出修改。 l4 V2 B! _7 f7 c8 P
+ d" c8 a f" ?& `4 q4 y9 ]
% |) t9 Z: o. E* @. }) C |
|