|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
5 ]- x. a p5 R# R9 S! y/ ~dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
4 \1 p& r0 S) w$ mu32 UPP_Isr()
7 [4 v l- _+ G% y1 Z) d{! _( J1 r2 x. ]" [, @; O9 W0 t
Uint32 intr_status = upp_reg_hdl->UPIER;
* a; T: T2 E! Z, Q" I. n3 ]- v upp_reg_hdl->UPIER = intr_status;//clear
8 Z8 J5 V; b1 b$ Q6 F2 F) W// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");+ f' D. F" p+ |. D
u32 ret=0;1 a2 c: X- A" T- i" A( }
7 `7 K5 B% o4 }9 e- j
// inline functions4 O4 G' Z7 L3 m3 c3 Z1 _1 f
while (intr_status != 0)
$ H& Z+ e/ m y, V {# B& s# x$ h/ V) e& g6 Z
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件 D; u* E( ?( B# m
{1 K6 o) ?0 h2 I$ e$ T
// Log_print0(Diags_INFO,"eoli.\n");
/ S# L9 M* O3 t2 x% L1 \# } j8 a upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);" w7 J- M: V) `
}
" j: t. E+ n( {. S
0 c G$ ~/ T( y, ~ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件9 Y8 D& G" k" ?: C) `
{
) ^$ @, |, }( z+ r' U Log_print0(Diags_INFO,"eowi.\n");
- k6 q9 Z7 ?3 j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
# j8 e# Q2 Q) W' `3 d$ w X upp_interrupt_count++;
# F" H A5 B4 ?: ] upp_interrupt_eowi_count++;
% |1 H% Y5 e1 V* }+ F6 p8 Q1 g/ Y1 `( z
#if UPP_DIR_QI==0/ Z$ q: ?& H* R" g' m: g( Y6 I5 Y
upp_dma_receivestart();; i, @. v0 x1 O" r7 W6 t0 _
ret=1;
4 h6 K' C/ O: P#endif
( g5 m' S$ P, z, m' y }
0 c r, r7 t4 }- e/ l* g4 h K5 H' f7 ~6 ~% [* W' {, a0 W( ^# X% t
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
1 ~- V. s: C- |2 D! Y# p8 z3 U {) S* x6 ]4 f% i0 M. S
Log_print0(Diags_INFO,"erri.\n");6 O. [, w% g! T
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);8 {+ l. `0 X8 t- Y$ @: D6 s4 }
upp_error_count++;1 ^/ w2 P7 ^5 J5 Q
}
" Q: ~' E* N0 c* ~0 T: m; t. X, Q
1 V/ x! g- f& J9 _) c8 |% [% {) A& s if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件8 O( L6 X& R% e( X/ R
{) V5 _) N8 g8 F6 `; C
Log_print0(Diags_INFO,"uori.\n");, g6 T ^0 [$ c+ T8 v3 k1 J4 T
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);& q, u) q6 u" ?. v2 P* i% x n; t. k
upp_error_count++;
% Z& b' r- l3 i8 z5 Z0 G0 w. M/ G: N }# H0 }' h+ u2 D+ j5 u( F( i
" n# E0 L; z( d! e G2 P b
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
: @* `, \& `3 |( ]9 m6 W* \9 Y {
0 m. E- N' h( q Log_print0(Diags_INFO,"dpei.\n");7 n- y3 K# [5 Z% \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);1 m) x) W7 ^0 h+ E6 v% f
upp_error_count++;
; s% ^1 C' a' @4 y }& c1 I- U" ]) `$ K( v4 r
, d: {$ v7 X6 a
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
8 \1 k2 _ t1 e1 }; l( ~ {
, ^% N t3 F- @' P, B( c// Log_print0(Diags_INFO,"eolq.\n");
+ k1 s( L6 x* ?) F# h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);! e* |6 J0 I. a w5 N8 R
}
( F& c9 W. L9 G' b! J# R, ]# |* l$ ^7 o% z0 V
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
, t( g0 [9 l; q( m3 U {
& `# o2 e( J8 S// Log_print0(Diags_INFO,"eowq.\n");
7 A! ^! S& B9 E4 @5 W% T6 T6 L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
6 B9 v) W1 H5 k+ }/ n$ |) L6 ^ upp_interrupt_count++;: d) i8 v; u1 V" x1 ?
#if UPP_DIR_QI==1) J( K' k! M8 }9 ~
upp_dma_receivestart();
: X* Z0 R0 u3 }" ^+ _( K7 Q ret=1;
3 P9 Y! U/ u, a/ d- F#endif
" k, |7 |9 V/ d2 X$ l$ i( X }9 |' F/ A1 f! m
& R* T# S, S7 H" y5 G if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)% D- J- O- n) ?
{
+ S4 U9 ^/ X5 } Log_print0(Diags_INFO,"errq.\n");
* p3 x2 ?" S. {* N& ` F% ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK); u L! E7 J& K E6 {* J8 q
upp_error_count++;
6 c* L& J/ h: o" I8 _6 ~% b& N }
6 X0 _3 r2 f8 u* W& b. l- u- e& K d) ^
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)2 o0 P* A: t* T2 Q$ ?
{
$ s T }" I. [6 Q+ |% x1 A Log_print0(Diags_INFO,"uorq.\n");1 A+ f5 P& y- k6 Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);2 q0 y6 r. ^ g5 g3 z# ?! o
upp_error_count++;; X8 U) e8 Y2 s4 `/ i
}
7 O9 C4 K, l: S" E' w
4 [% _+ C! G+ I if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% g: m# s7 R' v9 K3 M/ A {( s- d2 t8 N, e$ S( D4 A
Log_print0(Diags_INFO,"dpeq.\n");
: F6 J: S' o% s$ `2 J' T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);( t7 g+ _* x* c# P8 h
upp_error_count++;
! H) x" ] m8 K ~5 P }; ]- E. {% h+ w# t( X
) t' K1 l' H& h // make sure all interrupts are handled
; O0 |& a: O+ g- g% J( k0 R intr_status = upp_reg_hdl->UPIER;7 J4 ` R9 z& c7 G- [- I
}
- t/ A1 z$ p4 _$ s1 G* V7 b& K: S" s
1 t, P" F" N. w* S* u6 U7 j# P/ d- D // finally: write 0 to EOI register
) n+ u$ b) ]; ~ upp_reg_hdl->UPEOI = 0;; t2 M1 `% k, l, q' ]
return ret;1 J: ^2 F3 J- B, J
}
- ?7 U0 s8 f* \/ o2 R2 j# Z6 |& Hdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
; l; r/ R, [3 G" H#define upp_dma_sendstartQI(x) {\
" Q s3 `7 s* h& O- x2 I' C Wait_upp_SendReadyQI(x); \
5 b" {* o* l4 y4 k upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \/ g6 ]+ o# g: P% k) U: |8 }' G, J, h/ ~
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
: n& r c! _% |$ I" r( k upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\ V/ x6 ?0 K" R/ |
}
0 P8 I7 K8 ]' z- X! R* f0 ]
" t. J( S4 B1 }, d4 A. B. W/ V5 g2 ~4 ]. e; H7 |) j+ S' e7 L
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
' `4 c' `! t, U% _1 S6 s. u3 z* p+ c5 x! `/ g7 d/ x! ?1 z7 h2 y
8 }) Y$ s- W! Y6 j$ L想知道uori错误是在什么情况下面出现的,好做出修改。1 h" w) i1 A0 S% J/ l
" y" Y* `. m- r, l( c( t3 P* j! v/ q4 F9 S
|
|