|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?, N2 j+ c3 N! w0 [
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:& n' {2 N: U, S) C+ q, r- X7 j9 I
u32 UPP_Isr()" {9 y! E# y% R! w
{
: \+ l' k- j6 d+ R Uint32 intr_status = upp_reg_hdl->UPIER;
, }, z( R1 ^9 B, W5 v. @ S upp_reg_hdl->UPIER = intr_status;//clear
1 G. |/ B; ]& K4 b- H// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
7 G' V6 D/ ~# @% b6 l3 L5 m8 E u32 ret=0;
* G$ B# j: ~" ]! u, D' O
* o, z5 w% ], c" x4 @$ ]; w+ [ // inline functions
8 e1 r! B j5 z' w while (intr_status != 0)
' }* ]9 b4 u% @, _ {
2 W r7 c6 M- O8 H if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件7 h' v# K0 a; d2 u0 g5 W
{
( A# ^2 d( W) t8 B// Log_print0(Diags_INFO,"eoli.\n");- D: }; R5 x9 _: O( t# }+ L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);6 t2 N, A. [4 d9 J, u$ T0 V
}. {5 o# H0 s, t5 D& P* e
8 K9 t( A; d s
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件. `1 N# g) K8 i8 x
{6 p6 t1 |2 \& G9 L
Log_print0(Diags_INFO,"eowi.\n");# T2 d6 j* Z1 S# @9 \4 y; M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);, A5 Z5 P& W5 P: G+ O) j# x! V
upp_interrupt_count++;1 h7 ~; S# x. _- R; M
upp_interrupt_eowi_count++;4 J8 c; N! w7 B, _4 A
/ A/ E) D+ J! m* [" K. m
#if UPP_DIR_QI==0
% z1 @" S# G) M upp_dma_receivestart();
2 x) E+ N5 Q6 \* q/ n ret=1;$ D' C$ V9 q$ Q0 M
#endif; P9 W1 E2 b5 w7 e* ^
}
) O+ M8 w* l- X2 m1 X) D
0 i: o: }$ C# w# K1 | if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
" d3 [% O( F( u# E. { {
) s+ ~9 C( I% j Log_print0(Diags_INFO,"erri.\n");
9 O& B! g# Q, Y- b5 c5 k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
8 b3 [! ?+ J. w upp_error_count++;
" s6 T6 H r( |3 k/ j. ?. A8 I! } }8 X( T2 n: u' A- t
3 U1 \4 f6 E8 S T% l
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
6 m" I& o c2 K {
/ {. g4 |$ x" R" U( h6 Y Log_print0(Diags_INFO,"uori.\n");
6 T% K+ ~: I' o* E! D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);/ {! F: l4 {1 @3 [. A1 [0 `
upp_error_count++;
8 i% o5 @! i$ R. E q }( N6 }5 T1 ]; J- a/ E" _% Z' Y% g) h
9 A4 @) }' x* r4 j if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件% |, {& G, G5 Z. h5 y- F
{/ P+ ?. l! G5 t# Y
Log_print0(Diags_INFO,"dpei.\n");' X$ i* V" v/ ?9 u$ L Z, p
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
" G; |/ b+ y4 \0 c5 S! d upp_error_count++;
1 m; c1 y/ k/ q& i; o2 C O$ a0 ]1 i }7 g+ g& A2 x/ k+ S6 z
( L( k J( t$ }' z& ~0 C: y& S
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
$ r1 k% ^1 W: D" p! i {) h6 Z- v* I% ~! N
// Log_print0(Diags_INFO,"eolq.\n");
+ b X4 i4 N, ^7 E7 I+ V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
" ~8 ?$ N: v% i9 y% e6 c }/ N: ?1 k4 b; _6 ? f; K2 k
C; n: g; W. a. t( F7 {" q/ i+ J if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
- h* C6 B! `" ` ]4 @7 E' A {* S* l% j. A3 i4 k) m- R% l
// Log_print0(Diags_INFO,"eowq.\n");& V) M' G) T5 Y X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
/ {4 z! @% q+ F9 C* E! i* Z upp_interrupt_count++;
* z3 N+ Z! f$ I: S+ B#if UPP_DIR_QI==1
8 h6 a6 L1 F% H2 F* h Q/ ^ upp_dma_receivestart();+ U4 V8 u, b, S- a% F
ret=1;) t2 @; H5 c- c$ A2 U. `4 }; T
#endif
F& d4 M. p3 L& y% L/ { }9 ]0 B8 h, F( [$ [6 A
: U+ @3 ?: ~, [% \" Q! ? if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
: N+ a# d5 C2 G7 o4 [8 a# m8 E$ R {3 G4 A a4 g- \7 B
Log_print0(Diags_INFO,"errq.\n");
# W* v6 O2 I, @ t) R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);* B& @: _$ g6 h" @ U h0 p
upp_error_count++;
* y0 w# F% E2 q: c- D q }! S6 r# Y$ F/ ?9 I2 C/ Y
+ B5 s0 L% R( k' { if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
" R) r) e" t% ^/ ~( Z' A( d" z* T {
# Q ]/ ~' L. u& I+ T% k8 n Log_print0(Diags_INFO,"uorq.\n");% g* U( U' n$ R$ O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
2 T& K( `2 a) G9 ] f; n; y# d% U upp_error_count++;
; l: w6 B: `+ t( E% B) h% l }$ W( f% K! E. ^: [% S" Q" n
2 e M) l/ N7 [5 P! q
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
- `$ G) @' J6 S5 ^" |0 E {
( P5 B9 ?1 ]- R% G Log_print0(Diags_INFO,"dpeq.\n");
4 j# p; N9 H0 V7 R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
: H5 s8 D0 d- R) g9 _& N upp_error_count++;
# P! {# {. i6 w }9 g z2 z. o k# s) A; P9 s
. m! [) `! S9 [2 `
// make sure all interrupts are handled. k$ K. f z$ Z" k( U, n0 A
intr_status = upp_reg_hdl->UPIER;
! a7 g& K5 |! h5 M' |; z- k }7 a& C0 I* M# e6 P% l! }
& C7 `2 Q: C, M7 k: p // finally: write 0 to EOI register) @9 y% k0 u, \
upp_reg_hdl->UPEOI = 0;
; f& v I" [: \" Y return ret;) o! J# Y/ H6 J. j7 N3 R
}
/ j; q9 c9 p) T o8 {, Edsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):- D7 g: x$ [& p1 L+ |7 g
#define upp_dma_sendstartQI(x) {\( z; [0 F. S m# s# Y+ o2 v
Wait_upp_SendReadyQI(x); \1 ^5 \5 t+ h4 I2 e
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
. O2 R+ v; O _! X; L upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
b6 i) s. W$ B( s upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
+ g9 j2 D- Q% |! w; o }" y8 ^' [& C/ W3 P% g1 K$ ?3 a& H& Q
. G( e6 |4 V/ P' x1 i& c
9 n7 M, t7 R# u; \7 F1 \
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
# V- ^$ k! z0 Z7 S) c
# v# X* i- s2 ?
9 _. @: l3 O$ ?# T想知道uori错误是在什么情况下面出现的,好做出修改。 o. r) |0 t# g. V7 a& I
/ y8 b5 n: e/ i5 l0 |4 C6 F) d
% R* y' I ~# I% I6 Q# |3 q( ^
|
|