|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
( @1 v& g+ r+ {- mdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:- y3 f" P$ j, g1 V5 }( V3 B
u32 UPP_Isr()4 }+ b) S. b8 i3 K
{$ q3 G' v1 a h. {0 i) W
Uint32 intr_status = upp_reg_hdl->UPIER;
) f4 q9 g# d- { upp_reg_hdl->UPIER = intr_status;//clear" q4 V) s" ], }* n8 A' b+ l
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");' z4 [1 s* ~. Q9 P' P& c
u32 ret=0;8 {$ G. v( D' u: Q
8 u5 F) [3 h, A, e1 B3 m: r
// inline functions
. S7 W& k) h7 v0 A6 F( Q5 q1 Y/ h while (intr_status != 0)( h1 U' M" D0 w, x6 I3 y" m D0 F
{
6 T2 S8 s( L# k h* v. B2 _ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
& H5 T. [- [2 L {2 P0 k$ m9 t! U Z
// Log_print0(Diags_INFO,"eoli.\n");5 b- U! o- O- G ?2 D) m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
- ?$ t/ S6 ^) m4 R* H9 p% P }
0 x: `& a3 ?' T! p0 \6 x7 j% C3 `8 G* O( p) W! d) {( F& R
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
$ `7 K% ^5 m6 E+ Z+ l* x {+ M% G. `2 W6 [, N1 j
Log_print0(Diags_INFO,"eowi.\n");9 }; J L0 I5 i) e* e# B. l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);9 i% F+ S O6 F& \4 m
upp_interrupt_count++;
" ]* O/ x$ O3 S1 _8 B1 b1 V upp_interrupt_eowi_count++;
7 u7 |6 @# x! K- o
& @) K, ~- M0 D. m% l8 Q3 e#if UPP_DIR_QI==0& @. h6 D4 E1 F, |3 y2 X. y
upp_dma_receivestart();: ]. e/ v9 j: T
ret=1;2 H c. ~# T) r6 Z7 Z. F, k6 k( q% Y5 g
#endif+ |" S) i9 i7 f/ E+ i
}, _. N/ b1 y" R6 S5 v' I% B
* d9 L+ K5 S5 D5 Z if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件, {# b; p |- Q) e. K, ?' e1 ~
{
$ u/ g; e- h- o7 s" X Log_print0(Diags_INFO,"erri.\n");0 |: T A4 `) D! L" g, ~" n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);6 W$ V1 @$ c E
upp_error_count++;
. P0 J" J# `4 h& S, t }
+ l9 e' E; t0 q( u& b. a9 Q! ]* W$ z9 h* C& v$ \/ w$ P
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
3 B v% @& p, q0 z+ P& k {4 e' W& n7 Q7 { G" k. g
Log_print0(Diags_INFO,"uori.\n");
. ] V1 f0 S$ Q1 w# W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);! E& H- J# E: k1 A5 s& R
upp_error_count++;. P4 _' l6 \) U: G5 q3 y
}
& O. N- f* D. ]1 Y$ k% x3 Y; ^, h; k! q: C( C5 R" N j
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
" P1 I3 V& I) y! n {
( }' S3 _/ f7 |8 g$ L1 v Log_print0(Diags_INFO,"dpei.\n");, n/ a: v7 {; {2 l& o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);' W/ ^, r2 T" u, y5 Z; |% f
upp_error_count++;& g( R2 Q8 d7 m7 M# N
}. P$ C, l: Z& F4 D' v+ H
6 |: i* d3 |0 O/ f, s# }3 L, W
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
7 j3 X8 `# C- j( r7 Y' F9 n# ^* L {
$ l! ]% M2 Y, [7 R1 n% ?// Log_print0(Diags_INFO,"eolq.\n");& D3 I: ?! ]( T, @* T% N7 z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
9 [5 a& ?/ ~2 K7 ^- T: a8 s }
" A0 j6 ?5 ^1 r; F# u
0 g; l% J4 ]% A- W3 R& |6 ? if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)$ z+ J9 R4 r; C4 t1 T) w! {/ u
{3 x. {5 \* _" }; ~
// Log_print0(Diags_INFO,"eowq.\n");! L; ?' _) C4 B# h' N0 W% Y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);7 f7 Z! }/ g1 y
upp_interrupt_count++;
( k7 y& n5 Q; S! |4 J7 a6 g9 o. ?- ]#if UPP_DIR_QI==1
: b/ H% @* k9 ?8 U upp_dma_receivestart();$ ]; M$ j1 @% [) a4 z
ret=1;
/ v5 T6 @- y1 V! N1 n! O: {#endif6 z1 A& u1 E9 o( q
}
& J8 n# e" m* A' \3 ~( ^" K- z; k4 i4 u9 t
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)) j! U9 I4 P* ]5 F$ b/ b
{
0 j/ W' H* b& w7 g2 b6 C( m* I Log_print0(Diags_INFO,"errq.\n");" [4 z1 B! e3 O b! N# R% l4 [# b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);8 [4 L8 q* {2 L5 ~
upp_error_count++;
- ]- M! b. [2 B }
+ `) S/ g( ]1 o: I5 u
6 f2 j3 |* ~- e) T, q, `: D# O if (intr_status & CSL_UPP_UPISR_UORQ_MASK), q: n5 w( `% u7 s9 ]7 G; H7 K, C
{
: @) P6 g; g7 z: c Log_print0(Diags_INFO,"uorq.\n");
$ m9 g# t/ a! f upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! t. u6 |" G3 k- f: Q8 i8 J$ N upp_error_count++;# F2 M! f7 Z' ~( t
}- }& h& ^. {1 V e+ z% K2 _
1 J9 g0 d; S& Q3 b! Z! j1 W
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
" H# {3 o6 F+ d2 @: H {
9 Z4 j v* k( e Log_print0(Diags_INFO,"dpeq.\n");
1 G g. v% x- D& K* ~7 O$ } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
# P5 B% M0 m6 H1 V4 Y upp_error_count++;9 I5 B& _0 p7 a+ x4 X
}: U7 ^5 I. m6 ~: h7 z
, j \$ O! s6 U( p# J" _ // make sure all interrupts are handled- L: `8 N# J' e8 @- U( l! Q* L
intr_status = upp_reg_hdl->UPIER;
8 `5 Y% `, }! l/ |# D }
0 `$ g! R; Y# O! L
/ @( Y9 [' u: l' b // finally: write 0 to EOI register7 [3 _3 Y! @8 p5 ]
upp_reg_hdl->UPEOI = 0;
1 r: o3 Y* o o$ X# N0 p return ret;! _6 B6 A0 Q- T1 d, V1 X" q
}
. ], P9 U: a( U5 V; }dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):/ Y% [4 j9 C) O0 n0 B- h6 i( `
#define upp_dma_sendstartQI(x) {\
( u& a+ c5 }* `% p& m$ A5 E Wait_upp_SendReadyQI(x); \" w, j, @2 k: r6 S% V. @
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \4 c" \' S# `" i! ^# A4 `2 D7 ]
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \' D( t8 W ?/ s0 J8 I( `$ U! n
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
& @; n4 N5 w8 W7 r( ?" Q7 Z }
5 G5 \( V! ~. P. x4 F
( E. Z( K4 k$ j4 `8 C9 T* v& s* o* y3 L, q- x
#define upp_dma_sendstart() upp_dma_sendstartQI(I)4 l" Z* k& }6 n, B% E* f k
, U3 u' `$ p' [+ l9 A: E# T7 W2 ?) i1 d# @9 B" i* m8 o
想知道uori错误是在什么情况下面出现的,好做出修改。% k3 s7 @+ I" Y
8 C- x% M5 U6 [& Z
9 ^% \) R f7 m+ ]' G. _9 k; m" A# f5 S
|
|