|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?. o" j# Q0 g2 z2 A
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:& M( _% @- `2 c$ z% W# t; s* o
u32 UPP_Isr()1 ~ D# z# D0 N* M. t5 U% p" E
{
, a) M1 a& E! B% D5 [6 j. o' r Uint32 intr_status = upp_reg_hdl->UPIER;/ d2 G5 H2 o; k( ]* ?4 d n9 U
upp_reg_hdl->UPIER = intr_status;//clear
0 E# c6 D; g6 X# F( N2 L \// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
8 |1 h. C& K: @3 O4 s9 m J h9 N u32 ret=0;
$ f# G; t" `6 ]
+ n; D$ T" C8 _1 ^$ n9 [ // inline functions2 C+ g! k4 w5 j" t. ^
while (intr_status != 0)+ j j/ y `; E
{
% s U, x0 i2 w: {" F5 m2 o8 R O if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
( A( g8 m# `+ F# W2 q4 x: L {- G$ M; I3 _! \5 f8 C
// Log_print0(Diags_INFO,"eoli.\n");8 n7 Q4 m8 b% p8 b2 l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
y2 A' c2 Y; G% q }
, h. V- p- X) ]! _+ ?7 H& l
6 u _' O5 Q) J$ p/ p! ^, O if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
# ~ H* K; F+ [2 w9 T0 J+ u; M* |2 H2 W {' N1 e, ^' n% _% g3 H( m$ B
Log_print0(Diags_INFO,"eowi.\n");# l G P! D7 t$ ` ]/ O3 s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ r3 w& v% v X |0 q upp_interrupt_count++;1 Y" E `# i7 ?2 m1 u6 f+ ?0 h
upp_interrupt_eowi_count++;
" x8 J2 ?# d& v. Y% m! y* ?% u2 a
#if UPP_DIR_QI==0
+ E, r& i. I# T: P, C upp_dma_receivestart();
- i+ c+ Y! j: E/ w1 N( u. u+ m8 n ret=1;
7 ]7 x# {, ?- d/ _7 A G, h }#endif
/ e" T% m ^* c# N. [1 ?/ u3 r5 K }
9 S) J3 Z9 ~7 I( n, k( v& f. m4 z' @+ h$ @1 X
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件5 \/ X- @/ B+ R. W8 J
{* A* d' q1 {( L8 M
Log_print0(Diags_INFO,"erri.\n");1 S& Z, M1 i5 g# L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
. {8 H9 N8 e: c. D upp_error_count++; d7 S. e( `% l3 Q* V
}6 `, H# i% k: O8 c x
4 k3 W# n$ G" t, S& M1 U
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件' x M. v7 r9 D7 E, V. }: }
{$ K6 p6 j6 P6 Y Q! r. A8 v
Log_print0(Diags_INFO,"uori.\n");
$ E& u2 P$ k: l) p# c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" C- T" h) }" p& U& d. s" X
upp_error_count++;
. _2 Q% A8 ~" F# L4 N0 O4 f- E }
) C p: ?# H w/ w" }* H* ?" @: q& m+ J7 a$ x5 l7 Q. R) R
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件5 J& T* q3 o+ s; e) y; Z- f
{
0 g S( A- y# N" _' x Log_print0(Diags_INFO,"dpei.\n");6 D p" Y% _$ m' v# a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);6 Y" I* P0 O# `) p k6 x1 _1 \( }
upp_error_count++;1 K0 {: T% j! |9 P) |
}
1 Z7 Y0 n( b: N2 Z. j) A$ d6 H- E" e Q3 T3 x
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)- Q" p% o9 m* W$ H+ q
{7 ?7 ^8 l# @% N8 p
// Log_print0(Diags_INFO,"eolq.\n");" {3 _8 I1 ~# [" F4 W! U' w" \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
# f9 L6 q% C5 o# k1 ^# j5 ] }* }2 S, W; I" {* J2 M
5 D- }1 J6 x+ X if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
& p6 b O8 g, c, { {; `6 [1 X6 O; `; i/ P
// Log_print0(Diags_INFO,"eowq.\n");' s( P9 H7 v! @6 \8 J, o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);1 S$ A7 [$ a- M/ K: A
upp_interrupt_count++;
2 y+ X# ]9 ?2 [2 l5 d/ d#if UPP_DIR_QI==1
* l8 A: I& D( |: x upp_dma_receivestart();
1 j# l% F/ L; E! h2 m ret=1;
# f& ]) ]4 f% t3 _$ {4 d#endif
3 o7 o; O8 Z; }8 R' ~3 t$ h }2 @$ G: j* D1 r5 C& Q( x4 N
( N1 f8 `6 C+ }( b4 w
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
' G! [0 X- C/ Q/ x/ Z- w {
% Y# C5 ]+ F8 e6 F$ t; m Log_print0(Diags_INFO,"errq.\n");
7 Y6 b5 I- J# X, y2 t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
. h- k" v( I' @ }9 r n upp_error_count++;
+ r% h4 M* M+ q1 d% r+ _* A4 Q7 F l }1 `: F, U, A% o9 {
9 p2 b6 m& L2 ]. V3 ` if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
/ m3 h. n0 C+ e& M# X {+ ], Z* n( g7 }, P8 c9 M9 P, f) l8 q
Log_print0(Diags_INFO,"uorq.\n");
6 w2 ?) {$ X+ [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);9 `2 ?; y+ I% N2 v9 z
upp_error_count++;
+ x/ p- v! R" v9 ^ O$ z }. L, n# h/ L# k# ~
8 D; c8 c$ ?, R- }/ {2 x. w if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)% C Y4 M1 {& G! \. Y
{
& s- k! u9 t9 h, ^! A+ `: d Log_print0(Diags_INFO,"dpeq.\n");' j' X8 f6 ^! A8 e! s" w. J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);0 P9 s4 j# @. ~+ z/ b
upp_error_count++;% b+ x* ~; t/ W- P- P1 s+ {
}
! @$ w1 n, L7 R; d% u% y( f* X2 Q4 ^4 ^8 Q- `
// make sure all interrupts are handled
: e6 r) v" \* l4 l8 ` K intr_status = upp_reg_hdl->UPIER;
7 ? c0 h8 Y' e8 W) x5 _ }
: Z9 e9 g) n0 ^( ^7 ], {; d- v7 V1 D0 [2 H7 e. J. B& r3 n
// finally: write 0 to EOI register
- ]3 b' {, W1 _1 c upp_reg_hdl->UPEOI = 0;# n# q" R: d- j6 [+ I$ h% O
return ret;: k! r$ Z- W, \" z8 H" t
}5 n0 J9 m4 a0 T% R% t- p
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):" Q& o8 C/ c& a9 l8 y; s
#define upp_dma_sendstartQI(x) {\
3 ^6 D% M a! I! H- H( Y; ^& T Wait_upp_SendReadyQI(x); \# R1 r' S0 r, C- Y' c+ @* C* U5 H
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
2 P8 k! Z8 U1 M! j Y upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
F# H/ N0 b; u8 i upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\& v0 O" i2 R2 \# Z E
}9 S& R9 b- P. C
! k3 M x' }& e7 s+ g% ?2 D4 Z) M) o! a( _
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
& t' ]3 {4 q7 k$ |9 E7 n5 d( n* B0 S( d8 f; x& x1 [! _% v
* v, L, e6 s# {3 m& b' ]0 ?% d
想知道uori错误是在什么情况下面出现的,好做出修改。2 Q+ d. n3 X- q# n' Z
8 _, G9 k5 P( `; N
. X4 B' e' R( D7 Z( U# Z/ K+ K |
|