|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?3 r: H0 @& Y$ E2 m' Z8 R! R/ R" d
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:. W& V1 Z! B9 @) Y, f& w, t
u32 UPP_Isr()
+ u& P r, p" Z( f) u{/ n ~( ^8 |' X- d- o: D
Uint32 intr_status = upp_reg_hdl->UPIER;$ e: \' n8 O7 `
upp_reg_hdl->UPIER = intr_status;//clear
" U/ ]* X- c6 L" T1 L- O// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");; b; Y+ S$ g. ]& |8 F* r
u32 ret=0;
$ _) U3 Q' G: C: X% r" w; g; L% e* j! |' p: j ]# S# | @
// inline functions
& u6 T: |5 }! Z( e" y# \5 P while (intr_status != 0)
5 o5 w5 h( x( y/ w: L& _ h/ y& o {" R+ [2 d3 A4 m. F! w
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件& ]3 `6 b3 m1 r& N
{
, _2 B& S, s. K# ]7 y3 B7 N6 j# j// Log_print0(Diags_INFO,"eoli.\n");
( `8 h# Z" o+ P4 [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
7 J/ z7 D& N+ w2 h8 a, }8 { }3 B5 e7 Q/ r, I
) @% F7 t7 {; g2 ? if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件( A" K1 d0 P C# C- u
{
+ ^: M6 R% N- x C1 t5 x! v* F% } Log_print0(Diags_INFO,"eowi.\n");( S% b; R9 N7 h' L3 w3 s% D: |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);5 l% D4 Z% Q. F- r) B# i7 z
upp_interrupt_count++;
+ A. X' a2 o }# T, t! u* B% J upp_interrupt_eowi_count++;
' L" k% I% T' C1 {$ c7 b4 {, y A |8 P, e# _5 L+ X& O0 p
#if UPP_DIR_QI==0& c% J5 b3 ? Q9 y0 [- M
upp_dma_receivestart();
3 h) h$ F1 n( f+ V4 e! ^2 q ret=1;2 E$ W' S- e% B0 a$ g# c
#endif
# @: g4 X9 e% k: E5 Z }* s$ @6 J* [3 X& x) g# `3 q: z
+ F9 m1 E: q8 |% g% @2 m. n if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件1 b P5 d* e. c5 N5 k+ W4 C- {$ [
{% X" E# o, s/ t8 C2 p6 o6 I7 U: w6 v# E% h
Log_print0(Diags_INFO,"erri.\n");
0 H: ^( N! Q/ C9 V5 _3 I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);# R! G' B7 L p0 _& P6 S
upp_error_count++;
$ c7 {( C8 M$ Y! \# I5 R1 y8 X* S }
+ j; N! {% |3 H' @4 a& X, @+ ~7 e. w, a) j3 w! K1 Q5 M5 B1 J
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 q) Z$ P) t9 L+ S+ a9 a& [) w
{4 W4 J) G( O, m
Log_print0(Diags_INFO,"uori.\n");
' Z1 H4 o4 l* R+ s3 y6 z( a7 o0 [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
% V/ X( q2 O' r' s8 {- h upp_error_count++;
9 o& X% @: W. T( o1 C2 U* U }
4 O7 @4 Q7 a9 ^" r5 _; B3 p) k. x6 c6 q3 a7 N% w% O- S
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
3 c5 j. g% P6 ]; K( l- R- t; K" L {
+ @0 V1 j5 b: I% ?0 U Log_print0(Diags_INFO,"dpei.\n");
9 Y! H% h3 g# h$ t2 w) X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);9 i8 M; a: ~( E0 P" g, [* j
upp_error_count++;6 [) E( ^* a% w
}
3 H3 [6 x7 K: m. r7 t o3 m
% p, \; r# I% q& Z1 l0 i& m" n if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)/ p* I1 {, @6 V5 A* ?
{" L# U3 b s/ d+ b8 Y8 ~
// Log_print0(Diags_INFO,"eolq.\n");
0 ]; S- V$ b2 _2 {1 x: u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
- J$ H0 P% j; t5 ~# b# ?% D, v' g9 } }
w3 J" y+ v2 s4 O/ t' ~1 M' C1 `7 t+ h3 h* N& P' F+ m+ q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)5 T G$ L# Q. V: q$ `# \
{
8 e. V% z: {, g$ p+ ^// Log_print0(Diags_INFO,"eowq.\n");
2 y5 n( ~2 x- a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
: u" v/ G0 q8 N, U' o$ ]0 A% \ upp_interrupt_count++;
1 @' i! t5 \# ^ ^' m#if UPP_DIR_QI==1
z4 Y# z7 } ~, T: e! y* t4 l# y upp_dma_receivestart();" G- g- `* h7 C+ ?* Z7 t$ G0 C5 A
ret=1;
: d( F6 e& d- q: f1 f#endif% O }* w% Y) l: A
}
# N! _8 n( M3 L1 R
0 ?! o: `# V' V4 d8 K; X if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
5 |* e' f+ q" ]: g e6 Q; m {
2 V, u) D8 V4 F, D4 `3 _, P2 ` Log_print0(Diags_INFO,"errq.\n");
, r {8 v' u0 R8 T1 ^7 q+ n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);& W% O3 d" l" c- s6 D l, X6 ~* o7 u
upp_error_count++;# ~" t! Y5 W8 J% @+ q3 k7 V" f' ]. D7 A
}
. _/ ~2 x5 W+ k4 K" W2 k8 z& A* B
+ c3 M- _) g3 Z v- n X2 E! H if (intr_status & CSL_UPP_UPISR_UORQ_MASK)2 N8 R- g4 o" d: V& a
{
* L5 m& G, H7 G# \2 r) d: H# E Log_print0(Diags_INFO,"uorq.\n");; N$ g( f1 K4 {8 a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);$ L' L. P6 G5 b: s
upp_error_count++;
& i9 q5 `1 m1 w G1 ? }
) A- ?4 S# S {$ p& v0 C- f" m1 u( x" a/ u9 X; T+ P
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- y+ O* A7 X# q4 b* ? {
" K$ A" F/ p+ T+ h Log_print0(Diags_INFO,"dpeq.\n");
6 r: d7 H ]9 z9 i/ s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. h z9 S; G! M upp_error_count++;
9 |/ J0 a( ]" T2 ~; n }
2 E `$ N6 F; K4 d- p7 t* r4 ?- V7 i G7 E8 G5 N
// make sure all interrupts are handled: `0 a+ V" x' O0 K
intr_status = upp_reg_hdl->UPIER;2 D0 H; [& s8 [: i3 H
}0 @2 h R8 b- v" s" v
1 k$ {8 M$ n: p( y, ^$ c: ^) Y
// finally: write 0 to EOI register
' W# J" h9 l$ F- _$ ^* p2 l& {9 o upp_reg_hdl->UPEOI = 0;
3 m* U6 T- R' s return ret;$ I: r( `- I& Y' T
}
1 A0 P# q8 i* z0 D; T5 J" Ndsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
+ K. g$ P: E6 X: }7 O/ b#define upp_dma_sendstartQI(x) {\
" Y. T0 S/ G, M# `# Q% v Wait_upp_SendReadyQI(x); \) E5 w1 V# _& w5 p; u
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
# s! C; b4 T* A, o6 r; o& Q* w upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \! m8 k: G% h" ] f( W
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
1 E" R/ H1 C/ K/ i! N }
; L* z; g5 O4 A7 h5 i' A* ^) \' W
' w% ?4 c1 q/ A
% P9 t3 W/ l! D#define upp_dma_sendstart() upp_dma_sendstartQI(I)9 h( N, X" [8 n4 R3 i. H! s
7 e2 \. `7 f# K7 H8 e5 H
, }6 C3 {! v, \" C' W u9 s) ^- h想知道uori错误是在什么情况下面出现的,好做出修改。
h+ s& p6 ?6 k8 N( `& d
5 M8 V$ `- O& ]3 z% v k* U
( Z; ^9 [% E$ [ |
|