|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
" ? ^" r* G# Rdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
8 f* E, @ K8 pu32 UPP_Isr()) {" f; F' r5 e% B
{+ `3 I' w5 r# \( D" G. E% K+ l2 B
Uint32 intr_status = upp_reg_hdl->UPIER;
* t e7 @; H5 A- \1 U8 u upp_reg_hdl->UPIER = intr_status;//clear
8 Y$ Y2 F \4 {3 Y: Q6 Z// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
. U8 Q7 B$ g! D; w: W; Z% t( N/ V; U u32 ret=0;, |" i! J3 Q) A+ _
6 I# m6 n3 A. y2 ]; c4 r
// inline functions
; G2 c- i% H/ O0 U while (intr_status != 0)
$ Z0 n1 s) K) m, F" G8 ?# Y {6 g! G* b2 z2 i, D# |
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
2 F, _8 G' j p, V {* n$ b+ {, q% @$ Y0 q0 Y
// Log_print0(Diags_INFO,"eoli.\n");
. \! H0 \, S! J upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
w+ r- ^8 E" r% O2 K0 `" \ }$ Y3 ^5 n7 r) y9 f3 m; o+ u
- @7 N! w* L' }" ^" h! |- {+ } if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件- H6 C. P+ Q8 r W, W& b1 X
{- O5 x& `* T# }! R
Log_print0(Diags_INFO,"eowi.\n");% q U0 }! S1 [7 N5 }# D
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);/ c! ]$ h k/ H
upp_interrupt_count++;
& t( S; R) E6 n: h0 O9 @ upp_interrupt_eowi_count++;$ N# ^0 H1 j8 X1 `
0 f& X. i& |7 i5 i' k- L6 }+ `
#if UPP_DIR_QI==0
4 j0 ~3 [; R4 G) o* E' D/ x upp_dma_receivestart();, b# Q3 i. N: Z/ D `0 f" P0 s
ret=1;9 M+ y; ~# ~: e) j D" I6 ?
#endif' ]& d' B w7 \ R
}) d+ |5 S* l; X
* q" w% F+ j# e% G/ \' u" f
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
$ R+ `/ j! V! G9 N. S {. H3 n' n6 p$ r3 u
Log_print0(Diags_INFO,"erri.\n");0 S) J. P. @; o7 ~: [ j& a" C# Q- \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
6 J5 |5 M7 k5 v! ~+ Y! A4 l* A upp_error_count++;3 B& b2 x1 r1 S! e
}" w4 N4 ^8 a5 l- H, {
; k$ p) W# v6 C t
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件' u g9 y& w6 T: w9 s4 {
{& P+ T% Y. s) E
Log_print0(Diags_INFO,"uori.\n");
0 ~9 ^: P% s1 L, U( B& } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" q; i( X% {) Z2 s2 [
upp_error_count++;
5 f; B- t1 ?0 D, P. J" _ }
1 w& x' b! M/ C
4 R4 @0 y5 A, o+ [2 S. B if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
J, P3 |. A# P& B! I U {& h9 _2 k! ^7 A
Log_print0(Diags_INFO,"dpei.\n");: L* D {" @# d1 w; b* L \, ]& k1 P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);& M' x# x! R' F g
upp_error_count++;, k, t# P) N# w! U: n& Q* I3 \
}
: e# D: Z- C4 i# [5 W7 p U6 H
# d0 C/ N% E; a; | if (intr_status & CSL_UPP_UPISR_EOLQ_MASK); W9 Q* q8 Z9 { I
{3 \: S, g1 J! }( N( ]2 X
// Log_print0(Diags_INFO,"eolq.\n");4 }/ E$ K0 b7 ~9 `/ Q3 F
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);0 D3 @' v: m" n1 ?, G
}
( [; Q; o( ?# J
$ g( l7 P% c9 h if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
2 f7 V6 Z: p h1 @ {9 m. C8 q% i: g1 R X1 b4 d C. s H
// Log_print0(Diags_INFO,"eowq.\n");" I2 z. N* t4 e. `7 j! c4 _4 x
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
4 P9 w9 R3 R# P5 o t upp_interrupt_count++;
+ W! G/ P4 T6 T5 ~+ e#if UPP_DIR_QI==1# o' y" _" C. [" [7 K* e
upp_dma_receivestart();3 P' d' ^7 W$ J9 S' P
ret=1;3 _: Z" X6 [7 ~% L, F
#endif0 _) A1 w" L. M- s
}
8 X/ p* x7 G7 M/ @# }( C' ~& I3 [+ o& F# f
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
7 t* E2 N# y4 ^$ D* }0 ^6 F) p {
0 `- z2 m/ a2 `8 m; S) j9 X* F Log_print0(Diags_INFO,"errq.\n");
9 | ^& f' d5 Q- X" v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
* ^, S% V9 c, _1 H upp_error_count++;- o! V9 y, z7 r3 i6 b
}6 e" N/ a/ L6 d$ `9 ]7 R
) r2 c6 q) U8 v. T3 ]# |" k if (intr_status & CSL_UPP_UPISR_UORQ_MASK). \2 G% _$ ^7 T1 { P; g# d- W
{
+ \; _8 p6 h; o" ^5 v4 ^$ u3 b Log_print0(Diags_INFO,"uorq.\n");! n1 N5 e1 `# V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
$ o' |, Y3 K9 p7 I9 d5 D upp_error_count++;
1 @& o1 `3 s" O4 ^ }
8 A- @4 ^6 e M; C5 i9 W. x- ^: ?
. w% s( X: }+ [/ D f if (intr_status & CSL_UPP_UPISR_DPEQ_MASK). G! S3 w' z4 R3 ^2 @# l
{
9 a5 d$ O5 W( p7 [ Log_print0(Diags_INFO,"dpeq.\n");
8 V5 x* J z6 l) T( j9 v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
8 d6 y& T2 O4 Z$ P* e upp_error_count++;
! M. F9 S$ f# q( w }
6 G: g5 e( I6 K5 e/ j! ]' j+ u+ O8 P, F% b$ h2 P8 K
// make sure all interrupts are handled8 ^ B/ F4 [7 f7 a9 n. i6 J
intr_status = upp_reg_hdl->UPIER;( [; L- D3 [8 c) T- v& m! a
}# y1 U$ Z1 l; ]$ u
1 L- `' F, l0 a7 ]# D' u; D6 \
// finally: write 0 to EOI register
7 r/ a% L+ V1 M. x" R0 p! z upp_reg_hdl->UPEOI = 0;
8 A; v! r0 I3 H; C, s, }$ F return ret;' V3 q9 T' ]2 B1 m. H. c6 o0 ]( v
}
& s! z+ m' z K1 \; ]. \dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
- D7 h1 N& V$ I' h1 b5 s#define upp_dma_sendstartQI(x) {\# \2 w5 _' c4 ^* J% u" l
Wait_upp_SendReadyQI(x); \
, y' f" U% V; W upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \+ G ?% M, _# K2 y/ a1 h& l/ C9 p1 E
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
6 P- |) Y6 E0 k, r" u7 W upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
$ y8 D; U- n( V8 D. H, P- C }
) K& J0 _: T' N! M3 e& r% B' K3 t1 ~3 X
& D5 c; i: K+ h+ J# l* s
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
- \- I0 U& y1 N- u+ V G* G; d( t: \( v
0 u5 n- l/ Q- a, C: b
想知道uori错误是在什么情况下面出现的,好做出修改。
% y- Q3 S% _! e+ g& r! [
8 s4 n5 s9 y3 l; W7 T+ t, T, H- K* |0 v# T
|
|