|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?5 \$ X% n! v9 |- A
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
. t6 ^9 e: q7 ?( ?1 mu32 UPP_Isr()
) d- ]3 U7 z1 K/ H) U{
: B0 z( M+ l: }! D Uint32 intr_status = upp_reg_hdl->UPIER;- N% d" e0 I$ ]& I
upp_reg_hdl->UPIER = intr_status;//clear
( x. A6 `' W7 x: d* E; Z// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); C, r5 ]* I% m. x
u32 ret=0;7 {9 i1 @. R* K& m" x2 s8 T! c" P
6 `( y. W4 o! \" Y // inline functions% n% c* `; \9 g d9 |9 R- o
while (intr_status != 0)
8 Y5 a9 P. g4 z! K7 v {7 X& w8 T; o# _7 w- ]$ L
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
) @3 G: D5 `) X, | {- q6 g' y1 ?6 u& d
// Log_print0(Diags_INFO,"eoli.\n");
9 l! B% ]9 @; e6 U% U9 y8 O upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);0 t6 l y) X4 X4 ?
}! z$ l \& q @- M
) T( M' q. c+ W' R" c if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
: \6 D( I* Q2 a2 W {
6 c* M: j" z8 ~4 E; S Log_print0(Diags_INFO,"eowi.\n");
1 L2 P9 S& {5 n! j% C( g) n5 Z; v; Y! L: b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);3 z: a( k* F A! v8 B# c
upp_interrupt_count++;
' n+ y* R7 h/ |' v& b( a( O upp_interrupt_eowi_count++;
$ s$ S$ ]* `4 O/ W5 N7 j# L9 {/ I! M* t/ `, {" n. p! f
#if UPP_DIR_QI==0
) y: H( g& C/ @9 P* ~/ y& r/ @; F4 F! S3 f upp_dma_receivestart();
0 f0 l& W& E8 ?5 }: N- X# o ret=1;
3 N* h! D) c6 c#endif
; ?6 d; {( \ C6 f: V }
% q; n1 L1 G* A; a$ f; G6 @* d# C; e, o0 V) F9 R
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
- b5 S3 y% ]2 o' r9 t! n! [/ m {
' z7 `" s+ A$ |2 z: k8 s Log_print0(Diags_INFO,"erri.\n");5 E' ^+ x% l- y- y3 z; N N
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
( c: X" l8 j) {) g1 T; m, n upp_error_count++;, Y; `6 _3 D3 N! l `
}* ?1 B0 s( Q& ^$ w' s
2 O# t5 |: |2 r" B if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
8 r C9 g' j, Y. C; j {" k9 w+ k( e+ h8 H7 h
Log_print0(Diags_INFO,"uori.\n");9 \9 ~- r; i8 W2 h4 H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);. ~! X' L+ B; P. m5 C! o& h
upp_error_count++;* E( F* n& d/ R- M
}/ W4 f, D" A2 ^& ~* ~5 b: B
4 `. ?; z7 M# P* B# M# u$ |$ H- f if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件" V2 U, X* R, [' z
{
\, Z q/ W# [# s) r1 h' L( e+ E" t Log_print0(Diags_INFO,"dpei.\n");
5 Z" e1 K: \2 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
/ f& b# I2 ~1 N upp_error_count++;/ d) m; a! [/ J1 W& n2 c0 V3 h9 g) d
}* B$ |% X9 h8 x
0 c( q( v5 g; u; L if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
- `" k4 e* }7 J3 X4 Z4 r4 n: n {
+ M, @- _; |6 g' k// Log_print0(Diags_INFO,"eolq.\n");
, G. Y l. |& A; S6 ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
, V$ O# Q* n' @! T% R }8 W& ^1 T+ S4 ^* R
3 M" e/ T$ B$ c) m9 J, F
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)' Q% G/ _, ~2 g) c" h
{
/ t6 {8 Q5 E7 u# L// Log_print0(Diags_INFO,"eowq.\n");- p7 q% j8 N" G& N) y. E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
) j( V+ W3 ?! w; o upp_interrupt_count++;1 u/ k3 T8 S7 F( |2 E( G
#if UPP_DIR_QI==1' J5 U% @0 j. i4 r8 {$ A( c
upp_dma_receivestart();
3 ^: m5 |& R: D2 a6 \" T2 @1 q ret=1;* g% Y- n+ }' d6 H, ], W
#endif8 q' j1 J$ [7 [5 _: O+ D$ Z
}
9 Y7 H: P& }# o' w2 O7 M
5 _9 F3 L- G' O6 U* m if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)& }# r4 \6 m# E" z, c& G' h
{
$ j/ A$ y4 e" ~3 `' M' E- h Log_print0(Diags_INFO,"errq.\n");# \) O' a& l( g* b1 V4 J1 s3 H8 z* M
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);) M: y0 ?: z5 W0 n2 t) G9 @) ?% D+ L
upp_error_count++;
" U w% H! R4 k) N2 u }: @' s. ]0 b/ n0 w& r
% \$ P" V# x! ^6 S
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)& d, X& q( r, {& d( |
{
- c. p% h7 n9 p& F Log_print0(Diags_INFO,"uorq.\n");
* c8 Q2 t3 W9 J upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
@% z; q0 Q b& v1 r upp_error_count++;
8 z9 M2 z; N1 Q, l T& b( O } \2 B% z5 T0 E( K6 m! S, ^& u
+ q" Y' r% }: B. b h9 d if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
# t, |4 c, u; G. Z {% Y8 y9 O# h/ V+ }( e
Log_print0(Diags_INFO,"dpeq.\n");
7 n+ m+ e& B6 C$ ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);4 g! z* k$ }8 z2 U' l m
upp_error_count++;
% o9 [1 N' T' ], P1 V }) j! {" d' S0 K! v/ p3 u) ?0 K
0 x% Q5 C+ f. s4 @* d6 p" _* Y8 a
// make sure all interrupts are handled
7 G _0 g! `$ s7 {6 `' h1 P2 O6 u intr_status = upp_reg_hdl->UPIER;; u& h J# w1 F+ {
}
$ b x5 s3 K4 `8 W
# W: H1 X( |) _. e& O2 L4 @ // finally: write 0 to EOI register# @6 R/ v) u1 V
upp_reg_hdl->UPEOI = 0;# R% I6 y; K5 c2 y2 {: j! Q
return ret;
) {1 `8 e6 e) Q# {5 A} o- d! r7 X% W d. m
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
s7 c: P7 Z! E#define upp_dma_sendstartQI(x) {\
) {* ?6 B+ r6 ^9 h$ e Wait_upp_SendReadyQI(x); \8 ?9 |7 X2 S! a8 s
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \. y+ Q4 ?( l: c% d, n
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \8 ?2 |3 O6 a1 H2 Z- K/ N8 D$ O
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\: A0 K# R1 G0 K% V
} D. S+ Z. N) T @. `
0 w- ?; a/ P* i; q; r) ]
( m4 A! R* D! }# N3 I1 |; h% F#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 g( }5 x: _& N7 o- U5 n! z" N9 v, P9 m8 k- _/ }" I, ~. y
3 r4 ], r, }+ d" M9 I; p3 `% y想知道uori错误是在什么情况下面出现的,好做出修改。
5 v# H1 s. }% D9 X5 {* V/ [) R! O
* {* A- R" K% H |
|