|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
, G' s7 f `; j7 V& ndsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
; g) G* u4 ]$ R/ b) E% Y9 V: F) `u32 UPP_Isr()1 P2 {! G; E6 Z
{( ~& u' F+ W8 J( O
Uint32 intr_status = upp_reg_hdl->UPIER;
* s5 D4 P3 Y( W* g upp_reg_hdl->UPIER = intr_status;//clear4 _% o; x& Y4 }+ `$ _! S* N
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
+ C- s/ t. }7 L$ i u32 ret=0;8 P1 \8 D; ^% U9 m# v4 M( |
9 t2 u0 f. `$ J5 }+ M. M4 m2 S
// inline functions+ ]: B5 w7 F, C Y: b' b0 k
while (intr_status != 0)
z3 | `- C, e% e* E {
5 f- h/ u3 f1 g$ l9 H5 G+ t6 G if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
5 l7 Y" y, O0 N: M: }1 A {
& g$ R6 x% p& ^, }// Log_print0(Diags_INFO,"eoli.\n");# r& k( N: E y' U6 w: T
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);% V( ~# S! g0 O
}3 f3 C7 D5 ?6 O0 _7 y0 F, G& c1 y
* N. X* i+ ?, Q- `. I" _- e6 n
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件# |! |7 A6 x r+ G8 k0 x @
{* P2 E9 y/ Y8 H- y1 l! F3 l1 t
Log_print0(Diags_INFO,"eowi.\n");
0 D+ K) N! X8 D& V, ]; J9 V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);& p& y' a5 |& e& o% q
upp_interrupt_count++;6 g" Z; L6 x$ c2 R2 s& j
upp_interrupt_eowi_count++;
z, G; ^$ b3 j1 T+ W& \6 @% D8 t) T6 z% P' b
#if UPP_DIR_QI==0
* y( v- T# r( @: x1 O" ] upp_dma_receivestart();
' K' K9 F, Y: w$ j$ }+ }# j+ M ret=1;$ F6 O$ x* }6 _0 g( }
#endif
: |- p: h. |7 E }
" P c# ?' a* |
# l, X8 g0 m. ] if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件9 o; n& T: ^% R3 h4 N) T" ]
{% [6 f. K/ E% m$ V
Log_print0(Diags_INFO,"erri.\n");
% z5 V- b3 R5 N- v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
3 f2 e5 x$ C, i+ C upp_error_count++;/ `1 w' D" L# i6 ~5 z& P
}
& P6 n) Z l B: |4 f* f7 S. k# C: w
7 P A+ Z$ M9 r' O) S if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 @; x7 ^9 |. d. Q, L+ X
{. |9 N( T$ b2 M5 S8 O# c! R; A' [% ^
Log_print0(Diags_INFO,"uori.\n");
1 x" r1 m5 w, p6 d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);5 ^' w0 S; n" g1 O0 p6 x) X
upp_error_count++;6 o% ~# d4 Z3 }% s
}
: w. @2 t. |3 g
3 w& h: i/ I$ N" I if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件7 q- j3 q X3 N$ B* P! G
{
+ _) |6 {( S/ ]9 Y4 P, x. f Log_print0(Diags_INFO,"dpei.\n");9 r* J2 Z4 u5 `' L4 y# w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
8 V8 ]5 k; q6 |) N4 L upp_error_count++;
" B7 }7 F- g9 @0 k0 q }
" s( t/ I+ ]$ [4 \0 p- ]9 s# N" W) \# ~
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)& d, E: V$ y, \' b# G) Y; R
{6 o' E5 C1 A5 P1 q; C, \0 L
// Log_print0(Diags_INFO,"eolq.\n");- I) a4 [" C7 o8 y- M* O* z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
. U7 x0 f3 a/ K4 ^6 M) Y }
B* T' J% [) ^' S8 F4 ?' [ G& X8 W1 G6 b
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
4 R( m U1 j5 z: S9 O0 ~8 c" Q C {
* b7 _/ u) A& T6 M7 E// Log_print0(Diags_INFO,"eowq.\n");9 n6 m- Y" j( y3 V0 j0 P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);9 V+ S- K( a0 ^8 K1 v* |
upp_interrupt_count++;/ _! J2 G! ?5 h# Q9 b& Z- X
#if UPP_DIR_QI==1) O) X+ v* N6 m% S# {8 ? }+ |: X( o6 L
upp_dma_receivestart();
2 F9 \6 u0 w) |4 F$ q& ]# n* d$ i& B, B ret=1;4 F j" o9 {' _8 P+ U n
#endif
. ~' C) p. p& S3 F/ \ O3 Q }+ v! M- i G5 h1 k) Y) z9 F0 P$ N# @
6 M' K. y* M1 `8 [# d8 a if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)9 o' d1 W- v: i b5 F; |: y( @
{) i& f" ~ r# K1 [. W+ ]
Log_print0(Diags_INFO,"errq.\n");
2 E/ y' p) z2 e( X- M& u/ q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);0 i0 h" u' a/ {8 |9 Y
upp_error_count++;
3 H' o0 B+ c+ p& o0 ] }
" m8 q7 ~7 E! g) |
8 [ O9 D) q: [5 B1 Y5 x if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
0 Z1 Y* ]: W2 m0 M* H3 {, F {; j+ ?+ [# v7 U! c( G4 `; k3 S7 J
Log_print0(Diags_INFO,"uorq.\n");" D+ b! l9 }# t) S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
% z: y) V$ h+ b$ O* G$ @ upp_error_count++;9 s8 s' v1 x6 c2 R8 P
}5 h" V" C1 s" S4 E- _
* Z8 w+ k+ }6 A4 n f. z5 M if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
& y% y N) I) {5 _1 |$ W { T* P8 V: J5 q
Log_print0(Diags_INFO,"dpeq.\n");' t1 q d8 n7 R) A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);* t! n. p) A" b/ x$ B
upp_error_count++;, ?% W4 I' f6 T6 Q* a3 }- \+ x
}
. z7 g4 [" |. E' l' } F4 p$ v# S3 [
// make sure all interrupts are handled
$ m) ~$ z+ G" `$ T intr_status = upp_reg_hdl->UPIER;& Q) z; t& ?3 d7 K
}& C1 ]3 I+ k( V5 X; x7 \$ X
6 C% z, o5 P' b" D8 B // finally: write 0 to EOI register
. n# k# P t; a7 m' |0 f m p upp_reg_hdl->UPEOI = 0;
. J' C3 _$ m& d* [ return ret;
* \# y" w3 ?% @8 S}
% ^; G; U1 ]. J0 @4 Ldsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):, k0 h4 Q) E5 u" t: X6 E6 }
#define upp_dma_sendstartQI(x) {\
0 P7 |+ h. A5 ?2 I5 i2 k Wait_upp_SendReadyQI(x); \' |5 l) n+ n* o8 B
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 [2 S/ K7 b# [. G, ?, C' V( X6 a upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
! n$ t2 n, j+ f, K) u- | upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
4 J h+ J2 a( |9 D: O' j4 X- b }, @2 r" Q# O7 Y+ V! ?+ p
$ {4 W6 a% t. U
" I0 Q$ {, H% W) u* }#define upp_dma_sendstart() upp_dma_sendstartQI(I)* S- `; M' F; z
; ^. v ^/ g) l& k2 |' v/ M
% G4 w# X5 |) H; h. S$ G; [, L想知道uori错误是在什么情况下面出现的,好做出修改。& X: p1 [, q( r( ?7 b6 b: ?
1 h, H* r9 J% F& U: M/ ?. Z: k: T9 x- Y( t+ @! ?
|
|