|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?/ Y D3 f6 \. p7 Z; }3 j: Y# y
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:/ [* ]- |. b$ m
u32 UPP_Isr()/ ^+ c! i" l3 u0 y& ~; s
{" e3 X# |7 r9 Y! d8 f
Uint32 intr_status = upp_reg_hdl->UPIER;
3 }# V$ _( r" ], s upp_reg_hdl->UPIER = intr_status;//clear4 y$ A: G! H, \4 ^
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");8 s# }3 z U e9 j2 Y D8 B5 A' Y
u32 ret=0;
3 m' e* p$ e) E; A3 e9 A/ l
T9 V* ^9 s1 Q8 y" K // inline functions
' }# g1 t8 r, H8 Y9 e" ~ while (intr_status != 0)# |3 W/ i. l$ K5 z. n. D% p
{* u# |; {0 u1 Z8 g, v5 _, b
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
- A7 H0 H. f7 E1 J1 o* T/ b {
+ j: c) H4 s, [$ D, S4 o8 ]8 [4 u1 I// Log_print0(Diags_INFO,"eoli.\n");; B9 f4 b# n, {+ z8 k0 j# u& d
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);3 X2 K9 \/ ~9 U! d* J/ ?1 ~# U; z3 @
}& ~" t* G( w; t' {; o# M
4 ?. [4 [- R) {$ C9 C, Y7 E
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
3 N: u/ j% K9 {! b& |% {& f {
9 n! N/ D) u( \/ @9 E/ ~& t Log_print0(Diags_INFO,"eowi.\n");9 W3 g3 M4 }4 ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);1 @& | ?2 e' _7 H; b2 m& p
upp_interrupt_count++;5 o9 S7 F( M; \ O: u3 n
upp_interrupt_eowi_count++;
" }8 s; C n; k' i9 C' N5 A4 C# B5 l' K* U
#if UPP_DIR_QI==0
; u0 _, l2 a4 |' E) z7 m" O upp_dma_receivestart();8 G0 J, F3 B8 z( F
ret=1;
3 I5 _, i v: S& V7 C3 V#endif: \2 b6 w* L( m& _7 u% |
}8 P8 q/ q, E! l- ~; r
7 @; A- D, c6 r6 n$ y* C9 T if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件" v8 B$ q% a' N
{
A) H% g6 y( a4 Z$ a Log_print0(Diags_INFO,"erri.\n");+ N5 h. d6 L! ]$ f" Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);# I- P( l6 Q6 q& U/ X7 n- _
upp_error_count++;) M. m7 B% V2 X" ?
}
+ X2 ~; `9 F6 ^- E% C+ L5 z& Q
8 y6 g0 `' v! f* ^3 r if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件3 F. x' |6 C2 q: G1 L$ y2 ^
{
, i) T( u: c& r( d& z% W Log_print0(Diags_INFO,"uori.\n");
: Y9 w( ~, X1 w" W! M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);3 z+ Q j: ~3 t2 u# D
upp_error_count++;
8 G& z) v- j; ~- M! A4 \7 x }
8 z) t. P- J$ }1 L( }$ f
% I0 E; W7 ^' n! B/ n X. A if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
/ d9 m8 o5 z9 i8 K: |+ t {
4 Y9 E. |9 U9 ^2 u$ p Log_print0(Diags_INFO,"dpei.\n");0 x6 }" b! p5 }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
' `" t. ^1 @! {& z7 E( O( _ upp_error_count++; u8 ` Z- h& i( k
}
8 f# Q" X" `$ J
- m( b9 X( d `& k3 l* Q9 B' Y( j if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
8 ?( l4 q+ L: [3 m, B+ }) o {) R, f& ~! W/ M o
// Log_print0(Diags_INFO,"eolq.\n");
# O: Z% T% J' P* t# p. I4 | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);' \3 X; ^+ b5 @' e
}
3 m q3 o6 G& I( u4 e) _
2 m8 C4 U2 `) `& G1 }$ b4 o& U2 m8 S6 E if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
' F1 w" x4 i6 |+ m5 q* N% ^ {# v1 C1 q5 `% y; ?0 o
// Log_print0(Diags_INFO,"eowq.\n");
1 }5 j/ U% w8 v g) j4 V& b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);& c) D0 Y. T' i/ W' N) q
upp_interrupt_count++;% e' e$ e+ V; ?4 O: h, w( o2 b
#if UPP_DIR_QI==1
" \5 r' c5 m2 _; r7 V upp_dma_receivestart();/ H8 u8 h7 u* W; N5 |6 h1 n
ret=1;
% |1 f8 O- k" `$ d9 t/ a4 p#endif; ~9 Q$ Y X/ J# F, n5 n
}
# b( K/ L" a( v+ S. M1 f, k+ L2 J; ?0 x
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
7 B( D5 f# G W4 u" T5 h5 A {
# j5 m1 E0 J5 A1 h0 s) e) H$ e" A Log_print0(Diags_INFO,"errq.\n");
5 y2 H5 G" s* ? K/ Y2 U! O9 G/ l. T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);: [; q- x/ |5 y2 Z- X8 f3 S
upp_error_count++;
3 n! s& i6 P' h) U# y1 z5 d( j }4 U6 I. I$ d; r. M! f Q$ Q
' f2 E5 h1 W0 c if (intr_status & CSL_UPP_UPISR_UORQ_MASK)9 W* n( X( D6 y1 g3 O2 n5 C- u) g; R
{
4 }! K: Q+ P7 T/ K5 o; F' o Log_print0(Diags_INFO,"uorq.\n");' |- e/ A( e# m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
* z4 c9 k# I6 j7 F9 k% c2 Z. S upp_error_count++;
5 u2 Z' J v+ c! D% L, j/ e }+ u1 P* T" v- m
* j+ W r- ?8 ]1 a, _ s# M
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)8 P7 J# N4 n z3 K) T' Y/ d' T
{; @; T& Z- K2 Y- Y6 z; j; G1 D
Log_print0(Diags_INFO,"dpeq.\n");
- [& _- } n5 c& L9 C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);4 l X) Q9 V( Q! C
upp_error_count++;
9 [* c4 g" s7 k6 I7 X' [ }$ O( k( q/ h' X- D; B2 [
2 e$ ]* A# W% ?4 T% w // make sure all interrupts are handled
# `, m8 }( L5 x+ z3 d% m intr_status = upp_reg_hdl->UPIER;- h' \% E# a7 c; k5 U. A
}
4 a0 L8 Z. [: p0 J$ O$ [8 s! ? |) ^( v( d/ p% H r
// finally: write 0 to EOI register6 C- w& e+ N2 e6 ^4 D/ {/ t
upp_reg_hdl->UPEOI = 0;6 U% G9 V" L6 g
return ret;7 a6 {* s8 y: v7 h$ E8 S
}
6 t4 b* V0 Q6 i2 \( adsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):) K0 q5 @2 F$ j _3 c
#define upp_dma_sendstartQI(x) {\7 F4 N1 p* Q2 Z; r6 N0 r
Wait_upp_SendReadyQI(x); \
7 F" c3 E0 `4 E+ C upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
' M* R8 C- r7 a. K' A. A' v0 H+ X+ H upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \6 \% u3 }! R3 ]$ ~8 B
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\/ I* S5 e3 _1 T) X
}2 @2 g/ p+ I8 B" d& x0 L5 {
% X; J% r# J, u5 L% G6 G8 T5 C
1 M$ t/ M7 B8 W$ k u/ r#define upp_dma_sendstart() upp_dma_sendstartQI(I)/ t5 G3 l8 w/ X; \( a1 _+ O3 E7 {# _
; g. o+ n/ u7 X* k% }) b: G% p
- _: F5 q% N9 \% r想知道uori错误是在什么情况下面出现的,好做出修改。
/ j" m: H$ m& G8 f" T
5 ]: \/ ~$ T' G7 E5 `" h
+ k0 y5 L0 h- L/ e& x' g! } |
|