|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
" c/ m H' Y" @dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:8 _' K; j4 `$ F$ k. O# k7 _7 n; ~
u32 UPP_Isr()
0 f3 r, M) g- V! e* e+ X: |( s{% A& I% R4 X8 U+ Y* Z& C# C
Uint32 intr_status = upp_reg_hdl->UPIER;9 X& q7 G3 p0 s# y& f- f' }; \
upp_reg_hdl->UPIER = intr_status;//clear- z' ?, n7 g$ j9 M* Y
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");: r4 X# r* t% B X; q
u32 ret=0;
% ^0 y- n5 l/ t) N( @6 a4 c2 b1 D# o9 a5 `- E( x& U
// inline functions
2 x' N3 G& l" }" C% n& V while (intr_status != 0)
% y/ y) T8 P7 _8 B. b0 }6 N- f2 h {' [ n/ g4 [ q- M+ y! T1 [
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件- P! [+ r; R. a" h k
{; [* Q) s1 ?0 m3 ^9 I/ X0 O
// Log_print0(Diags_INFO,"eoli.\n");5 x; n1 U" ~% k5 `7 P& ]' S6 ~( M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
) q1 F$ q, i+ Z$ I6 H }
( h$ K" y [' X7 C. \) \! b: Z2 I1 l+ i. ?, L6 K; X; d
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件 [' f! g) H( ?% g! _# q
{+ y7 n2 x+ ]1 d' K5 B T
Log_print0(Diags_INFO,"eowi.\n"); q0 X2 w2 L+ V8 p4 u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);# P0 w9 }! b+ j( A' |9 Y, D. Y
upp_interrupt_count++;2 e ?1 ~5 s/ q% v; E! p3 U: ?
upp_interrupt_eowi_count++;3 k* k8 }8 z7 r5 g9 A
4 \: z3 q. p- ]8 D6 L' R#if UPP_DIR_QI==0( J# I5 q- G4 i( [
upp_dma_receivestart();
- G9 A& S0 {4 U ret=1;- d. |0 H% t. @6 z1 ~9 u
#endif
# Z/ j" l0 J# r2 j6 B& v9 k* a5 j }; p8 r2 S) z& O/ \6 U2 @1 ]/ I& \2 {& ]
7 A+ m0 ~" _ k+ o' Y" Q if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件- G% U# A4 m0 c8 W
{6 L+ \! m! f8 K3 `. R
Log_print0(Diags_INFO,"erri.\n");
( u/ O& J9 B; s' c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);& K: V, I4 J" g% C6 z/ D; G" M7 a
upp_error_count++;/ Q+ r [3 m) R2 [* e4 M
}
5 w) U" t$ F# x v6 X6 u( t+ ^% P J; p! f. y- N, e
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
' y: _! Z6 P! H) b. H {
) b7 K- T4 h! V Log_print0(Diags_INFO,"uori.\n");
5 c- ]* U/ j6 C$ w i! Q6 {" p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" c) I& q9 h0 F. @( A6 D
upp_error_count++;9 g- W% E- ~! R# R
}
# p" k+ u) T/ g7 H' z3 ~$ N! U8 b* J9 L! L4 c# @+ b4 G, W+ h
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件5 O/ ]8 e6 Z$ i4 w% I5 p
{
# R2 r( B: F5 m$ } Log_print0(Diags_INFO,"dpei.\n");
% E5 t" s0 J5 b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
' L1 b& w* G! O/ z upp_error_count++;
2 @0 w- _( s+ f: _' X0 w, s }9 F8 _3 O0 m% j- [3 n% V" t
5 j8 v! A3 Z1 }0 ]! T
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
( u1 E% E" G- ^ {
& @& e# x3 J8 s) n2 F# v// Log_print0(Diags_INFO,"eolq.\n");* V" u/ n8 p+ y3 E- c+ V: I% R) D& ?3 {9 ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);4 T) h. z+ g7 w' X
}2 i& I/ J5 a) u
- }4 M! O* v; r" J+ x; w5 _3 f if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)3 ~& |0 D: A2 K! u
{
% M$ v5 H7 ?" g// Log_print0(Diags_INFO,"eowq.\n");+ E5 }0 ~' Y, Z8 f6 E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);. W" ` _, P7 B* T& m+ g
upp_interrupt_count++;+ o% C7 U! i6 ]
#if UPP_DIR_QI==16 h; e2 I: m- a
upp_dma_receivestart();; G5 O" l% F0 N0 R
ret=1;' K/ n- Q2 P _9 k# a
#endif
! U0 `+ |3 z! M. R4 S }) k# C4 [2 f5 ^( V
4 ]1 N0 [3 l6 b6 D7 t
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
1 m( g: N) d' ~- V {9 }- J8 |0 {5 c6 _, [. e& v- x
Log_print0(Diags_INFO,"errq.\n");5 G c" W6 A+ N# A; t7 b% |) V2 ~7 w0 ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
$ |9 v" F2 l/ M- F upp_error_count++;
; p2 P- t: z! @' L( l }
2 E6 T; j4 Z7 C" m8 t# C8 N* C, ]
$ N; U+ G% C4 b3 k! m# y" V& [& v% C if (intr_status & CSL_UPP_UPISR_UORQ_MASK)6 V; J3 b% t! \- ]
{
, d; E4 `; v9 G4 m Log_print0(Diags_INFO,"uorq.\n");# h% n7 n- O6 X# U( [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);) }* T) R! g6 E3 q; a+ T0 T' N
upp_error_count++;" }4 i' S2 G3 L* d' G x
}& S5 V/ ]% c! I
4 t h! R3 P5 R if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)3 t& G* A$ f- i
{
5 E% {& h$ T( a9 [ Log_print0(Diags_INFO,"dpeq.\n");
' C- f1 n, m# |1 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);! y) Z5 B& P- B6 y
upp_error_count++;% z( M+ j ^7 W8 \' {, O) _
}
! N( g$ I+ y2 J) t; ~. e, [6 s$ u) |; c; |) `9 `: N/ {) s
// make sure all interrupts are handled
5 L1 Z2 M8 j8 ~( o1 J( C intr_status = upp_reg_hdl->UPIER;+ j) x% Z# n" m9 G) Y2 k4 S
}; ~/ N5 a. P7 T
7 g( P" O$ N$ W5 i) S. I1 [+ v3 v
// finally: write 0 to EOI register
& h% K: M w0 ~2 j. l* K& T" q- B$ Y upp_reg_hdl->UPEOI = 0;% i* R! R) M/ Z: h" m
return ret;) D- V. Q, G: r$ y; X
}- m! [2 z4 S4 ~7 t: I$ j
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
# _; C8 T+ Y) }5 Q#define upp_dma_sendstartQI(x) {\* L. A1 e% L3 h' d3 t, w
Wait_upp_SendReadyQI(x); \
6 y1 l; a3 }6 f+ J( { upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
+ }7 e/ a$ H! @. k2 L2 { upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
5 a" N5 [/ ?$ x$ n2 q& z9 L z upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
; I( W: M9 L7 L7 Q }
+ a) l- p; \4 p' V- l; c
+ l# h8 @! h- r! ?) k; k- _% w n; N9 ] V3 ^0 C5 ]
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
2 }6 Q P; w# |& n: r- ]
\! m" x, R, q6 w9 D+ y
5 p% R2 i4 y5 W' P4 g% m7 a8 T想知道uori错误是在什么情况下面出现的,好做出修改。
' D5 X' g$ `! X, {/ _( w; u) }
; p. s8 h9 m. s/ t2 d. [7 u J3 P2 s2 `( C6 { A, s7 b' P
|
|