|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?' }6 j( ]. I- X5 F* u% C5 q* c
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:9 V6 @' h" t0 v: q" P( `7 t h! e
u32 UPP_Isr()! |7 e1 X# p6 f4 Y* K+ D
{1 r' e" b& ?& \# r
Uint32 intr_status = upp_reg_hdl->UPIER;8 R G7 {* z' X' l
upp_reg_hdl->UPIER = intr_status;//clear
( ~% e7 z* d3 K3 E8 W// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); V( B0 k' C# s4 d" d& f
u32 ret=0;
7 f! h# C& o! [+ g; |
3 C! o+ M( Y- _6 Q // inline functions- x. O6 n5 g0 @# @4 B
while (intr_status != 0)3 U6 p/ L0 c- D7 b
{
+ H) U% V' S! B; g7 t9 n5 X if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
, R; x! [& G/ S Z8 A% a: @3 Y3 e {
3 J2 A: O2 L; F/ `4 v! S U2 J% B// Log_print0(Diags_INFO,"eoli.\n");, C0 _! j1 D- V/ i/ P5 v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
; q/ r; g$ |. r! z Z+ n' G2 ? }4 g( o9 ~% E0 L. B. V
. W) W/ b: g' J. W: n, f3 h if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
$ X! n- S; b3 A! q! [. X! ] {* w! M- U# a6 r" G
Log_print0(Diags_INFO,"eowi.\n");" k7 ]# S; j- P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
+ U, O Z: p3 `8 K9 Z! P" o upp_interrupt_count++;
! ]( z$ D8 V7 x5 S8 b' o upp_interrupt_eowi_count++;1 o7 ~% Y* x1 ]- v5 k' V0 u
* O3 z# [0 N2 x% t0 C9 O/ }
#if UPP_DIR_QI==0
* K; g9 e( a8 L) d! Z" m upp_dma_receivestart();
3 v8 L6 z3 _- L, u. `8 P& j+ @. W) |0 g ret=1;; M* b% ^. E& T+ h ?. S P% |0 ]
#endif/ j) A/ {& X' S7 a+ p: m. X& E
}: l; G# T/ K/ b8 q7 U$ E7 j) a3 F
& {* C! b, T1 Z5 P& U
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
" Q* Q. E! Y- ?1 T {8 ~: L$ ?% p2 N
Log_print0(Diags_INFO,"erri.\n");0 f/ t& j) x1 t/ b7 q- t
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
: J& s& g8 P) G% _8 W Y upp_error_count++;
2 l2 w) G' J- C8 n& {4 E2 q }- c0 a) c, g, {% _7 Y9 |
$ Q, d8 U3 z; _( Q. |9 v' L
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件0 L0 w2 ^$ `# X; q+ |! w- R' _' @
{
8 V. o+ _ f$ _( R1 N" g Log_print0(Diags_INFO,"uori.\n");: O" {; l* q- ?- O K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);' f" Y: K5 E( ^2 I3 w% y: z, _
upp_error_count++; C0 m# w" j0 j4 E) s
}
3 m0 V$ X* I7 K3 E: b- }
+ b$ E6 E& ]: a8 X* [+ I if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件6 G+ N9 g8 \6 L" h2 N
{
2 c: }) W( S5 \) w1 O; v Log_print0(Diags_INFO,"dpei.\n");
# N6 B9 Q: ~: W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
% u6 J- E$ W# o* r/ A upp_error_count++;, C7 G {+ n8 p9 N
}* \# k6 O9 F9 h( T2 D
) j' |8 X* Q \& s# `
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK); i; d7 `* h/ C5 ^
{2 r' Y# c: z2 t6 ?2 C( G
// Log_print0(Diags_INFO,"eolq.\n");
% q+ \9 o: g6 a( e. G4 L3 F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);4 C" J1 _3 F. W6 A
}
* n8 ~7 S' Y w+ m/ Z' h* a" `$ u. G
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
4 w- L0 K) E, @' \3 r {, t: F* Z. {8 d6 \7 }
// Log_print0(Diags_INFO,"eowq.\n");
& P V( v C h( I4 i6 ^7 H% k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
. \ c% b& @# Q( m0 g4 e upp_interrupt_count++;- x# T6 T5 m1 @2 |8 ~( s
#if UPP_DIR_QI==1
. b( \% n) ^( b, l+ t upp_dma_receivestart();
) ~) p9 I: W: S+ U ret=1;7 }# Q0 q( |2 k9 E
#endif1 @+ D. `2 o' ?7 ~0 g: w, i0 B$ g+ j \
}( Q" ~6 c$ @' T. |1 ~6 Z! m
3 t7 n2 ~7 t! L, N: T
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)% |5 @* b+ ^6 f
{
1 v; t5 W) G8 Y, q1 _; ^ Log_print0(Diags_INFO,"errq.\n");3 M7 @( R; A# O! N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
1 E, w0 y2 w4 G% K& T# D9 ^" n' D upp_error_count++;6 y( E3 o! N( t2 w5 D4 N
}+ {% Z8 O1 O. V; r/ R0 l3 H# k" v
1 V( v3 a$ m' @ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)4 d- A( s- c! L% f" s+ \
{
& ?& t# L+ k. B: q# q Log_print0(Diags_INFO,"uorq.\n");' C2 F: S) b0 x8 ~6 g, z/ e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
9 ^' v( I. M% r# l0 v; @& } upp_error_count++;" b; a* o0 }) |
}
' p1 m/ P) j7 E# u% o4 l+ b g% v1 W7 K' X$ [! e3 a
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
' s* L* m9 V4 S y* L" d- o {0 G8 e' l; i+ n: M3 C7 l- p
Log_print0(Diags_INFO,"dpeq.\n");
3 ^7 n! t S4 ^' i v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);# S+ Y5 Z0 e- e2 `8 o% q( J
upp_error_count++;
4 x5 I5 ?6 ^1 Y5 r }
8 L5 w- T+ Y5 }) o
- i/ T: H6 ~2 c, I g# s& U( Y // make sure all interrupts are handled
: ~8 w0 i+ _) x, o* M5 }+ @0 c# H intr_status = upp_reg_hdl->UPIER;9 c6 X$ B! `' X; F; y' D* l8 x( _, C3 a
}
& I! S7 M ?- v2 r, ~9 |
. S: u$ o2 S1 P8 }1 M# V! p; x // finally: write 0 to EOI register% g" Z9 `5 @: N) H1 [1 R0 f
upp_reg_hdl->UPEOI = 0;; W& i, s3 m! f3 i2 U2 ?( T
return ret;
6 M" C1 [. J( c& b6 n8 Z; K1 G* e) J}( h8 X: \" E0 \( q
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
3 [1 m- g% T5 a1 \#define upp_dma_sendstartQI(x) {\# |; f- R& x, I( p+ i
Wait_upp_SendReadyQI(x); \
D+ w. o9 C- `( X) o upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
; P+ N3 D; Z* k1 u upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
4 c. W* ^) Z8 F5 Z. F upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
0 r+ V, u2 h8 e: K }
$ p7 G: S X4 i# s
0 U9 f( `) h) w8 \ E: L. z9 g }, \1 o; X5 z
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
8 L5 v' z# m- P$ o) a: n1 C' X- l6 E+ Y$ l. X0 `) v
* A M2 V' Y* t* L# C! c4 K/ U
想知道uori错误是在什么情况下面出现的,好做出修改。; _3 Q9 ~! {6 I: h6 H$ v$ \& o& Q8 A
7 Z; c/ @' Q$ g; ?
# p1 k: T0 O) m |
|