|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?- {$ Y9 Y4 a% ~5 o n2 k
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
3 u9 a3 a0 }3 d" m' Pu32 UPP_Isr() Z& ^% k0 p) t9 H- Q* i$ ?! L
{
) e. |, v- G6 K1 ~' r7 K1 u, S1 z' Z Uint32 intr_status = upp_reg_hdl->UPIER;
0 g$ K+ @2 W' A( {' A upp_reg_hdl->UPIER = intr_status;//clear
6 ?& o) } {$ G) g" M2 z4 o// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
3 B& |+ l7 p) a" l! y' e u32 ret=0;
# x1 `8 \: }! ~! R; {9 s; v; q
$ S- z. o7 d ^! [) C3 G // inline functions
( f2 I* c+ c: a8 \4 A8 o1 a M! { while (intr_status != 0)
- t- R4 o3 |9 u, u0 {# Q/ F3 n6 ? {. `' G& Z3 i9 O0 Z. {
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
* _* _ {3 q- ]. r- k4 o- y' n `$ I {' q+ M; J+ ?$ l' T/ R0 m# F2 K- r
// Log_print0(Diags_INFO,"eoli.\n");; F$ y6 l+ S1 b$ m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
$ x! t7 d9 H8 W; J& K- C$ G$ B% h }9 l4 ~/ n# o# ^! |( m" p
2 Y2 W3 n) u, \: m if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
0 y! `; U% X2 A6 l8 k {1 _8 f1 P1 x, G3 Z7 s
Log_print0(Diags_INFO,"eowi.\n");
9 z' c0 [- i; b4 b- [; ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);! [3 u( k. {9 ~% I! c
upp_interrupt_count++;
+ u8 \0 V5 Q6 j# n" N2 z upp_interrupt_eowi_count++;
# K8 p8 g$ {, t8 h8 C- H5 [8 q q+ c* R, J8 I
#if UPP_DIR_QI==0$ [! v2 k' N: C& ~! F
upp_dma_receivestart();: |% e' O7 }, h) o/ L/ o
ret=1;
; r# j# O5 [* l#endif; U+ D- @; ?& @7 i! k4 @" K
}+ k/ s6 J; y2 Y1 @8 Z J) U J# U
+ D6 a: Z* q* D! d, T9 V7 | Y s+ p
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件1 t9 c- d- O w5 w( o2 L
{
3 q! b: D6 w6 E9 i/ X Log_print0(Diags_INFO,"erri.\n");
% b, J+ ?3 b! }; J- s, i! B1 X: M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);/ R0 n% n" ]' E+ S a6 D& x! z% {
upp_error_count++;
7 G1 d; R' y7 o4 d& I/ G }
( R7 x6 K8 p9 \! w
e+ Z" u# P5 M/ n9 N9 d if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件7 j% k* S1 _+ }: i; }: b2 Y
{
8 w9 H1 L7 L0 z: h0 j! J- o Log_print0(Diags_INFO,"uori.\n");" k* s3 ?9 C! z" y% }5 S, I) Q, X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);; U0 c5 m5 d* Z9 B0 ~
upp_error_count++;
% Z+ [( Q( R( \- m1 O }
1 `2 `5 f* U$ c: h: o( I8 x- k% ?. ?; ~2 q: M$ Y' M: S; i3 |8 w9 d/ O5 p# X6 Y
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件! Z5 ]2 e$ ]" h5 T
{7 \0 V, `) X' b. t' Z$ a1 q$ ^
Log_print0(Diags_INFO,"dpei.\n");
1 e7 R+ c/ C3 v; { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);4 q( X- l6 G+ \* H+ x
upp_error_count++;5 ^: `+ v% r: C& U( |$ h* U
}% m8 M1 D# G+ P3 a$ N4 i
) I* K9 m( f' l2 \" I9 Y
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)6 y" H( ~6 Q3 O# E
{
9 {; f k$ f# n) K+ N// Log_print0(Diags_INFO,"eolq.\n");
- q. E: C& ~0 _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
Y8 @* a* `' E' ^0 K- r6 C }
4 i" f9 Q% d, l# ?+ G; e4 M4 |1 u5 h& K: q! ?7 c, A
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK): T% k1 x* H! c* g2 w8 ^& l
{; U9 _" F' S5 c6 P0 i" w" @+ Q
// Log_print0(Diags_INFO,"eowq.\n");
. n h+ M4 k/ |; m7 B( ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
2 a6 f( F. B/ y7 u6 M upp_interrupt_count++;
; G% @. c) r: O6 C* ]#if UPP_DIR_QI==1
+ J5 X q3 Q, ^; T upp_dma_receivestart();& r8 s" u* h1 K9 F$ V
ret=1;4 P) R9 `4 ]; ]5 J
#endif0 H3 g+ K/ q8 `$ A, g) n
}
, Q/ h. s, e& ~+ o& E( w' N: m* W# R: P* N4 W4 |) a; Z
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)8 d/ X1 W) z( \5 J
{4 S) x4 ?' d9 N/ H! n1 i
Log_print0(Diags_INFO,"errq.\n");
$ Z% B9 \. D5 E' ^3 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
5 B# q9 Z. l" \* K upp_error_count++;7 E7 Y* w" x3 N" G/ z+ v b! x( e
}
! H- v9 {; `! O7 P+ E5 }2 V+ ~! u1 ]' |
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
1 {) e2 ^) d! N2 a* q9 p {* E1 ?& [, l' a: y
Log_print0(Diags_INFO,"uorq.\n");0 i0 c; [2 z$ E6 w* a
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
7 l( t# f- @3 W; f upp_error_count++;4 o1 d' \0 v! k5 J: s. w# r) ?
} r6 V# @9 ]+ W: t
) {) z1 Z+ D! l& r0 r
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
. [+ P1 ~) r Z! Q ~ {% J: P" c# N4 X+ b5 p
Log_print0(Diags_INFO,"dpeq.\n");! f0 S0 d/ Q7 D2 s2 a& h2 R
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);8 |+ [: ]' }, H& s! J
upp_error_count++;1 n, q5 v" D. Q9 f$ V/ m* w! S
}: Y9 {' ^! l0 d% Q& @
. N& G& h9 p! \6 `0 {- j // make sure all interrupts are handled
: z- m% v4 m: S intr_status = upp_reg_hdl->UPIER;% o. g2 M3 J3 V4 M/ s
}% H, Z- a" B% T1 N& x, y% R/ P
' K+ F& D0 x$ {. q1 q1 A // finally: write 0 to EOI register
4 R. |7 b7 ^6 g# t upp_reg_hdl->UPEOI = 0;
/ f* S! R, m; }! h* C( Y+ _8 O/ k return ret;
+ r- g- P$ c$ @) f( a( g. v}
. V6 ?+ F7 U7 z% z7 I% j0 ldsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
3 f) k- A* \9 J) r* m: s4 M$ e#define upp_dma_sendstartQI(x) {\' A/ K- b8 ^$ C6 n
Wait_upp_SendReadyQI(x); \
: t" D5 L% B& c/ q upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
* K/ F/ N; H9 Y: S( j upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \+ L# w* k% @2 g' q2 \1 r
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\; j. M' W+ H" R5 c R
}. u. c: g0 n% k- j W- R8 M
0 n: b/ k7 p; F: x* l( _: p6 @% Q4 n% i- y$ h! h$ I+ w
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
7 a5 a) N$ @( {) s& Z% c/ I4 K( O" v- ~4 _! d; l
/ V0 F+ h! R _ b
想知道uori错误是在什么情况下面出现的,好做出修改。0 E: J8 r* j# z
- c& b) w( u" |6 a5 ?2 N/ [
$ D4 ?, _/ \0 Z/ I
|
|