|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
9 ?% c6 F. T/ {( M& n1 Gdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
% |8 ^2 a9 c" l% w5 p1 c2 lu32 UPP_Isr()3 C/ T7 g- F6 b1 E4 H2 _$ g( a, \
{
* W# u2 P3 O. y0 U1 t Uint32 intr_status = upp_reg_hdl->UPIER;
3 |0 Y/ ~5 H2 _9 o6 j upp_reg_hdl->UPIER = intr_status;//clear
% q' v- y a' J3 n// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
7 b7 y, r7 S5 O; N' F u32 ret=0;
8 I& H1 [6 L, K! g9 S- B! ]! b( n6 x, M. i( Y4 c: H- o
// inline functions7 g" h5 R B9 q# M5 P
while (intr_status != 0)
/ X' ]( b, L. j+ i; p7 n7 P) W {9 V0 M* y0 X+ x3 r
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
& x$ H3 Q9 Q s7 S; ]/ v0 J" Y( y {
' C8 z: t' r6 T1 p# ^// Log_print0(Diags_INFO,"eoli.\n");
- J1 f& b0 V- M9 N6 x* w& p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
- l! F8 M' C" s$ c% d5 j% ` e }
/ @& T! y1 d$ `: z
$ u" d8 \# J+ V( J if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
5 w# \% R/ R/ U# ^* a {- C3 G4 ?; N8 M( O( W
Log_print0(Diags_INFO,"eowi.\n");1 Q# R3 j5 a. p# D' r0 t
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
' K* A. H5 \, |, S t9 ~* Z upp_interrupt_count++;
' q/ b. j D' M( f+ Q/ P upp_interrupt_eowi_count++;
+ {$ s) C, l, y5 w& f% Z2 N2 w
& B& k$ q& r( s" ^% Y#if UPP_DIR_QI==0' b' F/ [; `) I$ P- `
upp_dma_receivestart();
4 u2 B$ S/ {1 n- p3 n7 \* M ret=1;, Y0 U& h% X, e4 m& c& d( V; N4 F& ?
#endif+ @5 `" h% M1 A+ I8 l& K$ x) s
}5 O V. [' D5 H1 R7 ?
0 A6 _4 w7 A. t' P if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件! H& f1 a8 |. i. ^; Z' g
{9 N* E. ]3 z) J% d
Log_print0(Diags_INFO,"erri.\n");
4 C0 Q2 q, V, t0 A" \: D7 v) { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);5 X! H' [( M7 u: p
upp_error_count++;
# F. B7 a) z6 E* L* B" `. E; ?: k }2 Q; f$ k" {7 v7 m* v( m
2 L4 n/ v+ z; l8 _' l+ f0 |
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
9 A4 D. [0 A3 T U. ~) f {
4 e# D1 C5 n. i" V Log_print0(Diags_INFO,"uori.\n");' g% z, h& t- V' a. y/ E+ I
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
0 c7 Q: O5 V4 i- J& {" [# b4 ^) ] upp_error_count++;
/ |3 Z ^. |- [+ a- W* U$ `3 Z4 p }
2 g/ X/ e; {4 I/ z4 K' c' c. ]) M$ V( F2 u
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件" r0 m6 \+ ^8 g" O' P' L+ Y1 `
{+ F( c4 ~* a6 u/ W4 [0 c
Log_print0(Diags_INFO,"dpei.\n");! {+ r3 F6 {& I' w5 e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
i) v3 y: x# l: W upp_error_count++;5 J3 \& v' E6 L2 S2 r" L: w F, [; k
}
+ i' } p$ i' ]4 Z- i1 o$ ~. I8 p( y6 t8 L) T
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)# r# a6 R7 Q( \4 Q$ j
{
3 g8 Z1 ]1 E* o) _, W# g// Log_print0(Diags_INFO,"eolq.\n");9 Y' A# ?$ N! f: ]/ V f) _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
" N+ P$ q* C) k( ^ }
1 n7 e W. }$ \2 a, M; U4 Q s$ {9 q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
1 F6 v( z1 F3 [6 E {$ Y* ~+ [* _' z2 L" j( s5 O9 ^9 K
// Log_print0(Diags_INFO,"eowq.\n");
& @1 E# x8 |( v: J! g' t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);+ v, \8 }: t- p: s6 J- j! X- ?
upp_interrupt_count++;6 D; d( V6 w$ h/ O$ |( i* ~
#if UPP_DIR_QI==17 s& b: i9 z' B6 H
upp_dma_receivestart();+ @, O; X0 w* R+ ^. E! l* C
ret=1;) _+ s2 N# t& J. g# D" K
#endif
# Y- i' u- P+ B$ n. V0 |1 W }
2 B5 h& d, K4 A" v; k! `9 L6 `8 K" c2 G, Y3 |# ~
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)" e/ ~: a% b0 c; r/ `
{, M* s7 T" U/ ^; n- b! n
Log_print0(Diags_INFO,"errq.\n");' m6 r6 f! A# H! K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);9 s7 i1 j O+ P. s
upp_error_count++;
: {2 e# w# }1 c }( |- b2 i O) w
% B$ x5 q3 X- b0 ~ p) H
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)- H C1 B8 H' z& ?' x
{! ^0 X( W$ Z5 [. T7 _
Log_print0(Diags_INFO,"uorq.\n");
1 k/ c8 D" C9 d+ {5 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);$ E% e5 v y: m9 ?7 D! b% z
upp_error_count++;4 j- I% a/ m7 Y/ y5 C0 X! @0 x
}2 s8 M6 L p' I5 Q2 j% B4 a
; \3 D6 |8 v$ m/ o. a
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
* ~& h$ G- o+ t% _ {
/ T3 U; }& t. H" U4 U Log_print0(Diags_INFO,"dpeq.\n");8 k" ~- b! M) v0 u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
' t/ o1 A2 K$ ] upp_error_count++;
. v. s% N) A/ v }, P7 y) B8 }. B8 A. l. A
- y, t8 }5 @7 |$ g7 n
// make sure all interrupts are handled
* Y* ^0 ~( F. ~6 T* f& F intr_status = upp_reg_hdl->UPIER;
1 |: {% J! T3 M. ^4 P: d0 \5 Q }
. R" y! s( h2 U
6 z& ]* U# Y1 a! T/ e // finally: write 0 to EOI register* i6 \( Q% }& X# j
upp_reg_hdl->UPEOI = 0;# b4 J0 v, P5 ]: s; Y+ x+ `
return ret;
+ s1 x$ d2 T# n1 `! N# V}+ d1 P: ]2 `& Z0 f/ B- M7 K
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):9 ~- ^% t3 Z+ l6 S: B& r3 b
#define upp_dma_sendstartQI(x) {\0 s4 p" N, K9 }2 f+ I! s
Wait_upp_SendReadyQI(x); \. I: I' e5 h9 B! W; a8 M6 s
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
4 `( k% k% ]6 i9 X upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \/ D# g5 D9 [8 y$ X
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\/ ^0 q( b, Y( m0 ]0 [5 ] ^# C
}
+ ^% h! l" A) k2 R3 G$ [( h0 }9 A
6 e/ L# b$ @) i3 p+ A$ C4 L6 Q
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
: j6 c: u; k7 M& g- |2 N* _5 E" X0 m3 k2 W8 U* l' u
1 X ?) B$ y: f# K) a* ]3 O5 Y
想知道uori错误是在什么情况下面出现的,好做出修改。9 N1 S/ r: ?7 F4 X _8 D9 c' x
% k3 w) x- c/ }, _, F0 I' K
! \" G, g: y1 h4 ` |
|