|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?- s: i% W7 b: ]$ K& N' {( b
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:" V: {0 ^( M1 H3 R. \
u32 UPP_Isr() B$ [' {0 f# q6 k$ n, Q
{
* e. `& k" n6 k& X4 J Uint32 intr_status = upp_reg_hdl->UPIER;1 l- u& W! }2 g& L
upp_reg_hdl->UPIER = intr_status;//clear
2 h, m, M/ E4 m* \( C// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
4 j! x$ y( B* H3 ]5 t9 B u32 ret=0;& T7 M4 L# e; T7 T1 ^* e* e
$ [4 M3 _) P( b6 w$ n& L! Y9 ~ // inline functions+ U) H6 E# y$ m2 }* b
while (intr_status != 0), R! h, V) X1 q7 M$ n% V
{/ J* |; J; e4 s7 n# Y
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
, G$ f1 d6 `. q: U {
8 M5 X( E4 F$ Q* }& I// Log_print0(Diags_INFO,"eoli.\n");
$ y* m" [% [- C) O2 ^" X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);8 H6 Y' E+ }5 N% e
}
5 W) a: c! a8 X! k' f. A- x3 c" b0 ~7 Z
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
; N8 {+ g9 K$ L) U3 `7 k& p L0 K {0 d9 d8 ^' v# x) E2 D4 ?
Log_print0(Diags_INFO,"eowi.\n");
6 r" x; z: _* b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);2 D( f" I# c2 H0 ]0 a0 f$ ?
upp_interrupt_count++;# x3 |0 v6 `* d" B
upp_interrupt_eowi_count++;$ ^# ]; w$ i5 X
7 I9 K0 T/ m, p6 e- k# L#if UPP_DIR_QI==0
5 ?- h2 l o% ^ upp_dma_receivestart();8 f0 E& Y% P7 w
ret=1;" _7 O4 _+ G$ s
#endif! @% y- \3 H5 c s( f. ~- N
}0 x! h- j$ U6 `4 U1 c
/ u% @5 S/ E5 R; I- M
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& G' m1 s/ b7 E% l
{8 q+ `. o1 l( e1 j8 z, y
Log_print0(Diags_INFO,"erri.\n");
( K5 v" m) p1 V n0 p! A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);5 X4 a7 L' y, ]& _
upp_error_count++;6 {9 T% Q0 K% f: i5 u
}
8 L% q. ]+ P9 Z: n! F! n! {+ n
' I' \" f& z$ o+ d5 O if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件* ~2 w# b# U% H* t
{
- \0 L2 n( c6 S9 T: l: I* K# T Log_print0(Diags_INFO,"uori.\n");
9 l& d. h: A. Z+ o) O, n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);6 D5 r& H7 W7 Y% j- F5 e$ c
upp_error_count++;: T5 S/ Y3 W5 d5 \: d
}4 \5 V# S2 V- @7 p0 A8 z+ g5 s
3 a: ^" Y9 u- K1 S if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
' _9 D% J* `2 h0 z4 \1 {) L. B {: w# R( k+ ?! d
Log_print0(Diags_INFO,"dpei.\n");" k& T$ O* \. G+ ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);! u$ j4 D- n; g& e& U3 g" V; |
upp_error_count++;
! e9 Q9 V. H& A* }; o }* {2 |- z# V7 @' p
1 ?- v3 X" h1 [6 `# }3 Z8 A2 v if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)/ D. u9 ~! G! i
{; H5 o- @( K* l2 O. [
// Log_print0(Diags_INFO,"eolq.\n");
0 H4 P6 y/ F+ p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);+ C* H$ Z1 K+ L4 I
}
) a- s6 d3 o! W2 K& v: Y0 k
+ _3 q% K" I2 y2 j5 V- U if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)# c7 K4 u/ A4 n) ^2 Q
{. E! j( d9 D/ G- r& {/ ` `2 [
// Log_print0(Diags_INFO,"eowq.\n");# L: G. m E+ j9 ]+ b5 L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
! x7 u/ x) ^. A# @ upp_interrupt_count++;
& T: C0 I/ J! |#if UPP_DIR_QI==1" a7 z. c9 {- i
upp_dma_receivestart();
- E, O1 N/ x" T% {9 k ret=1;5 x' o4 A6 M: Q% {& _3 U; O
#endif. H) U& {( ]+ @! J. r
}
' r+ o/ U2 {* F" _5 w- Y5 L4 n1 b+ r& ?# h: d E8 }
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
. D& Y# ~# C* R+ y- H. A) Y {$ u1 e; Z, R7 u) b! G( @5 R
Log_print0(Diags_INFO,"errq.\n");/ Q. d/ {5 S9 F2 K; g$ D1 |# }: s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);" h' f/ i8 x. m: S' M
upp_error_count++;
! g( }7 F6 B3 D8 N) Z }0 G) w) K! e+ a( G+ u. g( |" w
1 m* T7 d. \' _& q. L
if (intr_status & CSL_UPP_UPISR_UORQ_MASK), ^% Y6 e6 J# j+ f9 f8 g3 p
{0 @9 e7 g8 W8 J7 U# w1 }
Log_print0(Diags_INFO,"uorq.\n");
" c& g, Y" ~9 e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
& }- H+ z* ~' }) S8 V8 s% S" K upp_error_count++;! ^6 s3 n2 B4 q! p+ o. m% c
}
]3 w! M3 z% b8 a5 U5 }' M! V# A9 B7 k4 F) ~' W
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)9 ?; C+ r; u2 [7 R1 t/ `
{
2 v& }% G9 p$ P( I# Q Log_print0(Diags_INFO,"dpeq.\n");
1 u. Q8 P$ F; N7 ?8 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
' n d" K) a& h5 n" T upp_error_count++;
% p4 o5 L* U2 k }. D6 v$ e( O7 L6 j6 K Y
' n; P+ Z8 f% }1 t // make sure all interrupts are handled
/ Z$ i9 v* \) q/ l8 g/ \0 v intr_status = upp_reg_hdl->UPIER;- O( @4 d" Q: |$ t3 L! P8 ?9 ?
}
0 T$ A |3 ?4 ?" A3 e3 e
4 |9 E$ h4 e% z8 g9 v // finally: write 0 to EOI register- p a1 O5 t3 R
upp_reg_hdl->UPEOI = 0;
. O* E! ~2 E7 i return ret;# W, p/ {: E' }7 T: p( W& Y
}6 i' d/ {" ?2 w
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):' c' [. m0 s0 {, Y9 {1 w
#define upp_dma_sendstartQI(x) {\
6 b. h6 [4 N. ]8 S Wait_upp_SendReadyQI(x); \
- Y A: l G8 O, i: S! C upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \# e% D1 k# k0 l1 ~
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \$ c% m! |' w# a' \% ?5 |; d
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\& G" ]5 r' a0 g- n/ t- ~
}
* E4 _; h3 W" [/ V/ e- }9 d7 J3 Z! U
; l2 n& D9 m- k# \#define upp_dma_sendstart() upp_dma_sendstartQI(I)
2 w, B) v0 z1 f( W* Q0 G( ~4 y c$ r$ C- J
2 W3 ^( ], i- a& K想知道uori错误是在什么情况下面出现的,好做出修改。
7 f% Y( _2 _+ ^9 E8 q; u6 O+ j: A) H! j# I
* ~6 M7 y- _; k. \( p. c
|
|