|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
# i$ ~6 i+ X8 e) n& R2 |dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:& `/ K2 G* S' J
u32 UPP_Isr()
) _4 M- |0 Q. A8 ~: |: _* C' r{
; A+ f+ Z: O3 F" |( u/ R0 U4 P Uint32 intr_status = upp_reg_hdl->UPIER;) F; p# B9 h/ g. T& d+ `% P
upp_reg_hdl->UPIER = intr_status;//clear
! e4 d$ i" G" _// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
1 E2 o6 x8 l! d" V, f: `! c u32 ret=0;
) e. x% R- ?% L/ f1 U' L0 J9 Z1 C9 z( s+ h
// inline functions
+ I5 l" C% Z5 M while (intr_status != 0)* {9 A- P& y, v. t
{
3 o, S& N3 s7 N4 G9 y# l if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件4 M, v+ J5 \& U+ V/ k. R
{
% f2 |6 F0 X: {1 T( d2 q// Log_print0(Diags_INFO,"eoli.\n");
0 Y8 J" B3 P9 ^ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);0 r6 l. Z3 q/ z, B5 D+ q
} @2 I {! k6 m$ k5 @2 \& H9 _
4 W; w) T4 z, t# q5 z! M
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件" C& K5 U" p; Z& F4 U
{
' s; d$ M$ S5 U0 V/ Z6 q Log_print0(Diags_INFO,"eowi.\n");
# H3 y3 T# h$ A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);8 J. a2 M; j' ], _4 a' l5 z& _' [
upp_interrupt_count++;
' T5 c$ H' J# g+ } P+ g! e upp_interrupt_eowi_count++;1 v* l% _% ?. L4 _
0 ?; X/ {1 `0 j& b; P( C
#if UPP_DIR_QI==0
) K) u& I' P% O upp_dma_receivestart();
, Y; r6 h: `3 Q. h9 g1 z9 C: G ret=1;
- o6 j% r F9 S( l7 a: b# F& m) {# Y#endif
- A: ?9 D) f& ^( k6 q. o }
" _5 E7 x8 ?" C( a/ s O/ W) V( R$ R# R1 W2 J9 j
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
8 A9 N( I5 T# E+ Y. Q6 R {) M& {4 l8 ?) E+ L; ?
Log_print0(Diags_INFO,"erri.\n");3 P+ d, s! P; ~ t$ j- v% W
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);, b) ?, `* H; s# @
upp_error_count++;. ?( i9 R9 {5 h4 f9 f4 q: \5 {
}2 z( _' H6 \7 \
* D1 C% W5 P0 t4 b- F4 N if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
0 B2 t+ L1 b# [3 T- D) f7 L {4 x- p2 Y# x+ }/ Z
Log_print0(Diags_INFO,"uori.\n");3 W" `) @) p% U) ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);) W$ d4 Q3 r+ l Y" J, g
upp_error_count++;7 Q- `( D9 f$ P: ^; l
}
$ c/ o$ Q9 P. J2 c1 h! l
9 t9 ^. q; T" X! W6 l if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
) O. H4 A9 v) E2 c9 T {
; v9 B, l3 v5 {1 l* ^* V4 n Log_print0(Diags_INFO,"dpei.\n");
8 O7 P9 Z' B, {1 N3 g5 v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
& D. \+ H. m) d5 c/ _ upp_error_count++;. E' e( ]" I7 p2 f+ y( X4 d
}9 z5 ^+ s6 N8 j! s2 C& g
, k% @0 ~& `- }2 L1 C K9 [
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
# v& \) ~1 W" D, b% R {
0 p8 P5 j5 | q) W2 u+ t/ \// Log_print0(Diags_INFO,"eolq.\n");6 G- W& k% q# Q0 N" V; y$ `+ l' p
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
. \' l5 u& i- D. @- n }
' r. _' K q) R9 ~# Q" o! n( s7 U7 M) F2 O0 K
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
+ C O% `2 I" Z1 v) X* p {
0 J4 x, l. ~& _+ W// Log_print0(Diags_INFO,"eowq.\n");. P% u/ s3 C# u, j
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);; \6 [9 u6 F/ f% e' a- V
upp_interrupt_count++;
/ T* ]# T' H, N5 U' D#if UPP_DIR_QI==1
% S+ R3 s9 a% }7 | upp_dma_receivestart();2 G* W1 r6 b$ x5 Q$ V( @
ret=1;
! B( E7 h e- h o#endif
/ S% m$ n: _, F0 H: q }' P8 N0 k4 m' |2 n- M
4 ~4 F) [" Z; V& ]& w
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)* X. V7 ~ U9 c, @
{- Y# C0 g/ U2 u' [+ D
Log_print0(Diags_INFO,"errq.\n");- y' a% G; O J: Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
1 a* @: h* R+ U) ?0 k* e q upp_error_count++;2 Q2 @- x) B8 R% F
}
" J- O5 J7 w# |, V( z# `" w) k# ? W6 q" E. T: {* U& o/ G
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
% }; m+ @& U' a- D+ `. { {% d2 P- A5 I4 I: G
Log_print0(Diags_INFO,"uorq.\n");% o& K9 R; X9 Y. B4 b7 r% k8 i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
s/ ~2 K* [# R upp_error_count++;
) V0 G/ ]9 Q/ o- M; D; [ }
' }2 h) | f8 H/ O/ q7 T L! [! Z# U* i" K, S
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)* F, b0 F! D, O
{
3 L2 X; u {7 ?! A6 _/ T0 D- K$ \5 I Log_print0(Diags_INFO,"dpeq.\n");
- G1 M/ Q: D/ c% N1 v P# J upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
$ |. O, j ?* z3 a2 `% x upp_error_count++;
) N L- U0 Z; I5 L* O# G- k) A }3 y1 i+ N( o J/ C. X9 t
, n% j: C0 i: Q1 a8 V+ [4 P // make sure all interrupts are handled5 E2 U3 m0 { B } i2 I
intr_status = upp_reg_hdl->UPIER;- L+ K: o) f! v! l6 i2 e2 E
}
: `7 k$ z8 E6 L; Z$ W$ L2 k( F2 v6 |0 Y. D
// finally: write 0 to EOI register
6 I5 X" B: i: y+ q# g/ ]. @: S. i# I upp_reg_hdl->UPEOI = 0; j1 \# [6 o& z2 j; f+ V! `! ]
return ret;: X* `# E) W* X
}% E! _1 e0 Y- \/ _* P" u
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
) {# @! O M* A, g#define upp_dma_sendstartQI(x) {\$ U$ z) n7 s1 w
Wait_upp_SendReadyQI(x); \: O) O4 q% d4 B+ p1 g. b! R
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 ~# F+ r! f( g( T0 h* S upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
2 S9 Y' z# v1 b* x upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\: k1 t) w& K: C8 s" P3 x+ |
}7 A9 j# a: U7 K# J
/ B2 |' G2 g# f
' [6 n$ ^) ?2 l% v1 Q' o, z1 R
#define upp_dma_sendstart() upp_dma_sendstartQI(I)+ a5 v% u: C r% d
+ w! U, S2 E5 E6 R- r" X
1 P5 D' D% F" L) I想知道uori错误是在什么情况下面出现的,好做出修改。
; J! `5 U, ^4 p$ V d8 A* x7 I5 L
1 |/ _& O( \" u+ J) R M
1 O9 n( X: s* ^5 c& ^; U) l |
|