|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?# s: q5 |( ^+ L8 c: H8 G# L
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:3 _, J1 h% F% [7 {
u32 UPP_Isr()1 U I0 W5 t0 K+ {
{8 J# P5 n. o# D! r) |' f* S6 Z4 r$ N
Uint32 intr_status = upp_reg_hdl->UPIER;2 o' L6 H0 q0 @8 C9 T
upp_reg_hdl->UPIER = intr_status;//clear
" U+ E- O ]1 s, P7 ?/ h* F7 h- ?// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");( J1 }, F) Z# l3 A0 J4 o
u32 ret=0;/ N7 z! L* D" F/ B9 z
0 p4 j+ a% |* b ?1 H' t( Z // inline functions
% ?6 ]0 Z: x: \' b% Y6 } while (intr_status != 0)7 _2 i% S9 k+ x q9 B2 ~; D6 c
{+ M b1 ]% P9 ~& u
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
1 b, r- W) }$ ]4 J; j) D1 r {
! S# o- K4 y5 w3 o" e1 N4 H// Log_print0(Diags_INFO,"eoli.\n");8 L2 ? `; L) m; a7 \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
0 o* E% ]8 R+ i' D: b3 ] }
+ ~2 ^: }; F+ l- F/ p# M# _2 I* {, B" j3 o# W# t
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
" G7 E$ W) W5 k. D {
# z& r$ V8 L- @2 v7 {) f Log_print0(Diags_INFO,"eowi.\n");1 c) Z/ f4 I, w3 M3 J9 Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);% Q+ f1 X/ Q8 ^* K4 d
upp_interrupt_count++;1 ~8 k& H. T) \% W4 e
upp_interrupt_eowi_count++;2 U @2 `8 v! G6 y8 [2 P1 ]
. t, t$ z( i' @+ _
#if UPP_DIR_QI==00 X6 i+ h; J5 Y
upp_dma_receivestart();# x( P' a' ~3 p: k
ret=1;
+ }& y3 H A# s7 f! z! P' J" E#endif/ ]6 L" n& J% n5 K
}* E. R& O! E, m* c9 H& |( v( U8 T
! y' t! O2 x& L$ H/ d$ A( H" ~0 L
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件3 V* J; a; |% `) m m
{, P% [! ]8 i/ \% c
Log_print0(Diags_INFO,"erri.\n"); @# h) d! }3 Q! ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);3 d' a4 w7 d9 J5 }2 F
upp_error_count++;6 `6 q7 F/ R1 g3 E6 | Z3 j
}0 h/ l8 a2 Q3 h2 ~( N4 |
3 ?* z$ _* p( O; c
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
2 n! k* `4 S! o4 x4 z' V* E {6 n: n9 y4 c7 f& h, v% x
Log_print0(Diags_INFO,"uori.\n");
8 g1 H1 G7 l5 e$ {+ x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
$ K4 t& a$ b0 a4 R2 X% M upp_error_count++;/ ^' P3 U9 I; w
}* A( u2 G$ Y; j& T
3 f2 k; {% q* ~8 ~" \8 h
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
4 V& _4 G3 U, A+ H: E9 X {# I4 q; u6 `! m3 h
Log_print0(Diags_INFO,"dpei.\n");$ [8 y" y! n4 G- T2 |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);+ Q/ b( [" e0 e9 n' J
upp_error_count++;
/ K! e) L0 c# I8 M }; T6 [" K' b2 m* _
5 L2 i% _1 m2 E6 o# k+ i4 P if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
. y$ j( v9 `3 Z/ ~ {
/ \6 O' l7 Z( h' Z! Q. [// Log_print0(Diags_INFO,"eolq.\n");- q8 I* u$ I$ y4 x) f. t
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);. F, g+ b% T+ ]* a9 D; z
}
" m# i9 h0 o! @4 ?
% H5 K3 f) p* N$ L& X if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
6 ^) W8 W8 e9 v4 h3 t% R {
- \6 ^6 C7 f+ `: f% ~ _// Log_print0(Diags_INFO,"eowq.\n");3 o$ _: H0 J, x7 {. n* T0 D; c |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);, m: x( j9 @" ^9 _8 |( d, [+ W
upp_interrupt_count++;
7 h$ B3 m `1 R/ O% _2 R: f$ B$ v#if UPP_DIR_QI==1( {8 B- B: c* Y1 Y8 l. ^
upp_dma_receivestart();
& p' u, C( o! C ret=1;
, ^) G8 x& N2 g' [#endif+ ?- g% C8 G3 I$ Y. M2 `
}
3 u. s4 s( s! b; x& p- _% f& y& q3 r2 X) T, e7 C
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)* x+ h8 e! l7 A0 }, M
{
: S8 ~4 e3 s3 v5 ^; o Log_print0(Diags_INFO,"errq.\n");
( O2 q1 x2 u! g/ S9 S2 l- `0 ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
% R ?2 X% q/ V3 W7 ~ upp_error_count++;
* C; U7 F% @. A e7 g' B) \, I }! }! P) ]& X+ m7 S/ w
, _8 x3 \( u% v5 ^ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
6 Q+ J; ]% s ~9 Q2 d) A/ g7 y {4 [8 D; F& r+ ?; @6 |% e7 F
Log_print0(Diags_INFO,"uorq.\n");* Q7 j; N" A: j0 y: _" K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);: I5 t6 u/ n$ J- }
upp_error_count++;* N# l5 l* g+ v2 _2 d3 L3 Q- w
}
y5 q0 x5 F" J4 N- p+ d X+ j6 V, [7 K* U N2 q0 G/ v& C) F
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)/ |* l, t& X& x, C8 f
{* F) P& ]$ V9 Q3 A) c
Log_print0(Diags_INFO,"dpeq.\n");
* J, x) I7 ^0 f4 X. O2 C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
( q6 g: ?& L- J3 W9 I# M* K: s upp_error_count++;
: y q+ D6 L0 U2 ? }
2 k/ a( N+ B, L+ n. c6 |0 Q( n% h1 N
' P6 T# e. L% g // make sure all interrupts are handled
/ ^: `# q' v3 j0 u% M) n intr_status = upp_reg_hdl->UPIER;
0 k% m2 O% |3 Y: L5 d: z }
6 a+ Y3 m1 C5 e. n- L6 D N8 L3 a) h
// finally: write 0 to EOI register
$ X: X7 Y. N0 u! S5 u" K3 _ R upp_reg_hdl->UPEOI = 0;- d; a' p" j3 S; T
return ret;# d/ W- K; O6 w6 H2 z- {
}
: ]+ [+ j& w( |5 K0 h2 }( _) Edsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
- l' J8 ? q0 P+ Q. A( ^#define upp_dma_sendstartQI(x) {\4 |' t: F6 ]% Q- S4 K. v% y2 v
Wait_upp_SendReadyQI(x); \8 V1 c" s0 \- H3 K* c7 L3 N3 }
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \. v& P7 n5 y V
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \+ B/ H, z; L: ]. C
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\ X1 K+ U% N$ R/ h
}) q" R- k: W* x. x& I
7 B& G7 A; k9 j1 \" U, J" c
$ N# {5 ] c; v7 S/ C7 y
#define upp_dma_sendstart() upp_dma_sendstartQI(I)+ ?. a3 ~4 E+ F1 ^) r
, L! w6 @* G# [1 P7 x7 t% U( \/ f0 g2 m
想知道uori错误是在什么情况下面出现的,好做出修改。2 j. b1 ~1 ~: L
$ ^7 u" E' V( d; l. ]& M2 r1 |2 f
7 K2 L6 f& X' @5 @- H/ ] |
|