|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
, @' k! u$ Q$ }" @* i# |) Q; udsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
4 I3 ]" w0 R3 G, i% |7 _! Ku32 UPP_Isr()
8 b' I1 h7 @! R; O* \( G, R& u% C{
/ ?" J# @) r; i, K8 r' F% Y Uint32 intr_status = upp_reg_hdl->UPIER;0 U: ^ T" G5 g) F
upp_reg_hdl->UPIER = intr_status;//clear. _) f/ i# w' F' A# ]
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
) m" G3 }9 S* {5 E u32 ret=0;
6 @- n( m5 l- W7 Z- B: \/ [4 [2 P' G) A* V$ V1 k2 e
// inline functions
- f) o" g8 w7 P* ]3 F0 P while (intr_status != 0)
/ y# V5 t& u, a4 P7 o% T' D {8 V& |0 x8 G/ d* {
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件7 `& z2 A8 ?% O
{
" L1 d3 w k$ n* A1 U% Q' N5 B// Log_print0(Diags_INFO,"eoli.\n");
! T. \5 K1 Q! ]' G& `+ m# R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);) {- p4 Z$ M( U( Q. |: q2 l. t5 X
}
: p m5 P9 A8 o/ _6 f( L- ]4 t
) L* J# ~4 X& { if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件3 @ q0 |- q, ]/ s- c
{
" f# D7 o- T. C5 I, ~ Log_print0(Diags_INFO,"eowi.\n");
3 c& p- P; R5 \8 g/ q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);! }6 k; K5 {8 m8 ^! U
upp_interrupt_count++;' c4 q6 C/ {! I0 A+ ~$ A0 ?
upp_interrupt_eowi_count++;* d B0 p3 H& A1 O
+ {- n0 y9 D. F
#if UPP_DIR_QI==0
! _9 i8 i7 [7 U, L4 K upp_dma_receivestart();
9 L% n1 G5 L, Z2 G/ K8 K0 b0 s8 L ret=1;& N+ P" X1 } a P+ P3 u, \6 ^! H# [
#endif- ]# s* M0 ^6 a, p2 t7 f
}7 K2 V1 b/ \; f$ C5 ~
" `8 q" ?- h1 M% N5 L6 P) p' Q if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
. y7 _- p. A; \) i {
# a# s }, k$ }" c7 v Log_print0(Diags_INFO,"erri.\n");
4 g( c2 {' e. \% I7 T' }$ u% M9 ^ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);$ Q% D! L. ^& Y/ M$ H
upp_error_count++;, i4 V$ l; y$ t0 d0 n/ N
}' }: \" o) y+ }: x7 F1 I8 G. \
K, d( }" S5 ?" R if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件) y7 ]6 r% ^) Y/ U; Y* x; u
{
7 h/ y O7 M% @ S: N1 K! @% p* ^ Log_print0(Diags_INFO,"uori.\n");
# E3 l: g: M/ v5 C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
5 F6 ^5 r @, F% f4 D upp_error_count++;- Q4 E4 L3 h0 v. M/ t5 K2 t
}
0 M0 z( } n. [( o/ g* ]* N: a3 {" D" r {
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
% e- A* @% h7 w6 l0 O {
3 @# l: ^1 A! N4 `, k7 L d5 O Log_print0(Diags_INFO,"dpei.\n");
9 k) I& p1 Z5 r0 P4 \( ?7 Y) Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);2 h {7 h- x/ K3 p# F9 v+ ]! V
upp_error_count++;
/ @$ _5 a! h( j3 R% \7 U: H. i- V }4 \6 ], s! M) O1 i) _! h j6 g
6 c" X; A9 m2 n3 |/ K; k! D if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
! s/ Y- A1 d( R/ @" w/ ^ {% V& Z9 ~- a% i' d* F7 U
// Log_print0(Diags_INFO,"eolq.\n");
! S! r0 H: P" s9 ^1 B6 ^ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
* E& H) i/ v% D7 y% o2 Y$ g( k- ]% s }9 k' @. \% a& R/ B7 @8 b- U
: B& `# `3 |+ V( a& d if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
* h; n; ~- z8 [0 `8 L/ d$ w, Z2 n {
! d/ z( x7 h# Q. h6 D// Log_print0(Diags_INFO,"eowq.\n");. P. h4 M8 u/ N& e& ^; S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
( `- i. |% Y2 l0 Y+ d upp_interrupt_count++;+ o" i5 k g# y6 I
#if UPP_DIR_QI==1$ F- I9 }# m* i; T) w1 k: r9 Z! v5 w
upp_dma_receivestart();
# s" ?& ]: p( B# H% t5 V) O ret=1;
6 e# h6 ]/ t( E) L* B7 m#endif
3 ]. B6 }8 Z/ Z7 s+ w8 W$ a0 A+ F }$ `. C( k( o5 A3 O/ B8 }$ w4 J: G
- x* f' |( R9 Y* O3 M T if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)8 F! c. g0 W- q7 D2 j
{ y# h& I0 q. e- B a
Log_print0(Diags_INFO,"errq.\n");
) C4 v, t# i. x V, P3 V! S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK); [' A+ ~& V+ S4 m# m9 f9 X! N
upp_error_count++;
, p9 L& {1 b& j% d$ Q- V0 a" P }& s; s( R# w7 L; K1 a
' O$ a5 ~* @8 K
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
: Q) G& T+ M# A& f {
* X$ s. e% ?9 u2 A Log_print0(Diags_INFO,"uorq.\n");1 }5 b" ]4 h, M& O4 _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);1 g5 E* E5 M+ X7 U, u4 m9 B
upp_error_count++;
3 _4 a! n) P% ^" b5 n }8 o# Y2 r9 a u/ r6 R) T, V# g
' v5 e! u( u: [2 A o0 R& M
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)2 i( }8 M+ i% L) M, A% c0 E0 K
{+ c4 Q; C! O+ c1 M! s& u* m
Log_print0(Diags_INFO,"dpeq.\n");
. y- p$ m$ m/ F/ _2 i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
% a& [( s4 ~7 K; w; y( y upp_error_count++;8 [1 ]2 b1 T- W+ i# C
}2 i [* _) M1 Y* Z
8 s6 }3 C8 I: F // make sure all interrupts are handled/ d) ^; J' L+ e3 H$ Q
intr_status = upp_reg_hdl->UPIER;8 n7 { I! o! z) _
}
7 T a; K7 U5 I, i3 p r; t5 i6 Z( I. s! Q1 ^5 S8 D1 t
// finally: write 0 to EOI register
* y4 r0 L9 T* B0 O+ v5 g% \; ~ upp_reg_hdl->UPEOI = 0;
! N: \( I% m4 |5 w7 B G/ g return ret;- X" h3 x k; J0 D- v
}" Y9 b! n J# T. H" q) I" s* E
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
, d5 C; a, n9 R: E3 y- E+ w1 Z/ c6 f#define upp_dma_sendstartQI(x) {\
$ \5 ]* a- P: b9 q7 m) H/ A Wait_upp_SendReadyQI(x); \$ j/ D8 V; h1 c9 Y: O
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \; }# I5 Z" G9 ?3 e
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
6 _4 E4 Q* q+ U8 q$ W upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
/ d6 Q6 ]7 V# F }
. K* y2 P4 h: L3 R7 t
( h) Z, M7 i2 h& `# k+ B* k! C+ `1 S# U. K0 M3 j- h8 A5 _
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
8 |+ b. _/ z: j# T, m/ B: z( Y/ b6 N# c
5 L$ W' V8 i C, {想知道uori错误是在什么情况下面出现的,好做出修改。" b2 Q* m: \$ H# j+ Z) r; M
+ V3 E$ s' i9 Z# L1 F: d4 Q; @) z) @$ y, k3 z
|
|