|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
5 u+ L( m2 v) `dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:. z1 l2 @* r2 O' v& w3 i# ~' _
u32 UPP_Isr()$ w7 ^' q) ]) S) p
{
/ T/ Z' n& m" _) a8 L Uint32 intr_status = upp_reg_hdl->UPIER;
4 c. g# j( l: V8 Q, l upp_reg_hdl->UPIER = intr_status;//clear
6 S, e3 V$ U* c8 }" e/ S0 j// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");; [5 V5 @: m; Q
u32 ret=0;
( I6 `& y+ [1 G- O5 u( v: E0 J- m$ E% r. a2 R8 c- q$ }% n4 x
// inline functions
( q/ {0 y( F" l; L* ]* ] while (intr_status != 0)
V( y4 H; K, b$ v/ [ {: p* U) u7 Y+ g0 |2 I& m& j
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件4 c y. N! U7 O- |+ h
{
0 y8 n0 P3 [ e, v// Log_print0(Diags_INFO,"eoli.\n");
) E! @# p8 x& T2 n3 L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);$ c, B6 c. @7 }- S# O; \% {. s" }
}
* u1 a2 R% \# D) f
}6 A2 B I# D8 R: V/ j! c if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件- F) ^# b- k/ W4 Y9 }/ A
{) G. m7 s* Y2 _& t5 Q5 ?
Log_print0(Diags_INFO,"eowi.\n");
, T% }3 S; e8 Y4 M8 \( a* |1 D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
5 g) U) V4 q! O upp_interrupt_count++;
/ R; h) q( a. P1 w0 x- ^4 G# l upp_interrupt_eowi_count++;
) M2 x; s9 |! y/ H, ^. D6 |& f7 W
6 E8 \5 v8 U- \1 R4 D#if UPP_DIR_QI==02 V$ b0 O; M* {4 v/ `; m
upp_dma_receivestart();: E# K- }. O8 ?$ }8 z& l
ret=1;7 e$ |. c# j- W8 @
#endif
1 j; }- x: B, X/ O% ^' M+ u }
0 z2 L' U- q* B; N, X" x
4 T, t9 D2 I+ A2 Q- T4 o if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
% b; h* `# b! H6 y/ U+ | {
2 A' l2 h0 G# \) |- } Log_print0(Diags_INFO,"erri.\n");7 N! _% B, S9 G+ B+ T) ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);+ z' H% f/ {' \
upp_error_count++;
3 Q" d5 a' A: }; d; T7 @% s }4 S& b0 D9 p, M o+ r
V) `$ j7 q1 E4 A6 b. S
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件' w5 W+ g& p2 X3 G# B. f
{8 S [# C9 `( `: }8 }
Log_print0(Diags_INFO,"uori.\n");
* f2 k/ ?8 W8 ~- X8 N6 f% H8 ^( s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);! f3 F1 _' s! T: ?/ I
upp_error_count++;1 y9 i8 L4 s/ G6 T
}
?7 H2 L: S V4 D# c4 s" v8 M1 _: \9 Y
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
! T3 s9 o+ U5 b" {1 ^ {4 u. r1 u1 E1 T4 h
Log_print0(Diags_INFO,"dpei.\n");4 @1 K, q+ f0 g. a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);' }1 U+ Y% ~: {
upp_error_count++;/ ~+ v: D6 U* S0 d
}% T$ q( f. H- P+ ?' B5 e
, L( M. g" [& P
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)' ]5 p( `& b& `6 H k% o! k1 R& h: y
{
' E& g* K6 ]4 T1 J. T// Log_print0(Diags_INFO,"eolq.\n");
6 ]/ k1 F% U3 k- i- v$ { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
4 V; U- z, u" l2 F }
$ }8 G& E, x! ]! {0 J6 ]' _
5 C' w. s0 {: c- b: G$ f0 ^ if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)7 ^ Z' C1 J1 d' M' O
{
! l: M2 B6 u# C/ j: R' E ?4 Z* [- y// Log_print0(Diags_INFO,"eowq.\n");
# l7 ~( d1 O; e* w7 D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
- Y6 L" w! N' l6 h2 }/ m% j% a- F2 H upp_interrupt_count++;4 C8 u3 L9 d6 r6 v9 \3 ~
#if UPP_DIR_QI==1- Q2 O, v' ^. g8 H- X8 B
upp_dma_receivestart();/ Z0 L, y) X* A
ret=1;+ U: W+ T( ^ T" i, V
#endif
; M7 y: `2 c- G0 @. w/ p8 ? }& @1 O0 q0 ] l' ~/ {2 W( s
5 K9 o* Y/ |/ t( f- j
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)2 b; ~( E; Z! \, a' R$ f
{3 S! R( I. N3 d- |; l
Log_print0(Diags_INFO,"errq.\n");+ Z# r' K) s( F
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
# _3 B9 f5 }# F* ~' W upp_error_count++;
K8 _; v; X( ~$ ~ }3 Y+ ]% z) H& J' y% Q. G' c6 V
+ z3 A( X1 [& P
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)! y- s+ V- }' @, b& s5 E
{' d: Z- M! P; T
Log_print0(Diags_INFO,"uorq.\n");
% `1 ]$ [8 M' p& | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
+ M- J! m' b% ]6 A( F% m$ P upp_error_count++;
( O% l# x( ]4 a+ y+ O9 W& D* F3 W }# E/ `! X8 R0 x+ V: }! T& |
7 Z& T" V3 F: o; o. j if (intr_status & CSL_UPP_UPISR_DPEQ_MASK); O. r+ A+ X- Z; A# U5 ?, n6 Y0 ^
{8 u# O3 y1 O: i1 R' T6 G. p8 N
Log_print0(Diags_INFO,"dpeq.\n");
& j7 O' r; T$ f0 }; {5 |% i! E) ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
9 z! w' e5 A$ J( K/ O* f upp_error_count++;
# |4 j. F/ x$ N; ^: T. O" { }
6 Z$ w: J4 B0 v* u
+ b: {4 F# @: @* g4 N' Y // make sure all interrupts are handled+ a4 ?- ~( q0 d1 V
intr_status = upp_reg_hdl->UPIER;0 z) \3 b v) l+ Z
}6 @3 n8 Z4 S0 ?7 I" k. g
0 V$ _ A) p- e, a4 n
// finally: write 0 to EOI register
" ?' R* R. @( u; U U; q2 J upp_reg_hdl->UPEOI = 0;
- F5 @$ ~) u ]- z0 w; ] return ret;
1 ]! E( T! a; T! A1 `}9 P" }) N+ y" u& Q$ y# [. G# _$ T
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):/ J6 c. C/ m( t, h; \
#define upp_dma_sendstartQI(x) {\
* q- R. M5 P6 [) E4 T9 W Wait_upp_SendReadyQI(x); \/ e$ W' T' T+ B0 @% j: C
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 P2 q' m7 Y+ L' ] upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
* e9 ]) z) O1 J: Q: n upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
4 M2 B9 y7 X5 K- h1 Z: y }2 W. A# \5 i& q5 i8 ]8 {7 W2 `7 b! o
3 }6 w8 p+ A- O$ [
' {9 Y1 p7 p/ K! r1 l2 t#define upp_dma_sendstart() upp_dma_sendstartQI(I)
% j) M; t1 v0 Y: c0 z8 ^ W0 P7 i) d
. h/ f3 D" u8 O, S想知道uori错误是在什么情况下面出现的,好做出修改。+ l5 F$ |3 V. p9 k& \, K
, S+ Z" X2 b2 }8 F/ [' `& [
/ I/ H, K3 m2 T |
|