|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
' k" I H+ }8 |0 Q {0 ~/ E' J6 |dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:0 H% ~ R0 G8 q F1 L
u32 UPP_Isr()- s: \. {; ^& T7 @) m
{) H0 h( E6 p1 @ `$ P+ s8 }
Uint32 intr_status = upp_reg_hdl->UPIER;
6 ~" o* m* o# e3 C upp_reg_hdl->UPIER = intr_status;//clear0 Q2 ], @1 R+ z: [) ~' Y
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
# k) N; n& j; o, p3 ^( J u32 ret=0;- |8 o( e* v( K9 y4 Q, P
6 r* ]0 o; u+ ?
// inline functions
( i6 I' V( X( k% X while (intr_status != 0)
U" T$ ?5 N1 Q& j# L. T {7 _$ Y/ B5 e- G0 M) q3 t
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
4 H2 ]. G& r ]. I+ o {
1 A5 u# s9 _, c1 y$ F// Log_print0(Diags_INFO,"eoli.\n");
1 L& _* a) i1 z; ]! v2 P# k5 G/ ^ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);- z: Y8 Y0 c" C7 W( r( U
}
: V% W0 L, M- V2 W) ]9 ^# {7 R* Z
( A9 I$ U" v$ Z8 h# f, { t. n if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件0 R$ c2 F% f" T1 _' @
{
% K8 O% C i; T( E0 Z Log_print0(Diags_INFO,"eowi.\n");* `$ k7 g) |% N, {, I
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
( Y* a, j+ y- u: ?" Z% Q8 W upp_interrupt_count++;
/ ^- S* `: R; t2 N( g upp_interrupt_eowi_count++;
0 j# K; C& a& X/ E) i
6 L5 j' X* ~/ y& C }#if UPP_DIR_QI==0' x+ w$ A/ `+ s! l; B
upp_dma_receivestart();7 \9 \# r& |' G% H
ret=1;
! ]+ H6 U: m1 | c) t1 h. J I2 Z#endif
& W6 ~; o' G0 |7 u: o }
! V# s9 r8 z0 A4 A* y, ]8 |# t/ m7 g! H
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
7 H- j' F! e4 }! x) b4 E {. C2 d/ }( V1 M+ F- p2 t
Log_print0(Diags_INFO,"erri.\n");
3 ^) \- T% Z5 {$ t3 s# w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
6 _, K' I5 k* _" n upp_error_count++;% M1 c# x B- k& g# k
}
/ H9 T: {( o1 e; P% _ [2 \( _; i4 `8 L( x" X4 r
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
3 z/ C8 w1 O! ]* I4 d9 l {
* d( G U, e' c; m2 i! a; c' N Log_print0(Diags_INFO,"uori.\n");
; ?/ s2 N) s3 G0 Z w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);! z! y5 y, y6 ]/ m
upp_error_count++;' B' O, u2 W$ B! o9 R( L
}
% y) h$ Y' R: p7 `1 ~- R0 N: G
+ \* e4 z9 Y/ u. e t; \ ~0 z+ h if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件# q5 c! A: G9 p& U5 _& \0 w
{
+ W w3 z/ E% }7 J Log_print0(Diags_INFO,"dpei.\n");
2 ?8 Z# X% ?! M/ e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);' @1 O8 w1 l( J W3 [
upp_error_count++;& m2 t* }0 f3 m" y! Q# R- k# F
}- g K- t5 _5 C% F& K4 Y4 n
l3 m0 Y8 v6 _" f. A if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
1 {1 i8 ~% C; q% M% D- b } {
+ R6 M+ y* ]5 y+ l1 O/ T// Log_print0(Diags_INFO,"eolq.\n");
* c( D7 C- d$ n( c9 ^9 o; y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);3 _ J5 k# k9 X
}* E7 p1 U, t+ N7 \. J* T. b
4 G8 g$ G- ]) F
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
' t) L: o6 L' G1 N+ |6 g {# X1 A# A* D0 S: p; v8 N8 S- w+ X
// Log_print0(Diags_INFO,"eowq.\n");
; I* F3 l; t* O2 Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);, j0 Z5 @$ j% F5 r
upp_interrupt_count++;
# r( c. z8 n! _7 \% ]) H#if UPP_DIR_QI==1/ J' L) j7 r; B- J
upp_dma_receivestart();' n! }5 o( u2 o5 w& i
ret=1;
! q/ O! |: Z' }" u5 w" {#endif8 e/ @: h, w* p* b% Q
}
( F$ |- P! x7 N5 `4 u2 b1 ~& C
2 y9 [! S" V; N: N, K. | if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)9 e$ {$ U+ z/ e" e* o5 ? U
{3 x5 l* A- P6 I
Log_print0(Diags_INFO,"errq.\n");/ A1 N4 t! H# D4 N( g8 h
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
+ D( b% ^5 E$ a4 o* [ upp_error_count++;
1 Y- ?; o3 d/ Z; X; f$ l9 Q Z }( ?, n0 a& u K
% h( b# Y# ]9 X: l3 @- K
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
2 U2 l2 a$ R& N) d7 d$ E% m# R3 e {
. g2 T! Y2 A6 P, G8 R6 E( a Log_print0(Diags_INFO,"uorq.\n");2 D; _- L0 [5 K2 S/ _+ \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
1 R9 e5 n: x9 u' x8 F/ a; _, K upp_error_count++;$ K" y/ J [( u9 J! ^
}! j$ v1 ?2 b H, O6 m; j1 q H
8 W3 }" k$ W6 U1 C0 g! h
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
8 l. w; ], l' w6 _ {
6 P8 H% c9 y G( I. m* W& W7 E& h Log_print0(Diags_INFO,"dpeq.\n");/ R. r& U4 }4 u ^+ K/ S6 f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);) i3 v* G8 b4 G( `; Q
upp_error_count++;1 i, R& }# |9 t( R, i, r( @
}! }% v* n, Q5 b7 J# Z
$ P/ k# l4 h' W% j8 x( Q/ s
// make sure all interrupts are handled/ B5 k7 R& c/ p6 Y6 P
intr_status = upp_reg_hdl->UPIER;
* z: J) d4 j: R" F7 | }
2 |, x. i" Q8 M- N N
/ [2 `0 `: }& h$ q: A% R // finally: write 0 to EOI register2 l$ K5 c; C r
upp_reg_hdl->UPEOI = 0;( S8 U# i! T2 d) X$ I8 L7 {" A5 h
return ret;
$ ]4 }( n( s" k5 B1 G: K! p}% i" V! T- z1 C. p
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
# q- ^, b/ j% O9 u#define upp_dma_sendstartQI(x) {\0 k$ |; X. g0 u# u$ |0 y
Wait_upp_SendReadyQI(x); \
( d% o c& q. E2 k# a* s1 l' d+ i. z upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \# H$ D# P$ _- L" e3 Q
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
9 l& T" N7 p! x( S/ Q) w9 a8 v upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\/ B; W# `2 b3 t r) D8 Z% `
}
+ h) J9 s9 G) H% B8 s+ F0 |- p1 c" f" X* A4 g
- }: G; p5 }5 U% D7 m% Q" M#define upp_dma_sendstart() upp_dma_sendstartQI(I)
7 y) v& E1 a% [6 t! E' |) q/ E* t8 `: k$ [ P
1 a* _9 v9 _/ R! `9 Z想知道uori错误是在什么情况下面出现的,好做出修改。/ G1 I- b E+ J) E
/ h7 N$ F3 _3 q+ f" D5 E" D$ x
0 V4 m1 ]6 ]' l0 ~7 U' s, [ |
|