|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?7 _# f) g3 w7 d6 h* t& N" `
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:! `' P- c" S$ B9 c6 v7 ]" I$ j
u32 UPP_Isr()2 D e/ R; O* h" e2 \0 D
{& K# h- v" y, {5 h7 Q
Uint32 intr_status = upp_reg_hdl->UPIER;
9 c/ s& a+ f0 R3 k8 ^ upp_reg_hdl->UPIER = intr_status;//clear$ r9 T1 ^4 K H1 U) _
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");. Z- ?" Z* G0 Y
u32 ret=0;: i4 Q8 L, G' T$ u
7 f) ^% N7 {. n( m
// inline functions' ~6 _0 u% ^$ N1 y! z% G: Y
while (intr_status != 0)' e. N5 n9 [; I2 \
{
$ w/ ?/ C0 N- h0 M+ q! r! m if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
. ?% K0 m, o$ ~# u* {' F/ { {2 E# {4 H( ^! f+ H/ Z
// Log_print0(Diags_INFO,"eoli.\n");6 t& [+ F0 Z: ~; I, q& G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);; C) K4 C+ |( i$ ^& o: o
}
2 ?7 B! y- e- B ]
8 M5 Z( q* H4 G2 K0 Q8 g9 @7 C if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
7 J7 D7 L1 r D {; A( k& h3 B$ w
Log_print0(Diags_INFO,"eowi.\n");
" W3 Q7 I+ @; ?1 h& n# C) R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
7 @0 e) G7 m. t8 g4 g Z- x3 {: e( e8 V upp_interrupt_count++;
8 H' j$ A. d8 l* H& d$ n5 U upp_interrupt_eowi_count++;
0 Z- Y* O, Z6 o& z5 [/ ]6 @7 l4 d% y* i
#if UPP_DIR_QI==0. l# n6 V+ F9 o- N3 r
upp_dma_receivestart();
* J- L a3 {/ |3 o3 ]+ ]( W ret=1;7 O" G0 y/ F4 n9 Y) V6 q" }. @
#endif8 E8 C) k* P! o- i2 F) J
}$ k; T6 O) f, ]$ f' V
1 G8 K$ c) \7 m! J
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& a: T& H) R$ z9 N6 G# r# I4 D
{
3 Q* g6 ~ T+ y5 u0 x: L Log_print0(Diags_INFO,"erri.\n");4 q, V% |/ e1 ~4 U0 l0 }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);( Z1 w% ~, g+ b
upp_error_count++;0 H: k9 C6 [$ A" I
}# o& O' `. A3 u
' _* a3 L: B% V* D8 {" p" [( h if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
& q( d6 m6 Y* G3 p {
$ R* d9 U( R3 ?5 e Log_print0(Diags_INFO,"uori.\n"); D- m- n1 r1 U r& V; f' r
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
8 m* A$ N; {7 F upp_error_count++;: F7 F W1 }/ g
}0 p) T8 X7 y9 E
% T* x V. e* m- ~2 T8 E* | if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
+ _8 R5 }8 _( |7 S {
7 h' N' [3 J( X1 p E" { Log_print0(Diags_INFO,"dpei.\n");
6 B$ |( [8 R# d. j$ o8 ^ n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);: @ n: M- L! _( C3 A/ n! h
upp_error_count++;
% ~! w: m; M3 L |& P! J0 ^ }/ x) P' l" ^: R
O' f) b% @; v if (intr_status & CSL_UPP_UPISR_EOLQ_MASK). g1 r/ R; @6 |/ w: m \
{
# X9 z8 O5 K6 I5 I// Log_print0(Diags_INFO,"eolq.\n");: U7 o$ g7 j# r: Y1 a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);0 R9 n7 n* N* C) c E* u
}
# L$ p- i% s3 r/ k2 g4 c+ B2 N S3 E9 Q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)6 d+ l9 D7 v' e6 Y
{7 ^% [, \: T* ^- K5 _6 c2 o: j
// Log_print0(Diags_INFO,"eowq.\n");, u+ l! u& ]7 J. |: P
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);9 p3 a, v+ O9 ~
upp_interrupt_count++;
7 q4 N" D; p! {) i#if UPP_DIR_QI==1
/ t) g; H0 |$ [9 t upp_dma_receivestart();0 q* a8 y+ s9 J' u: m7 B
ret=1;8 n& G4 `1 S4 `6 H
#endif
; V& x1 T$ w7 u }
" l! m- }3 U9 N$ u; m' f, c# D k |- u0 I; n
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
G ] ]2 _" o& h" b3 N {
8 F- o4 |, w* c( p. i: n Log_print0(Diags_INFO,"errq.\n");
' @% e3 {5 N u6 {2 ^" g C) L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
2 O5 z) e3 \3 @6 j. _& G+ ] upp_error_count++;
, T/ |5 b& G8 p+ w6 T }4 `& p, f) \6 o8 Z: Y) H- X+ F
$ M1 A3 |' u$ t8 R, y" J6 U0 d if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
B6 I+ e, s: m( C+ S {. d( E# z; c! B1 c4 Z
Log_print0(Diags_INFO,"uorq.\n");/ i; R( a4 u# w# a% X$ ?
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
& f0 C& i: T9 G9 L6 K8 l7 u6 }! q2 j upp_error_count++;
% W8 P4 W0 | _ G# ^3 F. d }
$ N- g1 i! B# _5 Y( n( T0 E
3 n( g( z- Z1 `! Z& F if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
6 `8 O$ H6 V; D {
- f3 w" T4 x5 j7 X( @# \9 p% y Log_print0(Diags_INFO,"dpeq.\n");
# K: i3 O5 g7 n2 e6 t7 T5 N7 m/ p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);1 \" c( T2 C8 }! G- ~$ ^5 S
upp_error_count++;
' M' T5 S: V3 p1 Y, ^- T$ _# l }: D0 q1 B- ~2 M
) d5 l Q6 @) K0 C- J // make sure all interrupts are handled
* D% |2 g* i5 A- h* p# K6 E intr_status = upp_reg_hdl->UPIER;
0 @; T% y: ]) W) T5 N/ v }
5 r X2 j. b5 C/ _ q
+ y4 O! {: f& E9 I; m1 v8 y // finally: write 0 to EOI register( ^6 y( M, `: r8 T: a
upp_reg_hdl->UPEOI = 0;# _* i: U& }& J1 w( B, M% J2 H
return ret;
, u) U* F- d1 D4 H}
0 y" {% ?6 {0 s @( e$ adsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
1 X. p: `( p1 h2 v# O) z; R1 F. F#define upp_dma_sendstartQI(x) {\
" {) a3 ^+ @* p, q+ X Wait_upp_SendReadyQI(x); \5 I( a2 V6 E9 F" `7 Y1 z1 b7 m$ r
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \- _# M. }2 o2 }$ ^$ F6 m+ B
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \# h8 Z) k% O2 F( B) L+ @4 V! a1 o V
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
' _5 r3 A5 F' Y0 S }
: g3 Q' R6 u) d4 B0 y- D! K
! E q: G; s( @# f+ ]' p; u z- Y5 ~+ v0 i+ g; g
#define upp_dma_sendstart() upp_dma_sendstartQI(I)1 ^4 c+ z N: T6 U5 b7 n
" |) Q5 B6 b) J2 x2 y8 y( Q8 k6 L0 z/ ~. K! f% u9 }8 x
想知道uori错误是在什么情况下面出现的,好做出修改。
3 M Y( b/ z* W0 X6 i6 j
: w( B) j- X" H! V, ]) Q, ?8 |; ]: F/ U+ z/ { O' X% g
|
|