|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
& w y9 R- i7 z/ O2 Sdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:6 m% ~. M4 r3 R) P
u32 UPP_Isr()
& K% b; _) C& W; G" w6 z8 }- j( z{8 H) D. Y+ V3 ]" I( {5 ~
Uint32 intr_status = upp_reg_hdl->UPIER;1 H5 O5 g2 [& I2 j9 j, ~1 q0 Q! Z
upp_reg_hdl->UPIER = intr_status;//clear
) C2 |$ O$ ~" K N0 W// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");8 {# H% o# b+ y7 Z f
u32 ret=0;6 O/ k* t6 H' s
) |' `9 C* a |- n0 _* E // inline functions
# l% ^/ B; w; m' ^- _6 U7 `" W( ~ Y while (intr_status != 0)" R/ B9 d) d, k& d5 F9 q
{& M' n, a% m& D4 d
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件: H F( A2 F9 }0 }" l
{
; E: O( n d* a7 g8 e% m// Log_print0(Diags_INFO,"eoli.\n");
; h% Q8 Y/ z8 ]$ l# P4 H$ J; R+ Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
% i' O- n! V4 {6 Q }* F" @- E9 R$ B* `$ j' p! o3 Q
/ ], |- \3 v* r& b1 U
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件" Z$ ^" _! w N O
{
) j" Y9 t6 \( m/ y; U Log_print0(Diags_INFO,"eowi.\n");! v& f0 ]) K0 ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
% K. f2 ?3 z0 }1 z upp_interrupt_count++;5 _6 E1 V; `- a6 Y8 G! H/ b9 t
upp_interrupt_eowi_count++;
+ p! q1 {/ x4 p, b; h9 i2 W$ P: ~4 ]$ d8 M! Y+ l# n
#if UPP_DIR_QI==0
. L% _, L, E; f4 E5 g+ c9 p upp_dma_receivestart();7 P" U3 l! |: \
ret=1;# U$ n" F( d3 p* b8 p. l, Y
#endif) E0 G7 q5 T6 ?& C1 \8 i* u
}
& b+ ^" ~. {( z: D& x' {* R
0 N5 S& {9 L% n! X5 R3 g/ { if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件- _' U2 O1 } U3 D' A- X* z
{* [* G) V ~& ?) h# Q# l
Log_print0(Diags_INFO,"erri.\n");
3 O+ l6 b3 n& W9 d8 O1 G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);1 {1 Y1 a L# V( C
upp_error_count++;: Z$ C, J0 k# h8 {
}
* Z1 \7 S- G1 F# S1 ]8 W- }* y
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
" r7 V9 _. w C& L! { {
0 d m2 \, \( ^# x; Q Log_print0(Diags_INFO,"uori.\n");
5 c6 A, m2 N( D9 T- I' Q9 V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);7 ?5 e7 y, v# v2 J Q8 p* k" m5 k
upp_error_count++;
1 d: w p7 L4 p2 g" u }5 @6 c( r, Y. Q; T
# O) W) O4 d, j9 E/ G8 K# O! C" h, i if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件. N! m7 t( w3 N8 N; \
{
* e- [1 d. C0 [& P Log_print0(Diags_INFO,"dpei.\n");; u* `* }6 A n5 b1 L, b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
8 |' K: \+ m! K" m upp_error_count++;
" t( O7 S% B9 L4 F3 P7 M7 v }0 n; Y7 I2 ^' B# c+ Z& X& W
3 o$ v' r' n2 U, c7 k
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
x2 ^/ }3 C: m! b {
8 S# `! z, o" U// Log_print0(Diags_INFO,"eolq.\n");$ g& N( V, Q' ^3 k8 p6 M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
3 |3 A6 U# U" P0 ]' j" {1 y" I3 h: Q }
) @8 e/ p# y1 @+ s9 U0 Y9 Z; I1 Z0 c" t8 [# u2 j
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)# X% @! m E& Y
{" P# m; F3 f k8 |: G0 ]
// Log_print0(Diags_INFO,"eowq.\n");0 f. j8 E. R% G" X3 @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
5 }8 Z/ f# t0 k& m- C upp_interrupt_count++;0 o; A. i& i5 r) v! g2 l
#if UPP_DIR_QI==1
6 l* h) E. }6 L% I+ K upp_dma_receivestart();
3 x. y% ?7 T7 R* Z6 U ret=1;0 w: S! ]4 V( x* Q
#endif1 f( @; G, j, \/ B$ I$ @$ `! F
}
% I1 o/ b0 I! q Q! |7 e8 m- z: h% y6 g9 Z K- Z) f8 Y9 p( C# M' r
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
+ b) D8 D& f! P {4 P8 W1 h e- m
Log_print0(Diags_INFO,"errq.\n");
h% K& A, n4 {. Z6 {3 n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
, n/ n# U w& Q# d! v/ N3 | upp_error_count++;! b6 D# P; t& s
} @# s: a& M- X y' ]
! Q( F ^* {! D9 c
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
. m& W c+ T6 l2 F" ~. N {1 `% w. @5 @* h9 c; E _# i- L8 `
Log_print0(Diags_INFO,"uorq.\n");
# m9 w& Z3 Z7 Y& |, ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);1 z- n# w' \9 Q" k
upp_error_count++;$ G2 d ^. Z) x5 I/ }; [
}
* d1 A1 s% a# b: |4 \6 ]& L3 D- b+ ?) s. `
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
9 C& m3 n" w* O! k N3 E0 ?, A7 _& ` {8 H+ H% A' P; w8 ~, a1 b: T j8 r" C
Log_print0(Diags_INFO,"dpeq.\n");
" V' O. ]3 C) u' G0 D3 H) y0 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);; |! |$ o$ a2 B! F- v$ s0 W# @
upp_error_count++;+ Z6 V8 N- H3 [8 C; _
}
! X6 Z' K0 g B5 S9 u. c1 v2 h6 o
! m. e8 n" `# L r) G C // make sure all interrupts are handled
7 V( D7 b+ F6 Y9 a intr_status = upp_reg_hdl->UPIER;
2 v; V- B$ s& f1 F2 O) Q: r8 j }+ q1 f' i6 C' u" l
* ~# G: a* [7 O4 r8 X
// finally: write 0 to EOI register* H4 O4 Z' f+ A- _6 y
upp_reg_hdl->UPEOI = 0;2 B7 l5 f( p5 i; ]( f$ c, j; w
return ret;
" I( s( x7 e5 R; J* A}
C. a3 @8 y7 `dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
6 g8 d' a) d* ^, g! J#define upp_dma_sendstartQI(x) {\/ s% V6 ~" Y d3 K4 \, s4 M# @
Wait_upp_SendReadyQI(x); \
( w) Q/ y1 B) d2 G* ? upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
$ v2 w3 r; p. O$ L# }! o Z( R upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
4 ?3 u8 e' o: f: S/ J3 s( x upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
7 s$ ^' e1 u3 Q7 F }
6 }' [" |# U6 W9 c) c. M6 V# \
- [" J% \7 h( z8 @; e# I
5 v9 d! y1 _+ o9 M7 S#define upp_dma_sendstart() upp_dma_sendstartQI(I)
9 M5 z4 r7 O2 p( F; ]5 C( v& u% r% Y- r5 u; i5 p" E
# @& V! D9 w3 J. U1 k; B
想知道uori错误是在什么情况下面出现的,好做出修改。
: _. H) A0 s5 M2 g6 C( s) a0 A' N: f- R$ L# V
4 Y6 B6 A% }3 d, l+ c$ P' }9 M1 n4 ]/ t, V |
|