|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?4 D! @, ` a! S6 L7 U7 H
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:# ?5 Z t" D' X
u32 UPP_Isr(), c' B$ G5 Z0 J) u, l- L
{
9 q+ {# U. u& f: G3 k0 u Uint32 intr_status = upp_reg_hdl->UPIER;
( J2 l- V8 ~, @- b upp_reg_hdl->UPIER = intr_status;//clear
$ G) I Y t: Z9 p4 I: M// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
) M5 Y6 Z0 o! ~. x u32 ret=0; a& x. i0 A6 S' c! h6 x" e# G
' I3 h! @/ `$ e0 L1 `( e; j, F- x // inline functions
' h7 J+ r" S/ L' S& Z% ]4 k1 [0 D; B while (intr_status != 0), [( L# O0 z! _$ h5 r
{
* s$ \( J7 i9 }: [- K! W' q if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
" v" t8 c, ?! H0 X: U; N3 D# w8 E {* z: A$ Y, ] H- b! l, U- ?7 H% t. |
// Log_print0(Diags_INFO,"eoli.\n");& G0 A) I$ Z' I G! N+ ?8 L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
2 n. e+ \ W; [3 C }
6 G0 H' J8 B0 P! ?% C% B) d" i6 j1 M7 N, t4 D
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件" \* D- ?1 @* W; q& F# F4 t* w
{6 G: q) j/ K! ^' O
Log_print0(Diags_INFO,"eowi.\n");
! I$ p8 R# ^1 `8 i+ q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
8 |4 @: |4 h& U! c- q; F- o% G7 b upp_interrupt_count++;
6 y- `5 ?, J) n5 ]4 Q9 l upp_interrupt_eowi_count++;& m. q# [5 R3 F4 N1 O
: F i! g: p$ c( V- V; v$ l
#if UPP_DIR_QI==0
" ]: L: }: u/ a upp_dma_receivestart();( I# f5 G M3 f0 ^. e1 z4 @' V
ret=1;
+ S1 M* R0 y$ C5 }/ T#endif1 Y% X: ~* \ I6 X
}: C- z* J% y0 h4 E) T
- r) T2 A; G3 m r if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件( x" `, i) `4 E" ?4 Y8 l
{2 [, l4 x8 w0 w
Log_print0(Diags_INFO,"erri.\n");
! I! n. g( m: {4 q/ e4 T8 E4 r" V: y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);. `2 e; s `/ x0 A
upp_error_count++;
' Z; Z# ^0 M$ P4 w; K0 B* k }
. R$ ?4 L3 b9 u @9 H; J3 b4 l" i9 w7 v- z, X
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
0 p& e; ~4 E9 L {
$ w: [, ^4 |/ B, J- [7 u& z Log_print0(Diags_INFO,"uori.\n");
9 n; }. o9 K* } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
! ?" u* f+ J7 W. p# _5 }* R" X0 Y upp_error_count++;
- ~) W& }: g* j- n/ R& B }
, u O! o: {1 U L) j+ }/ y) N: k: E, y/ P9 k. P" ~' q7 T
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
) W/ l4 r) T2 R* y% d {4 S2 T( j* H8 V; v
Log_print0(Diags_INFO,"dpei.\n");
" {- m4 q6 D( V g+ A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);& {, L+ ^. C; e0 i- F; ]$ d0 d+ J5 _6 |
upp_error_count++;
9 L/ `) \: D* f% B4 V" j }
# j( S# a4 ]( m* c
4 P$ A. y# x- ~! Q }) Y' v if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)3 p. v" Y. x! M" d
{
: |+ P) p: Q+ G// Log_print0(Diags_INFO,"eolq.\n");
. E* X2 a- {/ d, `+ p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);' `. @- P; g7 F3 v% w5 v6 P* J4 C5 a
}) ^6 u, [6 U- ~$ L8 d
3 A. b# n. Y4 M b if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)6 J# d9 M" D2 V4 \% U/ n( l) Q: N
{/ Z' C7 c |7 z) L8 R
// Log_print0(Diags_INFO,"eowq.\n");
3 ?9 V$ m+ o9 H. r {" y/ E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);2 H8 v; Z0 I1 u4 ~, F
upp_interrupt_count++;
' g. a2 G5 Q/ h& i, f7 J7 y#if UPP_DIR_QI==1
; O/ \0 Q' e( s* v7 B7 r" @2 ~ upp_dma_receivestart();' T J. T6 d4 W# R% I
ret=1;
$ ^. h5 s4 P4 Q: h+ ^#endif3 u# m! F u1 \( {
}. C0 s$ D1 v7 l
; Q' I2 h- ]. \$ }7 Z
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)+ L, g# q( z2 |
{
3 t, e! d5 d. t Log_print0(Diags_INFO,"errq.\n");
6 `' h; g2 a/ C$ r& K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
& [" I! l) R' }6 d upp_error_count++;
! j; ^$ |2 e% h }: V$ Q2 L9 l: Q# t
, M4 e$ ?2 k( b3 J* `% B3 l if (intr_status & CSL_UPP_UPISR_UORQ_MASK)- Q4 t/ A# b8 I$ o
{% C! C0 g8 j2 v/ q$ ~
Log_print0(Diags_INFO,"uorq.\n");
" A! d" e1 _7 h) i' [& q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
, d3 p" h, `& q0 k, ?2 G$ p upp_error_count++;
: N, B+ g! ?3 j- d$ s* E }
5 b, [+ b4 J Z, U- |7 M9 X _" c2 n" o) F9 E9 o* V- p/ @
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
1 _* N* b2 |3 l0 r& I1 K8 P0 g {
; W6 [5 |0 b2 [% V+ M Log_print0(Diags_INFO,"dpeq.\n");8 a6 v% b. w Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);/ F, {& ?6 i$ @: V" q( v8 B6 D; B
upp_error_count++;7 c1 ]" {: X3 W2 f' `& v1 C, M l. B
}
' L. C' c0 S, J/ L& A" z6 A* V t1 s0 L6 I1 M
// make sure all interrupts are handled5 g q9 U& | |' M' o) b+ K, o) }
intr_status = upp_reg_hdl->UPIER;
5 u% p0 f1 w" c% O. f }& e+ x' x/ R o, x; Z7 k
6 ]- ^3 P3 w7 x8 ?8 e // finally: write 0 to EOI register
8 h! {4 P& Z: l( w4 Z- ` upp_reg_hdl->UPEOI = 0;" e0 Q: l$ H+ A8 L$ e2 a; ~7 P
return ret;; J0 Q7 C1 n5 H( H) |9 p
}/ w9 T8 I4 M, \# X3 ^% y" O2 Z
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
2 N8 a; @3 C6 G#define upp_dma_sendstartQI(x) {\
8 l" _# V; ~- _& f$ f/ c Wait_upp_SendReadyQI(x); \
+ q. b) ?8 V6 o, h0 o' l, \ upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \) }9 E; n8 s6 v9 Q
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
# ~/ M" t9 R$ q6 S7 l- u upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
K3 Z( W" J4 S" M- ?+ J. J }
* y6 U" C# d- D; S
5 l. _+ b3 R2 t* c0 F c) u- K8 A6 h4 j/ f, \
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
$ r, ^; `2 C- p- Z3 K$ [& z6 a6 x O" @ @' e3 A: O
& d9 u. O& O) X( W想知道uori错误是在什么情况下面出现的,好做出修改。
' m9 p$ E+ P2 _6 A. r7 S9 ]
0 j) I! V( L# j5 i3 b) Z9 d& j4 M5 s I0 T( s7 P
|
|