|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?9 q2 |/ O9 R# M5 I$ V z+ h7 h' h9 i
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:% v+ a& U; {: J" I6 j: K, w9 u
u32 UPP_Isr()& a5 Z0 U# |/ a# I$ R# l$ J1 W, ^! s
{$ Q' x( L& b1 I9 b; H4 A3 O
Uint32 intr_status = upp_reg_hdl->UPIER;
9 q ^- s" F! s; s- A upp_reg_hdl->UPIER = intr_status;//clear1 M* |- `$ ~1 h2 }4 ]
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
! Q" V* h% N% k. D* @: W u32 ret=0;% v* }( B4 Y, L% a- S' f
0 D: c7 M. {0 s6 H) H! `
// inline functions
9 _) ?' B) M) r" E7 j while (intr_status != 0)
2 {3 P+ z8 C% u4 y) a C {$ A$ v6 P9 ]/ ~; t1 r" i
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
% G1 M9 S- G3 ^$ R, b8 y$ ? {; ]6 B. w1 V7 c6 k9 `
// Log_print0(Diags_INFO,"eoli.\n");1 r4 X$ w5 R9 X5 L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
& {, ~! v- y9 g6 {" w }
* \# v, I) U. I$ X2 s* {' `( v( `/ `5 _; U( u
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件7 [/ n8 e. ]6 F6 [9 Q& b, o/ _; [2 n
{
$ ~) o8 m$ X6 t. `* v% C) A( x" ? Log_print0(Diags_INFO,"eowi.\n");
; w- n6 U* M& b5 g" Z1 s( l upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);* S x7 A. b8 {) V% ^* a
upp_interrupt_count++;
) u! o4 j& E$ t1 T# |0 }8 o) U' r0 @ upp_interrupt_eowi_count++;% a9 g2 F6 [# U$ K/ A/ b8 v
1 E& f7 I1 h) f# c+ _
#if UPP_DIR_QI==0
0 s& C; S6 X" B4 f upp_dma_receivestart();
4 f8 D F j7 D& K I! w ret=1;
' r4 n& J. P' C5 [9 T" C! B#endif
( f6 K; l0 T+ { }
1 H# [4 ?9 c) E% r& h. k
4 _ x1 u4 G1 R5 p) O3 v/ h if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件! U, C+ C* {* M& [) L: ?! z$ O
{7 I. f# W( \) l7 a. N6 @
Log_print0(Diags_INFO,"erri.\n");7 f! B$ v7 e) X: N# M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);5 p3 Z* a3 @) F, w
upp_error_count++;" w$ g' l J& H3 b/ o: W
}* L4 ]: u. P7 c: y% _
$ T1 B) {7 s* [/ y% P if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
' {1 j4 F$ R* Z" [! H: m7 J/ b {
5 Y' L$ Y* G2 _+ H Log_print0(Diags_INFO,"uori.\n");
: \/ X" n0 `9 e- B) v( m$ s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
% V$ _: b9 w, a upp_error_count++;+ h8 I# e/ ^ d( \8 \3 {
}( G+ f3 P$ l3 y8 h8 O6 p% T5 G
Z; ^3 J" ?+ h5 ^1 T7 W. X if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件* Q0 @/ G8 s; S# n) o9 ]: @" \1 W
{
% o* v2 M( W% {3 M3 U; c* I Log_print0(Diags_INFO,"dpei.\n");
) ]$ A- }( ^7 U6 m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);2 E/ [# I0 O: m1 l2 p5 T
upp_error_count++;$ N; | l# u. `
}+ a1 p. ?& N+ w$ Y) h4 b$ j3 Z' d
5 t5 N/ O5 ~& X0 z, e4 ~
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
* S+ S+ D. g; k1 V, u( H% O: L {( r K; z7 B; p
// Log_print0(Diags_INFO,"eolq.\n");
: i1 F8 o) T3 C( w; y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
3 \( k, P8 B W ~' m- E }
$ I3 J; M/ l; Z- }( K+ H9 o5 C$ G! z& z
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
( P& G# j T: j {
' U6 K4 _- S: S/ F! i4 }// Log_print0(Diags_INFO,"eowq.\n");
- D% y" v# g- Y; N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);+ {; w3 ], f" u' Q0 Z, d
upp_interrupt_count++;: ~# C6 S2 M) a& O% o1 D* B) p
#if UPP_DIR_QI==1
5 d( m! I7 B( X+ w0 S upp_dma_receivestart();+ G* C" C; g0 i- \% m
ret=1;
% T- p1 W/ J7 } o( @#endif
9 i8 u+ P1 N. _# w }
, } q4 c; g: G0 h1 u
* w# _( g, B& E Y( _ if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)2 v- j& p9 i& O" w
{) m, H1 n5 W$ _9 e/ X: D
Log_print0(Diags_INFO,"errq.\n");0 z r3 Q& L. U3 G% s! c% A% V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
/ B# u/ E: \! ^/ u/ A5 S upp_error_count++;
- \9 N+ {/ H( B9 g5 |. y }% @: e& R# K5 E/ f% b* K
) A; L4 a m1 S( ^3 L" [
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)& a9 p; O, \) V& q t
{
; E% [5 k9 D$ |0 M; T# p Log_print0(Diags_INFO,"uorq.\n");: D& s1 {1 F6 V2 C7 L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
7 I3 _' P7 w: S upp_error_count++;0 g) G7 g% v6 [( [# _1 n
}- W) v. s; b3 h% _) \0 a
9 d( y+ n% a) H! Q! Z if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
8 ]' d* G, g: C {
b' J; E8 @3 w$ B Log_print0(Diags_INFO,"dpeq.\n");# X9 ~2 [- q0 S) V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);! e2 y- X/ R; Q0 M% |
upp_error_count++;( e$ E. }4 e0 \; G7 B! p5 V% M
}% c% P$ c; S" h3 `% {7 _" |3 ~
& ?& K8 g/ g& V. B+ A! l. {+ m; f // make sure all interrupts are handled
* X j. k/ r# u3 s3 T$ R intr_status = upp_reg_hdl->UPIER;: k% B) Z3 C4 t& [0 u% c
}" F3 I& w- X$ w+ l: e3 e
8 z: h& @5 Z' F: J9 ? // finally: write 0 to EOI register( z4 r3 \8 \7 A' p
upp_reg_hdl->UPEOI = 0;6 {& _& P9 t1 G' Y4 A$ ^
return ret;
5 \! ]" y, S2 f- W6 z" S1 X! O/ y}5 A! \- }# j6 ]% x
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):+ V9 v1 O# t& a' R9 W. ^
#define upp_dma_sendstartQI(x) {\
: E' p ?/ E* y: e Wait_upp_SendReadyQI(x); \
- {( p; X- a# ]8 { upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \! e: ~& r1 i B3 C! k9 ^
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
' Y( R% N% h, u! Y) g, { upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
7 F) r1 y! M$ u8 `" f }2 E9 v* ]' P7 | A; h! S
6 y2 y# P- U$ {( V4 l7 b9 Y$ |
- u6 a% {( F3 O# ]' ~, g#define upp_dma_sendstart() upp_dma_sendstartQI(I)
- D1 l, d2 d3 m$ z4 L0 k5 z
: \3 k$ G6 ^1 l
" E* B* w* a$ w想知道uori错误是在什么情况下面出现的,好做出修改。6 h. R6 o! o! p. ?
1 |+ ^* \+ S# q. w
% a, S) C( @5 X |
|