|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?( R; q! p; l1 s5 V' s' X5 l' O7 @
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
( {/ Q* ^: [7 l% @& |3 Au32 UPP_Isr()5 ~0 E9 c U0 X+ J
{; Y% A' ?: [1 ~- p
Uint32 intr_status = upp_reg_hdl->UPIER;
6 n8 H" a8 F/ C8 ~) _ upp_reg_hdl->UPIER = intr_status;//clear
, C6 Y/ B' c3 t( K' s5 s p: E( Q// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
! Y, ?7 ]. E( M; ]$ Y9 s, d u32 ret=0;
: X! g' F- \& B; }9 @
+ ?; j" a4 s# f3 U/ K* V4 W // inline functions
: I6 _4 \4 }6 g+ s+ Z while (intr_status != 0)1 v( o0 q, h* r" }3 v7 w5 ^2 ~
{. V8 V4 ?; h$ A# m4 y
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件( n2 N3 H7 q' r8 O5 b
{% w N/ f7 K: A7 J# `4 l0 b" }+ D
// Log_print0(Diags_INFO,"eoli.\n");
2 k( I( s! A# e3 M8 `0 s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);( D. r7 n. ?1 e
}
& W; J g9 @5 _$ n" V
/ A' ~( l2 W* k- S v if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件4 n0 s5 ^% {9 ~4 |5 v+ P1 m5 c7 S
{( z" D3 ?/ N" }% {, \4 K
Log_print0(Diags_INFO,"eowi.\n");4 W9 C# u* w' l+ E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
2 G0 \ m3 C% Y) h4 [, Z; p) ]: e# s upp_interrupt_count++;$ P: S* R* i2 H+ Y* _
upp_interrupt_eowi_count++;9 [8 K2 x7 p G- w+ Q! M& R
; @% y1 D, t B; e#if UPP_DIR_QI==0, @0 g: o# R7 O' {. u# w$ G7 u" }
upp_dma_receivestart();, z, R) ^4 D7 V+ j; j
ret=1;
8 b* d9 R* }& e; a! A1 ]#endif
% w: G# s; G, m2 \% c/ h' \2 A: c }6 y5 s" d8 Y$ g2 H5 o
% f# [2 X- V1 J8 S if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
( S8 y: w, R6 M {
$ L+ y/ P( A$ N# ` Log_print0(Diags_INFO,"erri.\n");
) \. a; |9 R$ X! q* P4 i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
E8 J; Y# ] p. J9 d, f# y, q upp_error_count++;
6 ], p/ R2 A5 V; H } Q2 Y) N) A# l- Q
8 T) i6 m! |! _. C- v; c2 O
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
+ U. g }& M S {' T0 z4 K- s, W$ H+ ?3 @4 _8 t
Log_print0(Diags_INFO,"uori.\n");
% c8 G' N0 n6 e8 H6 o$ G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
5 J' z9 k2 R/ v( R, v+ `2 w upp_error_count++;
" @( z7 _7 _# }9 D! e2 A- g4 P }. a* Z. N! }2 C% I4 @0 {& W
! W8 Z% [% q; b2 j s if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件0 L0 m1 ?& {2 w! s% N
{
$ g9 }1 X) y5 v6 @. W7 k- Z4 Q+ N Log_print0(Diags_INFO,"dpei.\n");0 z" q- A. \+ T9 ?/ Y6 \7 |# \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);* [" A: W0 x4 Y5 p; i% j0 s+ h
upp_error_count++;3 ^0 {0 F+ y% ]$ x
}
8 b1 N$ y" r; G# ~
, X9 F; F9 I/ T, J; _; x, ` if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)* r& _+ T, Q2 a$ m$ i4 @& d7 a
{
: |0 N% Z! d, c" n: S) \3 O- o R// Log_print0(Diags_INFO,"eolq.\n");: I/ }- k, ?4 i% v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);# z5 b' F8 }( }& G3 H
}
/ R/ C( |* F G$ D2 k8 |7 }8 _1 y* b7 m6 [
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
/ `9 x2 U7 n$ Y% k+ r- m7 x! l8 f {& ]' m! D+ ^* B, v5 e$ E- h0 W9 \) X
// Log_print0(Diags_INFO,"eowq.\n");
" \* H0 g! \1 Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);& c* G/ e4 s2 V4 @- j# r
upp_interrupt_count++;
4 O; U0 g0 P$ T#if UPP_DIR_QI==15 s2 l$ @% ~1 `! P+ Q/ |
upp_dma_receivestart();8 r7 A4 S2 Y. p6 v' B& o' a6 J
ret=1;; J# p. @2 P) |8 K% c
#endif- |. M. o: T, q U9 C3 N8 w
}2 \+ Z+ L, @, U! b1 K: @# D
% T, Z- K* T8 e( z2 a: `! K if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
4 g* z2 v) ]- ?7 ?* j; N0 }3 u {
* ?9 Y% L# d( \, c( q' P/ m+ t Log_print0(Diags_INFO,"errq.\n");
8 V' U4 S1 t4 K5 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);8 ?, M, N6 B( b, |; p" i
upp_error_count++;
9 k; U+ V5 L" V) p6 M }
a: W e. C: ?6 a: s* i. h4 l0 J5 r0 P; y8 T
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)0 ?$ Q. G' j8 ^1 I1 K1 g
{
! E9 G% h. `& A" O1 h& O0 z Log_print0(Diags_INFO,"uorq.\n");2 |6 b4 s+ h0 F
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! k, H* ?4 a2 D2 i. K% j9 ~ upp_error_count++;; P. T( B6 P6 A6 Z- \& B' R3 n
}, q& M0 e8 |- d/ I
& C& T3 B# b- J x. |% P8 u if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)! e S: k7 \. F1 ~& D9 ?
{
- z" `3 Y) z d; O Log_print0(Diags_INFO,"dpeq.\n");
, V! G3 N8 Z! v; Q5 _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
$ c2 x2 @. Z9 ]6 l& j# K upp_error_count++;9 c# u# j; v3 [" Z
}! T9 l1 t! F+ y
7 U# G) R3 m' C- Q
// make sure all interrupts are handled+ l5 `3 Y" u, n) }. T* s3 R
intr_status = upp_reg_hdl->UPIER;& a$ V. N/ R' T) l* W
}5 U' H" k& I& c7 M
* R1 ~8 @' p h4 x: k- O7 L // finally: write 0 to EOI register
6 i8 ]9 h# c$ ` upp_reg_hdl->UPEOI = 0;% u. _9 ]6 w% L2 s4 B' d: h
return ret;4 k! j4 O0 K/ _4 \: m, b6 P8 b
}
. X2 v) Y) ?6 v: }dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
& c1 o7 z* u7 L' Q* G# w#define upp_dma_sendstartQI(x) {\+ R$ U# D, E0 H9 E
Wait_upp_SendReadyQI(x); \6 N( H1 @! y2 k. Z( w' X$ P$ q
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
, p6 H! O3 z2 x. U: s upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \0 N6 B! {% }0 ?- ]" c% r
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
2 s9 a5 ]" s, n }
X8 u/ k. f+ y O1 o) S, c2 A5 y/ ]7 a8 Y$ r7 L
3 }2 R5 v+ B2 J9 U+ _4 R9 l; ?#define upp_dma_sendstart() upp_dma_sendstartQI(I)2 g0 ], q' g O
: _! D) Q7 V: S3 x) o
( I: B( C* s' }9 [: y
想知道uori错误是在什么情况下面出现的,好做出修改。
2 a- |( S7 G9 r# O6 z& e, b6 x! t' G* h4 y/ |$ q& t& [6 p
5 j! g% m! @" X/ ^% f |
|