|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
# x8 _9 n/ i! d! u/ u% h) edsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
3 P: S- U6 k7 d4 J+ z* U. Lu32 UPP_Isr()$ _. `. x/ e3 n: i) p) Q$ H
{2 P3 R Z; h! Y/ `: K! p: B
Uint32 intr_status = upp_reg_hdl->UPIER;9 e. P1 |9 ]4 t7 C
upp_reg_hdl->UPIER = intr_status;//clear* C: l5 u2 b# K" ?6 z# N
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); g, \/ B7 B8 K( t9 w
u32 ret=0;
6 {! j% H& S% H7 B4 f
& L( x+ W+ \9 d. b // inline functions' p4 s0 A' j) w6 ]! |
while (intr_status != 0)( t( T) f; v4 n8 t1 z; y3 d
{
, d% l K/ U, j3 a ~ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
; M" E% m5 s+ O% _- E {
; [$ Q- j8 W9 y2 ]- C6 N- s, t// Log_print0(Diags_INFO,"eoli.\n");# i" r" s2 f/ n7 m( T& @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);$ f9 `7 B. q M$ k
}/ N1 _8 P' X& _9 J
( T3 @. J' |$ M) p, R2 ^7 h if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
9 O% `+ Q2 x* q& B$ y1 ^3 _; c {
8 v! d+ p; m5 b4 Y6 e. a4 v Log_print0(Diags_INFO,"eowi.\n");
3 {4 e( R% c$ Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
+ ~5 \. Y0 o1 C7 X, t) U' \! ]' _; A upp_interrupt_count++;+ Q1 d# ^. o) R/ _1 d
upp_interrupt_eowi_count++;
1 d6 ^0 g: h& w& X) p
4 z6 Q2 Z# Y/ q1 G' c! }#if UPP_DIR_QI==0
2 \5 j9 M9 ?, ~/ |6 @3 l6 k( _& @ upp_dma_receivestart();
* v3 k" p/ D* B8 y) y! S ret=1;
# ~+ {9 Z9 z: s" t#endif9 V/ q! E; v& h- @( y' U
}
$ g! I$ W, y5 L- _9 p
3 j! E; v q& v" J. E5 e if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
+ U4 C# I1 y7 K: G7 S- z {
. Q1 b7 b% L; D' w2 a Log_print0(Diags_INFO,"erri.\n");7 Q) Q* _; x5 l# ~8 h5 |+ ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);/ M9 c r- \& W9 s
upp_error_count++;
, U& J0 R [$ d6 f L }
2 y& v7 G; a/ X7 }
& V% r7 h. u! `# M, L* I; _- {- j5 ? if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件* `/ n7 i0 [: H( ]% a3 F3 ~; x5 r, K
{
1 V5 e: m" [/ S% y' [2 K Log_print0(Diags_INFO,"uori.\n");
6 s9 m3 [1 d6 W e6 S7 C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
' V2 M! E' p/ s N% A upp_error_count++;8 j; S) v+ [' `( @$ Q% X9 F8 j
}* F6 N" w c7 x5 N& H2 \
, k6 W; R8 H7 S+ O" d
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
: ~# f) r" ?. t6 ]/ ^/ \ {
3 ^) C* `3 _) r7 h1 S3 ^ Log_print0(Diags_INFO,"dpei.\n");* B2 k1 V2 T- ^) ^ W, M5 \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);3 h) ` l# _( _ Q
upp_error_count++;
8 k1 E, G6 r i0 E }
) N) H6 `7 G7 l9 |. U3 `1 ?" d/ k# \0 w) a) @1 D7 w
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)$ p/ N9 g. Q& A
{
- J1 S: o( P$ I4 T# W, J// Log_print0(Diags_INFO,"eolq.\n");
8 n. i; w* }& O0 \2 K$ i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
2 D+ j6 h2 C# \3 J! j- ` }* `) S3 }, I+ F$ w
; f' W. H2 Q& d, }+ H& [
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
3 g' T4 U+ |; j! d) L, [1 D9 O: x {2 `3 h( t8 l* d% { y
// Log_print0(Diags_INFO,"eowq.\n");
4 |3 o& c: q4 t/ |# }2 }: J% S upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
" w; U$ S8 f' w& n5 Y upp_interrupt_count++;
9 i6 i: N- a% r, h9 ?#if UPP_DIR_QI==12 J. Z3 ~$ b( U \2 n) j
upp_dma_receivestart();
/ [5 z# ?9 Y6 W9 [ ret=1;5 g& Z6 l4 O/ _3 d5 w ]" T
#endif& v2 Q0 \" ^: H
}" A' N# i( M% E' N2 A$ L
, v7 C, u' C9 G0 V$ t/ r* P
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK). J6 F* Z6 e* [) ~/ e* F/ C" o; u
{
3 @7 m7 Y; @0 j5 X Log_print0(Diags_INFO,"errq.\n");
; \; y( j2 i3 c0 ]1 V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);' N( D, l; }: J1 f8 s O
upp_error_count++;
3 g8 C6 J$ }7 U% L( k }
2 |- W. ?; _2 x0 e% ?% t8 l+ N
+ _% `; b8 J) l. Y G, ?# d9 e6 ^) v if (intr_status & CSL_UPP_UPISR_UORQ_MASK): _3 _+ `" `, L
{, w- ?, [: p5 m" ~
Log_print0(Diags_INFO,"uorq.\n");
& w( B( I, }6 N0 r" @8 m9 F. ?+ Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);' U1 h- g. ^0 a# H# G2 v
upp_error_count++;" _: \1 W! K* ?2 s, H# `/ K, m( ~
}
# O u% G/ [1 _8 E3 h* G$ o! n# n# P H" ^ [" {2 a8 u
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
/ Z; h8 Y) {4 y# b9 ?, K' u {
. D1 U* w* V$ s5 H0 o Log_print0(Diags_INFO,"dpeq.\n");
! o" S: {+ T3 T! P& }9 q4 y5 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
) x# U4 I8 Q8 m: X: x5 L8 S/ x upp_error_count++;
% @. n# |& C3 d0 Q" o* Q: {* A }/ Y, C' T1 y& y7 b) {( p5 |0 A
& D- C- ^+ K+ L; k& ` // make sure all interrupts are handled
/ {. q; R0 @& l7 l/ o7 q; U intr_status = upp_reg_hdl->UPIER;3 ?9 t' H/ \# c4 e. ?+ L- H, u2 V
}5 {" H6 |# g5 g8 t# ~, G# A
5 i5 C# l# H! h+ u5 Q9 f
// finally: write 0 to EOI register
7 g$ e2 b- ^) I1 R& r upp_reg_hdl->UPEOI = 0;
9 b8 C! ~2 E3 x' W, k, @) a# ? return ret;
- m |- O9 s: ], f7 Z% H$ A: b}
) o7 Y0 Q" @( A6 \' f$ zdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
7 r: ^9 x0 V& c: T" D9 N4 p& c#define upp_dma_sendstartQI(x) {\$ [- k! Y$ ~2 {9 s$ m- @1 C- J
Wait_upp_SendReadyQI(x); \
7 i% D5 S2 a) F5 S; ?: C upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
9 n1 A6 r7 N. B1 p) L& u8 I upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \. w/ P: B5 |( M$ t7 F/ P: A+ n
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
6 g( j- w2 S5 B1 V+ M) f& { }
% J4 E9 {2 Q: @+ U+ @" r
" f3 }- _. q! s; M
. A& P! n) X- t$ u Z7 e#define upp_dma_sendstart() upp_dma_sendstartQI(I)/ }* F% B' t+ k4 T; z6 H
C; x: a, B; A; [: O; Q
- a9 x( q5 M* [( r& r( x想知道uori错误是在什么情况下面出现的,好做出修改。, X7 y. P8 o8 q
$ a; V5 W, m4 h5 c4 R1 m" u* o
% Z6 n7 c N+ v1 @+ n: u/ h |
|