|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
9 i) r; y6 r9 m; p+ [' ^( p, Cdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
. ^3 [" ]9 V1 l7 A% Pu32 UPP_Isr()! Y9 r& `% G0 \/ f% f6 F
{
j3 Y, [- @; j0 \- C( O- _ Uint32 intr_status = upp_reg_hdl->UPIER;0 H8 d/ O J% C3 }: J I) b
upp_reg_hdl->UPIER = intr_status;//clear( V. |! U9 Y* @+ E; |5 @2 d
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
: U; L/ K3 B8 p u32 ret=0;
/ k" b) z, N& W9 C( k5 u( _0 K, C% a$ c" H0 G- G
// inline functions0 _% f$ l% G1 Y5 @
while (intr_status != 0)' s4 R; a8 _! u1 Y/ s h
{
) Q- s% s3 \$ M) a1 P if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件* Q5 p2 _" M; D5 f6 q- R _
{, Z* u& G2 a3 U6 h1 r
// Log_print0(Diags_INFO,"eoli.\n");: P: K+ T0 K! }2 e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);; F6 c% x) f) G
}
/ k' i c1 c+ _0 F6 y! Z' q
4 v8 y+ F/ K' J4 ]1 ?( H: b if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
: K9 |( y" O6 ~ P* {% y4 y {3 ?& Q& h. T3 \( _9 E+ J& W3 [6 j
Log_print0(Diags_INFO,"eowi.\n");$ A* }* b) U0 U+ U# G0 A! R% H: U4 M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
3 Y; t4 {/ K+ X5 L, C upp_interrupt_count++;
' x- f0 n9 s& B& ?$ l" ]- F upp_interrupt_eowi_count++;
! h! a2 F9 {+ L0 t# o6 v0 C* x2 H' R4 x1 H. X
#if UPP_DIR_QI==0
- B0 R. ?3 f/ I6 o+ s8 X+ m upp_dma_receivestart();
, ~9 {, l8 e g3 r ret=1;
) D+ s# S9 {- Q#endif: ]: y' L" x9 r3 Y
}4 ^4 z+ U9 l( L; h
# O4 D% `' @! B; c if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件5 ^! B0 b+ Z* M7 e0 U
{. I: f, \& a/ c) I1 N* K$ z
Log_print0(Diags_INFO,"erri.\n");. b9 K, }2 U' ~2 r
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
4 y4 j9 M3 z0 g+ F) H$ D upp_error_count++;
: {% w9 K* L4 k }8 p" I5 X# T) Q
9 u' }" Q& X j0 N5 w7 T, m if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
! X5 @2 T. I$ G {# w0 G/ E, P/ M2 r0 J
Log_print0(Diags_INFO,"uori.\n");- G! b- H( h( v* [4 B0 C- ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);+ o/ I6 A/ D. f* s
upp_error_count++;
; t: ]( ?/ A0 W8 I8 e. z }2 D3 R5 g/ A3 k$ v1 ?
, i" y2 _( I6 F0 X% D# `, K" _% n if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件/ Q. B2 f) k1 L4 l; W4 z$ K
{$ `: L/ @. P/ a& S
Log_print0(Diags_INFO,"dpei.\n");, q+ h( u. w I" }/ |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);0 W2 N$ W5 U6 ?; N5 e6 x5 y& M1 z
upp_error_count++;* o, q1 N# l# T4 n
}9 r1 n! ]8 t0 b
8 w7 |% h7 u: ^4 h# b( O if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
, p9 g" R( \. h6 Z( M! c. A+ Y- h {( ^ D! P0 ^5 n/ O
// Log_print0(Diags_INFO,"eolq.\n");2 N/ u* C6 ]5 W$ |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);; Q0 E ?% z' `7 r% }; a+ y( o
}
9 a" E- _. c1 C; C% q# [% ^
4 v$ y0 z0 D- d! E if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
: x6 j6 i* i9 Y1 c% v/ h4 k {
5 Y7 A8 K, @/ x# t// Log_print0(Diags_INFO,"eowq.\n");1 R+ A, Y& C: g
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
/ r5 M0 Q* M4 O+ p2 {& H/ }# h upp_interrupt_count++;
* ]& L6 g* ~4 p( @2 m; D3 @#if UPP_DIR_QI==10 ?+ {! Q y3 c% M( w1 D
upp_dma_receivestart();
+ {' o3 u* o( \+ L; r ret=1;
, k6 n' o$ f; @! e% o4 b8 q) G0 j#endif; P) T3 g# X0 e p+ J& K2 P$ e: ~
}+ v4 y7 U/ D1 V/ g2 F& R
* v7 B: W- l' f6 Q if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
/ M) |2 E9 D- D" m7 \; z7 _ {
7 _2 L! q4 K' g2 M+ _$ Z" z/ T* Z8 O Log_print0(Diags_INFO,"errq.\n");: W" h4 X$ E2 i/ G2 ^- q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);+ o5 u) x" p/ B& J! G
upp_error_count++;
7 q8 g" _- x7 U. Y" { }
( c, C3 X2 a+ m& @- x, w3 R
( B& L6 t6 L% Q5 a0 r if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
; z$ M/ Y: s6 l; ^! \8 B {
5 P# d0 c0 f9 n6 U- b: z Log_print0(Diags_INFO,"uorq.\n");+ V- a ]0 w: \. l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
4 I# u$ J, W6 v! P5 X7 g; y( ] upp_error_count++;
: w5 h8 C* g# o3 t$ Z8 C }% @! J1 `9 i( N: a( H$ g
d3 A h6 J; x T$ Q if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% O" `% ^9 S0 P/ L {
% |" a4 K% c1 q; y: r. | Log_print0(Diags_INFO,"dpeq.\n");* ^2 }" R. q. K3 U$ {- Q8 E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);$ N' A4 a$ H+ H/ o
upp_error_count++;
$ U8 c' j: o. {1 y) y }' G* A0 D8 V u k& D
) _3 I. q, h- `, }2 [
// make sure all interrupts are handled: S9 z/ {* g8 c0 C, l
intr_status = upp_reg_hdl->UPIER;1 E% V( `9 e- h# J) u! t
}- ~9 @2 w- I# I1 ?. I; M
: r- r, [, T; a) M' d- A0 g // finally: write 0 to EOI register
& }+ C/ f* ?: W* u: D) z0 c4 r upp_reg_hdl->UPEOI = 0;
- }, {1 L3 R# A( H) I return ret;
1 Q3 n& i5 }/ \+ j% m} H8 I2 V1 {5 j; _
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
& u& I5 v B# P/ N) z! u#define upp_dma_sendstartQI(x) {\
$ P5 Q0 Z' V. \6 r: \" C Wait_upp_SendReadyQI(x); \1 Z) U" i+ M+ Y0 Y F
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
/ |0 u* `- ]! T- v upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \( k; x! B% H) U( O
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
* Z/ D/ t: F6 [ } ~$ H$ o) j8 E4 v2 [$ Q k
5 m# m$ e- K0 u A
: [/ s' i% k8 ~) O% l#define upp_dma_sendstart() upp_dma_sendstartQI(I)( ?% O' o: n( C, y
" b6 T2 j3 P+ x. h. Z8 Y
2 W4 i8 x6 B3 W1 [想知道uori错误是在什么情况下面出现的,好做出修改。- S# \$ l7 p8 u0 \5 }1 @4 ~
+ ~, I0 I" N1 P, R6 G+ \' }" Q* I W* d) l2 m; ]' b8 U. g% F
|
|