|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么? a0 r1 B6 @: a0 R: h. t6 {$ b
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
1 o# a7 ^+ B! W9 b* B% Z$ ` C/ K6 h: Xu32 UPP_Isr()) z$ E. v) h# t! H7 E7 i
{4 b0 A! n+ N3 f/ q0 m
Uint32 intr_status = upp_reg_hdl->UPIER;
% M+ l, p I k" M( f( A7 Z5 X upp_reg_hdl->UPIER = intr_status;//clear
. W, h1 P- G* i; ~( U3 o6 i+ S% L// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");' @3 [# T& h1 U7 v! K
u32 ret=0;) G; }; z1 I% ^) `
; g4 N! P3 [+ C, v$ z1 D# o1 B( c // inline functions$ F4 a! `. x, Y6 ?* U3 S7 v/ {6 L
while (intr_status != 0)
0 g K$ @* Z) Z2 h4 y/ C$ R( e/ m {
* k3 `: {0 W8 y0 ~- P, R% }3 p if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件9 m. _2 i5 ] ]
{
u3 W5 b! p4 Z4 B+ j( J// Log_print0(Diags_INFO,"eoli.\n");1 e/ ~/ \$ O+ ?- v5 `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);, S) k: b) Q& k# r8 d
}' D; X$ y5 y# p2 F4 k4 l( R
' i# f, r: v- E* q
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件+ z( {# @- L4 P
{* y C5 F+ j1 Z' `
Log_print0(Diags_INFO,"eowi.\n");
- m, U& A d' u9 `4 ~/ b9 ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);2 p% a: R. h2 ?# p9 n
upp_interrupt_count++;
8 Z7 u8 o$ f* H, r5 o, k3 ^+ v upp_interrupt_eowi_count++;
7 u2 O" R4 E+ e7 |
3 }4 j: X: @& ?7 J0 C#if UPP_DIR_QI==05 h m+ e2 D8 V+ N* J# Y5 W0 a3 m
upp_dma_receivestart();
7 g+ q( D2 @; K ret=1;: ~) ]- W& C# u8 B
#endif
/ h. y) }( |/ ~, ~" X2 H8 w }
& ?) {7 ~. j. [; F
4 U3 i, }2 h. q4 \! o6 C if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件9 N; N+ Y- x# c! _$ u
{
7 v6 I1 P& y4 } Log_print0(Diags_INFO,"erri.\n");
- g- m+ j3 ^9 C+ x3 ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);4 U4 K. A7 x; l; {
upp_error_count++;( o' V$ y. ~. [! h t/ m
}
# q1 G8 k {8 _ e% r3 v2 v. \. K. N, v/ W. o1 C% a
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
# e: I# r* A; O, c& X! t) m {6 V0 x6 r! Q2 m7 t% g
Log_print0(Diags_INFO,"uori.\n");( Z: r9 J7 u# u* D$ D
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" i4 B6 Q/ q# b: v) _: Z- Y' `3 W
upp_error_count++;
; }2 y2 O D* o/ c. d+ i$ z s/ s }& m8 F w1 r' u( r. K0 w) |7 E
( a, w$ F- ?; c- ^
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件- h! O2 r7 t: |" u1 m: Z; w
{
) l/ ^' ]3 }* M# n) v! Y- D4 { Log_print0(Diags_INFO,"dpei.\n");
: w7 @2 i% p. W/ ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);2 V" T6 n- j" G/ A
upp_error_count++;* p; W/ V! I( z! V' a& t
}
% O4 D8 j9 G- Z. ^* n1 v$ Y
' h! j0 W h, `8 u if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)0 d3 ?9 ]- O& C) X) \- h
{
6 U4 F6 o2 _/ n8 A M// Log_print0(Diags_INFO,"eolq.\n");* R: x; x' \: \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
) s& `% X! w4 F6 q' g }" o6 P- O' X% K( E- j
% j- T; ]) T. G0 K6 e
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)- J# E4 G: T2 Y' H
{3 F2 h1 Z ]( h9 e$ V e ?
// Log_print0(Diags_INFO,"eowq.\n");* o* k5 L7 D' B9 n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);% v: N8 G2 r) K! w
upp_interrupt_count++;4 { k, |9 U! Q5 |5 f8 y# ?+ K
#if UPP_DIR_QI==10 f$ _- F0 j7 z
upp_dma_receivestart();
! E2 `6 _8 z, b. \1 x ret=1;
# B2 X* X% d5 ?/ @* r#endif
( f5 [9 x7 h K. Q- d }
" l! _7 h$ `; m$ w/ f1 x2 V5 W: G2 K+ `1 B) H" l2 w
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)& G& d% Z7 J1 `3 ^1 _
{7 s$ H9 v, h- C V( J) m e
Log_print0(Diags_INFO,"errq.\n");3 U3 a. c7 Z" D, t, k! R
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);6 D8 G6 k6 t- U% K0 D) F
upp_error_count++;
- m3 I; c" C* V* X }
! B9 e% A& M& a' ~, l" E# r- K1 ]% ^+ ?# y
if (intr_status & CSL_UPP_UPISR_UORQ_MASK), M! C& a: Z2 x$ k% r/ }9 ^
{
3 c4 R$ p- @" t$ R Log_print0(Diags_INFO,"uorq.\n");
& f7 l" c A1 _3 T. W8 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);. a0 K5 m+ n; {6 L
upp_error_count++;$ n" v- u3 ]! B0 z
}2 C. I+ H0 o' D/ t6 D) {$ ~- o
4 N( V, L# }. l0 s6 ?) a: P" G
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)* j- w! U, \3 u) m' W% N
{! _" i e& y# a; [
Log_print0(Diags_INFO,"dpeq.\n");1 i; B! u7 P" X: q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. a% c3 `( W4 ]9 t* c, U! K upp_error_count++;/ ?# A% [% A V8 p
}
4 [$ K; h [5 ]( _
3 S; b2 {, z& y9 s1 l; l // make sure all interrupts are handled
- P) H3 l4 D) O9 L' u intr_status = upp_reg_hdl->UPIER;
+ _' r" L% c; H! q5 I- p& k8 W }
7 I3 }& n7 z1 e1 `3 Z# Z, Y6 [, T9 v1 P: E' ^# p, t
// finally: write 0 to EOI register \9 r4 w$ P. f+ R
upp_reg_hdl->UPEOI = 0;9 ~8 _: l1 ^1 g6 L4 I0 E* @2 }
return ret;4 h1 U6 O2 b9 k7 C, B0 `: w5 m. n
}( v$ w: s+ S* R7 ]/ C
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
6 Q$ _2 L: B- R/ x#define upp_dma_sendstartQI(x) {\8 ~5 d5 m8 }9 N6 f; l: ]
Wait_upp_SendReadyQI(x); \
8 G& T' c( S% }8 h- R upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \6 G2 w* ?! w& `& b
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \" Y( U+ V! F6 {6 o
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
2 j0 L: P' X) [6 @$ Q2 k) E) n }' B+ L" u2 ~0 w5 d$ J# y/ t
; C. h, z( G9 M+ Z" ] t2 S; F9 T5 R# w8 S' f
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
9 G9 p6 o$ N' K1 G5 w6 J: R7 H r
3 Z. @0 O( q& e" X5 f3 r0 y' {7 S; y5 h1 c. D: x) x6 Q
想知道uori错误是在什么情况下面出现的,好做出修改。: t& r0 k- G- `1 m5 j
; p g+ \( l. Z
- X: [; ^6 a1 x( T% _ |
|