|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?' M0 l# A- S8 D: e! w3 Q/ y4 v
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
\% V* x: K D9 S' R5 J" D/ G8 K9 Su32 UPP_Isr()
1 Z1 d# |9 m O5 f; I% l{
( S: ^7 `! C. R# x Uint32 intr_status = upp_reg_hdl->UPIER;( ^5 b9 r5 n' a. N' K7 @
upp_reg_hdl->UPIER = intr_status;//clear
3 V3 D& C# L& E/ c; x// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
6 W5 ~1 {2 s4 Q' ~; P! y) { u32 ret=0;
k; t' q# a; x) o
& s. P4 b/ k) _& ^* T. k* I // inline functions% m5 \0 k6 q/ L- a
while (intr_status != 0)6 a2 _, K3 y5 z( X% @" g
{
' W& b, Q: u: G% I7 y$ z1 J if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
# F* y( [1 N4 F! ~: }1 ], a {
0 p, {! [9 Z8 ]) m/ V// Log_print0(Diags_INFO,"eoli.\n");/ K( t! m6 ?* f: `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
; u' g3 p4 u3 Y: | }
7 q0 ^. L, b4 y+ H
" Z/ \, k2 M0 r1 |3 D' ^ if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
/ h# c+ [( `9 u2 c {
8 W0 M! g/ g5 o& {; N1 a Log_print0(Diags_INFO,"eowi.\n");) ~7 Z# W. C4 _( G# P% W( ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);/ c) r' i) p2 M. g4 S1 s! @
upp_interrupt_count++;
1 G5 G- ?2 p! [, y7 F upp_interrupt_eowi_count++;& v |! f) }2 M9 y! f! ]; L$ E# ]
' x& y( q( N& r/ B2 J$ g+ M#if UPP_DIR_QI==0
5 e9 T& Q2 m7 v9 T3 X upp_dma_receivestart();
& j {' ?6 }1 {" I" N9 k! x- Q( y ret=1;& B$ f+ D1 e# o
#endif4 a& l( Z+ O0 {
}
, K, r3 l. f8 ?& U2 o
" b, F: \& N# H) l; y if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件/ f- t9 i6 [5 e; L3 E d1 H" \
{
, @/ Y& T+ X, |3 R" w% K3 ], N Log_print0(Diags_INFO,"erri.\n");
! C: Z$ s$ h$ d9 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
7 @7 p. T1 ?0 O7 A3 m0 L( P upp_error_count++;
) d! u- X) j8 s: Z9 }/ R3 m5 [ }
6 @' w0 E: `8 a5 k- R3 D- p' o7 y5 X$ e+ |( k6 [
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
$ c4 |' }. u) b: J {( U/ n* O5 n4 f/ z- d* J+ J
Log_print0(Diags_INFO,"uori.\n");
) g* i; y1 \) R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
* C- a& C6 h3 t5 Z2 s upp_error_count++;; _" v, T. ?+ J
}7 ~. G0 Z2 F0 b, @2 J
% F2 ?9 v) @/ @3 G, N: k' L' K if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
* j& ~- X0 ], {0 k3 L9 g {
" \7 ?4 Y) g& Q2 d' E" R) W& u Log_print0(Diags_INFO,"dpei.\n");5 ^" _2 o" }5 h/ X0 ?
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
+ b% K. I% S! k. k: k" _ upp_error_count++;
/ l) u x, A: u; v4 W4 A- k: F8 ? }
/ R, h! U* I+ B6 W3 P$ b' e9 u9 Y! m
( Z; ?6 c: s* Y$ x) r& g, x if (intr_status & CSL_UPP_UPISR_EOLQ_MASK) L4 v5 d% p( N0 H8 y: R: N
{
- W" @$ a$ i' `5 x- X// Log_print0(Diags_INFO,"eolq.\n");. v" s6 M" n+ f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
3 J) s7 q& v/ n p' q }
/ k( Z3 R6 u) p5 h; v6 ~9 I& b: @+ w4 n* f1 ]) _. d& M& Y
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)! M$ u0 ~% M+ [
{
/ s1 G2 w9 |& W. o, M// Log_print0(Diags_INFO,"eowq.\n");0 \3 b i4 p/ ~0 T+ p9 D) ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);2 a! ~. f( @8 }) j/ B
upp_interrupt_count++;
7 R" _- Y% C+ H#if UPP_DIR_QI==1 t$ W( _: ^$ a) e) k% x
upp_dma_receivestart();
9 `" P# n3 J& d; E5 z. ^: D ret=1;1 ?6 s( x% ?6 V6 f* K4 c% k
#endif
7 Q; D. S: r( y) v# _; a }
: k) l* `7 C9 Z5 b4 j
+ d; B* x( @. j' o. X/ l if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
) X! e/ b& y3 o; J6 x+ B8 D {6 W# P. p: }' ?2 m1 o) i
Log_print0(Diags_INFO,"errq.\n");7 N5 M9 }' `$ U) x$ x3 p8 a5 w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
) k Q6 b# q( b) r8 D9 j# L upp_error_count++;
& G% C" P9 d5 Z' n ^. m* K2 ~ }+ M1 X) _) L! v- y7 H- g- l1 V
/ j9 B5 P& k0 H if (intr_status & CSL_UPP_UPISR_UORQ_MASK)' f1 _. _! x. d; l/ n1 s4 `
{
" B# k. _4 C- @" p; [ Log_print0(Diags_INFO,"uorq.\n");7 B) G+ J' b4 b9 K [ y9 b' A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
, R' V* P4 [9 G9 p upp_error_count++;8 n* Q% s; ?; z4 [2 f# a
}! E) p1 X$ w: Y; Q8 f
7 K6 Z0 l& M: h( t6 S
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
6 n( S, x* `" M4 k* G) d1 c8 O {
0 D _* S9 n X$ H4 C0 g Log_print0(Diags_INFO,"dpeq.\n");% I. E' a/ N2 P% N5 f0 f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
# @, p2 X# C3 x upp_error_count++;
4 E9 |' N& ]/ {& O6 o. v1 J' y }
8 @! F/ r! F- ` M$ N+ w; Z. f, }6 O) b' w0 e+ G7 G1 G
// make sure all interrupts are handled5 ~$ z- w% s+ }1 ]
intr_status = upp_reg_hdl->UPIER;
3 W% [% W2 [, F4 C( X: s6 Z% L3 \ }4 v- l* R. B& E* G& \9 F" a) l6 K# R
4 v& r: l1 s+ U/ `! I
// finally: write 0 to EOI register9 m" M9 \' `: \8 F% Y; f" Z: T2 }
upp_reg_hdl->UPEOI = 0;* ~4 U: B6 F' f$ _- O
return ret; e9 j0 ^2 m" N5 r
}
1 s8 K0 U0 q G3 ]1 q0 @dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):/ \/ R4 l% T! b" t( \5 ~
#define upp_dma_sendstartQI(x) {\# E9 `/ e: D+ f0 |- J! b8 k8 z
Wait_upp_SendReadyQI(x); \ ]6 `2 l, R9 ` e. k4 U/ T: \6 q7 q
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
Q! f+ S2 k6 C. C9 P5 t upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \4 B. m9 I* D" ~
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\# t, i, q; T8 |' Z( E
}
8 H! Z! }. q+ a6 C- N' O7 \# i/ i8 t% z' U; P5 s
: ^/ i; X5 }- B, Q
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
) [9 n" S' y3 [5 ~9 f L4 E' D( ] Q: G/ l5 g9 D
9 |) O) ]$ {; r3 _# K" C, h* X; r想知道uori错误是在什么情况下面出现的,好做出修改。: ?) M5 U4 b! W; f" k/ s o# \
& W4 F% N- z7 W; S! w0 t3 a* ]* _$ o. a$ N9 r7 R7 ^3 R
|
|