|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
7 T7 s+ m. H- i$ g9 [8 z0 Edsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
# X Z; b& d1 Qu32 UPP_Isr()5 N: M8 ~9 ?5 Q0 P( E# b& \
{
5 z( _. R! f/ B1 F Uint32 intr_status = upp_reg_hdl->UPIER;
' P4 y, y" w7 ]8 H9 C upp_reg_hdl->UPIER = intr_status;//clear
6 R0 F7 {1 Z H" ]% o) n// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
! |! q% U2 J& w4 B# @7 F9 \. K3 z u32 ret=0;/ o2 ]$ o z8 M
; h. y; }: N. L# z1 L // inline functions
* Y# F! M9 ~0 J% Z6 b while (intr_status != 0)
" P4 q' D! k& s, y) W. L/ A {
8 y2 E2 n) l1 @% l if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件% L5 p0 y( D P6 p: |+ i. @+ c
{
( G/ b' y4 V) r1 V1 d// Log_print0(Diags_INFO,"eoli.\n");3 R* t1 g7 z0 K7 y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
3 t+ y1 Y m7 H7 z0 ` } t4 o0 ^: [# a
, w, Y& L( J" i# l: h3 y
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
) W8 d( Z+ D7 y {7 J$ k/ Y1 A, W
Log_print0(Diags_INFO,"eowi.\n");9 z( \" r3 I, g( _# ]& e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ }+ P4 y! R$ H9 [1 [. d2 [ upp_interrupt_count++;% o$ {6 d; s2 x/ D6 y, D9 t. z
upp_interrupt_eowi_count++;
5 ]1 r$ G0 e! B. k0 ]; h
n5 v ?# z4 W#if UPP_DIR_QI==0
8 I5 w( U. B% d; V' F; e upp_dma_receivestart();8 t8 t' o/ c5 h+ d, x
ret=1;
$ i5 Q! m' S$ m% v P/ d#endif& g/ R' ^- |. ^2 G# c
}4 n6 }. J3 O: U Y4 S) Y8 r, b
7 G* E- E5 i! a+ d) ~% F) S( M+ l# T
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
9 R' l2 I5 l" t$ h. |% E# A4 g {. u/ j, `" I7 p3 k1 j
Log_print0(Diags_INFO,"erri.\n");9 D( w) T. Q8 w- w2 n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
9 U' v) U$ L0 a6 b, Q9 y5 ~) b9 P upp_error_count++;9 f- b! B; j f' H7 A& [ c
}
! g0 F" J' x8 E3 I$ R$ \) ^) r. T& c# G" ]
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件4 V: E& z" N1 E3 i" n
{
1 d3 f) m+ o1 E: d3 V+ Y Log_print0(Diags_INFO,"uori.\n");% B m9 v5 k7 k9 u$ c! i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
. f1 V8 @+ b7 _7 o upp_error_count++;
2 I0 d+ M: j; \6 T1 Y$ H }
7 \7 ]- n3 V8 ~/ M# F
6 D; J: I" z' F/ k if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
( V- Q3 I# Q3 E0 }& O# m {( U' E- k* f# L& l: t, s" i# t
Log_print0(Diags_INFO,"dpei.\n");3 s4 i- m* W$ G# }4 ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
6 C1 z9 E3 x1 V1 x! _ upp_error_count++;" N3 P' A6 m1 g" D* _8 o
}
' ~. E+ `5 }) Z: u# L) G% `% e' o
0 z3 c% K- i0 i( L) Z if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
% z9 ]/ C: X5 `. b1 s7 p: w) g/ h { _6 v( u( _( T1 [1 m x
// Log_print0(Diags_INFO,"eolq.\n");
6 y0 B& o _& H4 f: C3 C, _4 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
% M* z/ A7 @9 H9 ]4 u9 p }. J( ]3 U _% [& ?( u. B. A) v! z
; ` M9 [, v4 i4 W if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
3 V2 h/ d8 l& d0 e1 a' N {* J1 w% P" U& O, X; a! h
// Log_print0(Diags_INFO,"eowq.\n");
0 L+ r7 |; t+ m& {# N$ s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);% t% C/ e& A7 n3 u4 D' N. _, H$ w
upp_interrupt_count++;
- j6 N) P8 N" q( j& l#if UPP_DIR_QI==12 t0 G( f2 U' y4 M! Q# \7 |
upp_dma_receivestart();
- _' P% ]+ S# F' x) H2 P, H, Y# u' ` ret=1;
' V% D( g% c1 u6 k& u M#endif* d6 Z0 k/ ^4 ~1 Y2 f, I/ w
}' c1 q2 W0 C6 w r5 H$ q
0 W/ W4 Z+ g. h if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
' |* n% v' T/ t& o% x' G {
. X; H$ \2 I7 p$ H Log_print0(Diags_INFO,"errq.\n");; K% J/ J2 O# g! K) V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
1 I8 q% B* K4 I6 O* T& C5 b upp_error_count++;3 Y! j+ h. r) Z' B! d. G* T! q/ t* A
}7 D) u9 {! M( z# R$ D/ s! c
5 v; A5 H: V: v' G0 T if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
; [1 ?5 P7 X& K) ]2 { {
: X$ E( n. \( K4 A" H6 D" W Log_print0(Diags_INFO,"uorq.\n");# w$ T, J5 A0 Z& g" B2 ?, k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
; v$ E9 o- I" H- E upp_error_count++;
H, \6 F( r' M) u4 ?2 K1 G }6 _5 ^) B, W) _9 V0 b' I K
# ^) C& P9 D X5 @+ ]3 a/ K* q7 @9 x
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)5 [+ o7 r+ _- ^; f! K# D$ H
{
0 e% w2 v1 E4 z R Log_print0(Diags_INFO,"dpeq.\n");" x1 ]4 `' ]# F0 ?2 V$ f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
% x" T+ R; b* q( @# X$ c8 e$ D upp_error_count++;) H! V9 U4 U3 U2 ^$ V: q
}
" y: p2 i5 j' C( ?9 k( ^* @, d. s4 P# D1 c- u# D5 `; b2 _
// make sure all interrupts are handled
+ @4 d& B; L. [3 O- H+ f0 s3 w7 I intr_status = upp_reg_hdl->UPIER;; U' m+ i; S8 J' n
}5 n6 Y# h8 S: s1 t8 Y
* p! W2 z1 E) m2 F( s( F // finally: write 0 to EOI register
1 V! `) Z0 ^2 a5 S3 c upp_reg_hdl->UPEOI = 0;# H0 X. r! E! _
return ret;
3 A$ ]4 I. n& [; u* D}* f$ ]% q& P! ?3 U+ [8 ]" D" C3 U
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
5 X* ~: J) D9 @& ?#define upp_dma_sendstartQI(x) {\% K: F, \9 _; ]1 r: d
Wait_upp_SendReadyQI(x); \
' U9 P1 D+ h) N7 T9 G( f9 p& z upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
3 X# V! [' r C% | upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
" ~' A, i9 z4 p; k8 x$ |1 o upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\6 M- h2 @! M5 Z w
}: I# D5 u$ \& ~2 D/ J% V2 Q* G- ^' E+ I
0 S0 ^0 u) o0 I
. _& ] E; F9 Z4 M6 R#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 L7 O$ k. b/ B# s( `: h
! \/ y+ o; c9 G
/ b p% R! X% l( r' \' j" `# ?5 v想知道uori错误是在什么情况下面出现的,好做出修改。
+ k# k# U& Y* F& ~# | c5 r3 K Z/ B" s/ T- I' {" D" W( Y5 \- K5 X
/ i C. A0 n# @8 Z. ? ~
|
|