|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?! O/ u! U8 X) E, `
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:9 \. i9 z6 H7 L6 v
u32 UPP_Isr()
: f! @) F9 F+ c6 s! B; S" r, M{: o P* F9 ^! C+ }2 m) p
Uint32 intr_status = upp_reg_hdl->UPIER;) c4 ^& C1 [9 s# F# D
upp_reg_hdl->UPIER = intr_status;//clear, E) S- H2 h* {& y X
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");+ l: F0 ^9 `! u8 J7 W
u32 ret=0;
5 x5 i" q0 ]7 h8 d- b# b/ @0 }- }% t4 X" z; I' g7 z
// inline functions. v# c+ i7 r; \) X0 L$ P$ N
while (intr_status != 0) Q5 S2 s, k% Y. t7 e2 c
{
7 N* f0 h$ z+ p }2 b/ p0 [1 M if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
1 D$ h+ x& p7 K) s# A {
+ {2 t- O( U: k1 h$ U+ H// Log_print0(Diags_INFO,"eoli.\n");+ s( b3 Y4 K# W
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);# O5 k% q* u" v- l- T
}9 g" _4 T6 r, r4 Y/ C
6 M! I( ^! [' x
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
$ K' D% Y3 U. k/ [% G1 {1 r+ f {
" q! V& p `, I" t Log_print0(Diags_INFO,"eowi.\n");* k$ H, G$ T0 ]4 }( R
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);4 r7 [# @/ Q; T* B: F" D
upp_interrupt_count++;
, L+ I, x8 q+ f- j1 X# n: v upp_interrupt_eowi_count++;$ i: h$ U" `! B' F- _6 J/ C) F
! i- x4 O5 {# q#if UPP_DIR_QI==0- p' t& M) O* @& k1 r. m) g" P* S$ v
upp_dma_receivestart();4 i3 c/ m: P# P$ z+ S
ret=1;
" g: p K) s' t" ?3 E. a# w1 p% H: S#endif
' u$ R, ?, \4 F' N7 A. N) W }
& ?7 M; _0 q3 R& r
& b* _4 N! e- W. G- L if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件! v l- y) J8 K9 V+ M1 e* |7 E% t! g
{
$ U0 V Q* V4 u$ W3 y Log_print0(Diags_INFO,"erri.\n");' d3 D/ N7 u- g/ I$ ]1 _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);5 x i( E9 F4 @- ^1 Y2 _
upp_error_count++;4 R$ p" z6 m/ Z( E
}' `" ^# _" X5 {2 A) |1 F
0 |' _2 W& w7 M4 D% `2 Y
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件' J* b/ `2 a; l* e8 X! r
{
& d2 S/ i3 H3 b0 X- K \* K4 Q Log_print0(Diags_INFO,"uori.\n");
4 b7 c7 S) _' [) Z1 ~2 \& M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);6 x0 W7 k& z9 e- N# U0 {
upp_error_count++;- o# k/ r: q' h; T2 R3 r( b
}
7 n6 ~6 t0 N# y. @
/ X+ a7 A9 ]6 O n1 o if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
) V- S+ F% ~) G {
1 {9 {3 f7 Y7 ?4 D' _% n/ l Log_print0(Diags_INFO,"dpei.\n");
+ G% t5 \7 _0 P* x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
2 ^* T& C; y. F7 C1 B# s upp_error_count++;
' |& p9 x' ?5 w- p& J' S }
9 ~+ E! P/ I% p Z, P/ n: I& Z( \4 \' n# y* k/ e
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
* q$ z3 v/ W3 d1 T+ p7 w/ `( U {
4 j) o0 X z' H0 L7 \& y8 ]) `// Log_print0(Diags_INFO,"eolq.\n");
2 t9 e( h2 ?( [# B0 \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
8 ]( c: v* w7 Y }
0 Z/ C$ \; _+ z- E8 d8 e
! P' y' j0 [8 h2 M if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)& x3 R* {& T0 S! k$ j
{
) c" g! j6 Y# w/ z1 w7 r- G// Log_print0(Diags_INFO,"eowq.\n");
9 o6 M$ L3 b1 M2 |6 F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
0 {& X- {* l( H! [4 Z) N6 T upp_interrupt_count++;, _$ s0 P; D5 W
#if UPP_DIR_QI==1, @8 T, C/ W4 w3 W/ S
upp_dma_receivestart();+ _9 x M0 {8 w T
ret=1;
. l2 p4 Y$ c. k+ `) F8 x#endif
' Y/ q+ C! J0 k5 j+ j0 V, E" i- t }' y0 }' {) I- Q& ]0 u. \6 G, F
5 C% h! K. a2 E if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
& N% Y* W( G( S! E4 s4 u9 Y! l" s { M# D% A: i6 @7 I
Log_print0(Diags_INFO,"errq.\n");
7 @$ a- J* d: O' u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
1 h: {- K6 F* H& N8 Y: Q1 F upp_error_count++;
9 f) | G: L6 X S }
# }7 ~* Y- y7 c5 s% g8 h1 X3 E8 o/ L K
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
6 j1 R9 @; ~( F: i {" r( r) X- @. z( w V. v& D
Log_print0(Diags_INFO,"uorq.\n");
1 M3 u& A: L% ~, [/ L/ m4 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);- G4 N: o: y8 h2 d# T4 @0 e4 d, u/ q
upp_error_count++;
3 ]5 S2 k( g6 R+ Y }; N9 q. _; \" Q8 ~+ {
$ Z, E" z$ c6 j; M w! T; V
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)" J5 v& n4 O; K9 A& V* L2 r
{
) v- Y7 C. o8 _; [- [( I Log_print0(Diags_INFO,"dpeq.\n");
. U+ h8 K& ~/ s. n K% ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, x h+ v# y% }) G3 k# @
upp_error_count++;
. m2 d; q0 l ^& x: d: K4 L7 S }3 k0 K J9 |7 M. s0 _) A/ N
9 I& |6 K' I* E3 \# A3 C s& C // make sure all interrupts are handled
2 g- `" g% C% i$ z5 l intr_status = upp_reg_hdl->UPIER;% ~/ l, |% |, R" S
}% _- H, \+ P x/ n
r- f1 m' Z+ N // finally: write 0 to EOI register
4 E$ N c6 D4 Q+ P7 U. m upp_reg_hdl->UPEOI = 0; t9 v2 v1 R+ u) K+ \: _2 ~5 `
return ret;0 v3 M3 i* Q# R$ |; [. Z; A/ i
}
9 y) K0 F3 H' \ n0 _& ?8 j* S7 \) ]dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
6 X) }! ^! r, }0 C/ X: m, P#define upp_dma_sendstartQI(x) {\
% S* s* b, }8 h- Z6 q2 d1 L Wait_upp_SendReadyQI(x); \
# Y7 x8 q" U$ M7 D: W upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
- s: c- X, r3 N8 `6 f8 F upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \+ z; `- ]$ B+ W- C" D1 ?
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\* g$ r) f. A4 ?% Z) w- e7 J
}
2 V: H& }9 `+ M Y/ ?! z
0 z1 }* t4 i5 ^4 k! S
& T$ z* ^$ Q. T& B#define upp_dma_sendstart() upp_dma_sendstartQI(I)) k* }9 x4 A0 {, T# K( ?. l
6 L4 W d$ x* k+ Z+ i3 V! h5 {: _/ ^4 E. r C! b7 E+ ~# {
想知道uori错误是在什么情况下面出现的,好做出修改。3 [6 v5 \" y3 ]& `- L4 S. P
3 ^. w+ P1 M* h* V) V4 v. g; S: R
; g5 s. b: o) O+ `
|
|