|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?2 ~9 Q2 m, ^- K) H/ G# s8 W; Z1 z
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
- B6 @! y# I- c; Nu32 UPP_Isr()
5 f6 O3 P# E9 S- Z2 x/ G- j* }{
/ \# O1 V L5 M4 R# @( u7 x Uint32 intr_status = upp_reg_hdl->UPIER;7 o; Y2 ?) {6 ^
upp_reg_hdl->UPIER = intr_status;//clear: e8 B3 K2 a, P `" |
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");# w* v* ]0 N" t
u32 ret=0;
" y# r' v2 H" K i0 W: n* D) O1 K3 x; b8 e' X+ C" `! V- ?% b P! t! e6 K c
// inline functions- m- i3 k- b# ?: r# S' j2 _6 V
while (intr_status != 0)
! ~0 C4 U" V9 L# `- Y! s" v* e {
+ Z, |2 |$ n5 @& ~0 x8 V c if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
2 R- B8 h: O& c {
! c8 |) t8 @- E/ ]/ Y! T7 h// Log_print0(Diags_INFO,"eoli.\n");* y- U8 `# ]2 X& Q) V& h
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
8 E) S8 y1 n9 F' m6 H }+ ~& H# q/ y/ `8 \( f
4 g( _" F, s7 n( \: G if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
, w$ ~( q0 Z6 l! W- S( H2 p {4 Y' w7 Z% L7 z/ B5 D% K# F
Log_print0(Diags_INFO,"eowi.\n");; }+ L- d# ^5 Y* N3 h' S0 R* Q$ [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);7 e+ G! d1 F& Q4 R& A4 X f5 W8 C3 u
upp_interrupt_count++;) [" V, ^- E" A5 @* s0 p2 }. q
upp_interrupt_eowi_count++;1 n( x& L4 o7 S" Y% i
! o% g7 x/ Z2 ^' ?#if UPP_DIR_QI==0( x0 B i: \: V7 T- m
upp_dma_receivestart();
+ M+ c% j Y5 P$ O ret=1;
9 D: q) {, |& a' G- S#endif
: _ _+ Z4 B4 g3 r" n& w, g }
V* G- D! m. y4 a/ I5 d" H% x
^4 P3 q$ p& K if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件6 J* A' |" j) X" d
{& c& v+ R' W N4 o$ C
Log_print0(Diags_INFO,"erri.\n");2 |5 G: a; p/ X; b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);. E. l2 }" ~0 S7 P9 a7 v' ^
upp_error_count++;
1 T/ Z7 n, H$ h7 G }
8 U7 a" Q$ x3 d2 d
, y( X4 Q3 z% T! z* d' [ if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件- L. N6 o% l- S' M# V
{
X% j% i$ D4 u: d: i Log_print0(Diags_INFO,"uori.\n");4 a0 u, Y, p/ g1 V; s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
. @% v% V% |1 \& J- u/ w' X upp_error_count++;- a; n! @1 P% [ t
}5 D8 d+ g; a; X0 e. Y3 o; k( g
4 X' t/ R5 n5 a) w- z! R
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件' R* K2 d' v" w7 |) f: D: l9 W
{
! K" l+ P: Z( l5 j3 R$ f Log_print0(Diags_INFO,"dpei.\n");
% `& w/ A1 D0 ?) `# S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);8 ~, `: B/ @+ e) K0 h4 t/ U- N
upp_error_count++;
$ ^( Y+ F; B& l2 j2 a$ m2 f0 e }
" Q% k# g1 g7 H/ `% h$ R; z z. ^" c
* b9 f2 M5 c2 I6 `( {6 Y if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)+ `1 m7 b- L9 `4 H
{
: u }1 D7 C* P9 I// Log_print0(Diags_INFO,"eolq.\n");
0 M% M+ G& t! S" D3 I. U0 I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
& T0 \( x8 G2 e1 _/ R5 p }
$ r, D# {7 n1 J. }" E5 {; o( I5 ~( C! b- q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK): l- {8 I$ V. a3 Z) @8 S
{' B% t. f7 |7 u5 f
// Log_print0(Diags_INFO,"eowq.\n");
- B; {1 b$ I; n9 E% W4 D) k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
" m$ C- Q6 a- J6 r4 V/ z0 T( i upp_interrupt_count++;% I$ j7 v' j! D, M! M( ]
#if UPP_DIR_QI==1% }% K9 A' R9 |4 M. }" D9 c
upp_dma_receivestart();) h3 X' k8 w9 U4 U; Q( t
ret=1;
5 ^/ x5 j& Y5 b! ^* b* V: {#endif
, _& L* V2 k! P# Q }) s. v7 T8 B8 Q3 p2 Z' S! c+ q/ O" M
4 {( Q" v5 z4 I1 X if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
/ o8 O9 P6 D; i' T: }9 H6 d" q {
3 m1 F) C' B; ]6 T$ ` Log_print0(Diags_INFO,"errq.\n");9 W* P( L( m+ o% {/ ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
* l2 u' \$ U* ~6 ~9 } upp_error_count++;8 Z |' ^$ W, M3 I" P7 D3 V
}; \6 F; p- \) u0 K! x; y
2 Y. H+ V" z1 Z# U' G; x, Y0 n9 K5 d* L
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)$ o4 f) c$ i: D
{
" f6 B4 v$ E. d/ _: B% t Log_print0(Diags_INFO,"uorq.\n");" |* m' v- \* |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
5 R# J. T [ b: M" G* O upp_error_count++;
8 p Y$ B+ P! u }
5 l. m8 P! C% L
" v+ @6 k2 y2 e# Z' {- G. X if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
( U- u; M3 K$ ]! A+ o6 G+ Q {) f' _) q+ M( }1 s+ Q! ^& g
Log_print0(Diags_INFO,"dpeq.\n");
8 \( u. B! l, ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
1 O9 W9 e- P) S, B upp_error_count++;
' Z8 `1 {4 c Y3 Z: k) t }0 N9 n+ w2 K* [( y$ u' a! B* P& x
) h8 {. w D( z: X1 Q
// make sure all interrupts are handled, J& V% H! w1 w- |4 k# Q% h
intr_status = upp_reg_hdl->UPIER;2 X2 y9 L v7 D% s
}* Z' o1 w. E7 h1 s
2 ?& [, G. V4 H // finally: write 0 to EOI register
7 Y0 E# U$ X$ S upp_reg_hdl->UPEOI = 0;: n( O. B4 g7 O/ O- g- K4 p" F
return ret;# ?, J9 Y+ K' a/ k5 n4 U
}
) z3 G9 K1 j4 U4 [( m edsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):; O0 y) |. Q# ]4 F' l2 f. a. s- |: t
#define upp_dma_sendstartQI(x) {\
& J$ @) I; O3 X( h6 l$ o3 G Wait_upp_SendReadyQI(x); \, _/ m ^' ?) n6 l! a
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \" k5 P' H9 W- Z" s1 [
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
+ }2 ~ Z* h* K7 U; ~. I& ? upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\8 o% G Q1 Y2 [+ f* G1 N
}
. C$ x, |" J9 ?
0 g* c) j( E& |
1 t5 C" K4 c6 O#define upp_dma_sendstart() upp_dma_sendstartQI(I)0 D0 s: ~ w ^+ N! Q
. D0 z: C& |; U- e; G
8 u# B( @: D }% p; ~想知道uori错误是在什么情况下面出现的,好做出修改。
( u6 [, h' q* Z" t- x$ ~0 m) O5 A7 f! N5 W3 Z, y
) _/ [9 K. [+ d$ d! O A) u
|
|