|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?# \8 B7 ^9 S( \+ a Z+ [# ]
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
j8 K& R) [1 H& hu32 UPP_Isr()
! q; X& P2 {" x: s( D# |" d+ b+ |{7 Y7 i2 C# Y6 q
Uint32 intr_status = upp_reg_hdl->UPIER;. ^# P$ H2 a( Z2 C6 v9 R4 j. K
upp_reg_hdl->UPIER = intr_status;//clear$ c b% s3 j" d% Y$ d/ b/ V0 Z
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
- L* t9 _; M u4 @1 c, M u32 ret=0;9 _% p! x7 ], a* h
( x5 G. h5 P# c // inline functions' _8 g0 Y8 i: E$ g, Q+ v
while (intr_status != 0)+ y5 v% F p S3 _, k
{
$ b. M1 y$ O `( R6 \ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
* f1 A0 G$ M& U {
2 @: x4 \: |0 ]& a* O$ W4 a- b// Log_print0(Diags_INFO,"eoli.\n");+ Y2 L$ |5 N4 i% ?- s1 d
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);: V# l/ n+ g1 p# z: U
}
+ o- z, _5 w5 Q8 R8 B! o( E8 n# R; U6 M, z a c% `4 y2 ~/ E
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件3 P! g: V! j$ z+ b u5 m3 J3 t5 \
{
/ K6 i9 T0 }1 M7 O Log_print0(Diags_INFO,"eowi.\n");
9 c( z* ]1 |# D% h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ O0 I" x1 z) f3 u6 {+ ?: y upp_interrupt_count++;6 G2 n7 Y% a9 [ l
upp_interrupt_eowi_count++;
& o7 n- \ y9 U* R
" |, o9 G! y& P L( P#if UPP_DIR_QI==0
0 S: P& B3 ~# P; y: p, h2 \ upp_dma_receivestart();
/ W: P! S v* s% D+ v ret=1;
* p9 S6 s1 j& K) x2 S( d: }#endif$ L6 |5 }; r2 y
}0 o% l U, @# Q/ B/ ?' H& ~
G6 Y+ g0 N0 ~0 g if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& E! a4 {# i8 ~
{
% s3 e; r5 o: L6 \6 L) G Log_print0(Diags_INFO,"erri.\n");
4 E4 C5 J% \) K* [2 H& F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
: l& O! B+ F7 j7 T# e3 n. y- x upp_error_count++;# p i" g' ]$ z5 J7 X7 U: p$ ?
}! w$ a' v! t3 p1 C
e' C' ^$ Q, \. {8 ]
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件0 k- s# E) d4 s1 C. K/ m9 {
{
& s% J) \5 u0 T+ {- J/ x8 H. Y w+ L Log_print0(Diags_INFO,"uori.\n");
9 R/ ~6 \( U0 w: A) s) Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
k) @9 v/ [( F9 i9 g$ Q: L- ?) D upp_error_count++;/ ?+ }4 v3 I4 v& j
}5 g6 O2 h+ o' \5 ~: ]* M
6 y3 b3 \, y7 b2 I. P if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件6 m8 W: o/ T7 Y) ~. n2 a
{
' ^% y3 v, x; s) _7 ~' _ Log_print0(Diags_INFO,"dpei.\n");
8 Q: K3 j, ]- o; l" G6 s3 V3 G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);! f( C; c# e4 @
upp_error_count++;7 F- O' Z) Z+ x5 ~6 c: i3 W" v1 a3 r1 q+ q
}
# m" s1 b( m# e5 W. J0 U( u) t: J; o/ k) ?8 @: f( n% p) B$ Z- ?( }
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
$ q0 |7 k' o b5 S1 x/ o {
0 Y+ L2 i6 r" X3 l// Log_print0(Diags_INFO,"eolq.\n");
` R! W, c6 \7 c. p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);- q5 T$ b' A+ L: a( N
}
5 J" d0 `6 q, a9 _1 K4 L! k# @! U$ G! n3 g) `. i* y
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)( c! C- Z9 T- I9 v; @
{% x/ v7 @5 x8 L0 ^" T" }: @% `& t
// Log_print0(Diags_INFO,"eowq.\n");; J' w* m' A. M* v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);4 G6 A* n6 ?; A. f/ R6 T
upp_interrupt_count++;* N1 C8 O1 X0 g8 m& T( u/ H) Q: k! O
#if UPP_DIR_QI==1
4 u4 K/ z' a8 |/ j9 W% h4 z% W upp_dma_receivestart();
( J, Z/ U9 K6 {: D" t1 w ret=1;& b& o: f4 U& Z4 d6 d; I3 `& V
#endif k. A4 k& k0 S
}
2 v w7 t( ~4 o r' K
/ e# P4 B1 ?- |$ S# J2 I1 O$ P if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)* T0 k% v7 f0 V: P: T/ @: O
{* q: b K0 b* s$ B: q, B1 c
Log_print0(Diags_INFO,"errq.\n");
. {) U5 `1 x5 n# R$ l upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
) ?% ]1 r* a; T upp_error_count++;/ U+ {& F! z4 h' h6 t6 m# c
}8 Q% H$ |$ q) X# r0 ~) Y% u# f
+ c8 _9 ?; c: D; ? if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
! K0 j# w- c# {* ~) T5 z {
+ L. B* u" u' ] Log_print0(Diags_INFO,"uorq.\n");/ A0 z7 s. P* S- y8 N k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
/ T. w! b4 F2 [% m) ^; N1 p' t3 o upp_error_count++;3 J! \ g& d0 | u5 O: C
}
; S6 k/ Y, L( C0 X
5 J: K+ e7 E/ X9 m if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
7 A3 ?2 U0 B( B* W" k6 F {% e* ^; J L. r# z
Log_print0(Diags_INFO,"dpeq.\n");
4 B$ ?& [/ o8 u1 G2 Y3 n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);# b6 K& n4 l _
upp_error_count++;- i7 p6 T/ d4 u6 A2 |
}
) b' Q, ^0 ]) I* o( X
+ O. A0 S5 _8 y$ \5 f- }( K // make sure all interrupts are handled
1 Z* E( o" P+ B( O2 X2 y9 } intr_status = upp_reg_hdl->UPIER;
9 U( D5 Z5 n( w) p$ u, n }
! P; T* K) a6 v+ F# {& ^' W, i" d$ _- o9 _! o7 O' F( K0 C Q3 c
// finally: write 0 to EOI register
& q5 R6 p% ]4 c upp_reg_hdl->UPEOI = 0;
" t; o9 r0 {9 u) y, i return ret;& o/ M% A% z$ t9 W
}2 e6 Y- ?2 K1 |) C: K
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
4 Z- k0 L* W8 {0 H( Z% [* g#define upp_dma_sendstartQI(x) {\
' u+ B" r+ v/ n Wait_upp_SendReadyQI(x); \
( C& j( ~7 P& q. n) g4 @ upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \9 _0 K& }, D' |/ O+ ~ J6 L6 x& ]
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
6 k$ n0 a' I8 a3 o* E upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\- Z' S1 h+ D8 b7 p
}
/ V. E. x1 C# L# S- c, q3 j2 r- p% l& b. h9 M- Z5 E
! o L- `9 J, X& I9 U+ x#define upp_dma_sendstart() upp_dma_sendstartQI(I)
! h4 ^% j7 i( [) e q( z; d+ {/ P8 c8 K! \
# q# y& x. _+ r( Z想知道uori错误是在什么情况下面出现的,好做出修改。
& V: l8 H6 R+ H
4 c* w5 H' E' U5 ?0 w3 n$ _- x
' y6 A7 h& |/ T! C1 \* g |
|