|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?! R1 x3 D* x9 a- s8 G- `& T7 \4 v
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:1 i9 V/ S" m4 R0 f
u32 UPP_Isr()! j; I8 t9 r& |. X. N4 S/ \$ q6 y1 G; _
{
) B; G$ U3 e8 I1 r Uint32 intr_status = upp_reg_hdl->UPIER;' N( Y' C+ _7 w0 F: y6 z
upp_reg_hdl->UPIER = intr_status;//clear4 E! e$ t6 W2 s0 P6 q8 B; }
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");$ y+ I/ F. q( X+ O7 E
u32 ret=0;
; J' @ E2 J, U4 D$ Z* N1 F/ V3 f, U2 ?* C% s# V( _! I" C
// inline functions+ b! Q5 H* J0 e2 r+ V0 I2 s
while (intr_status != 0)) S1 D; N* J7 X% z& I, _) @- C
{( R6 r* j' b* C1 P- D5 t0 q2 E
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件. e. A3 X% V; T) ?9 b
{
" x: q; j# y7 O// Log_print0(Diags_INFO,"eoli.\n");& L9 Y8 m0 d% x3 o$ _3 g) ~5 S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);1 v }! `6 \, o# b9 o
}. i- }1 {, w7 U/ F8 | N( Q4 m6 d
2 N- ?) r4 O1 m \0 b6 A6 o; N5 B if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
' S0 c9 F( i( F {
8 ]! |1 V w; ?: @ Log_print0(Diags_INFO,"eowi.\n");; a f) k) `5 v1 Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
6 a; N, w; p# i2 H( }6 y upp_interrupt_count++;7 ^# m3 ?; s+ y' S; v
upp_interrupt_eowi_count++;
6 D' ^4 n1 Q9 i, w
$ R/ @* M g( Q#if UPP_DIR_QI==0
& `0 b2 `) }2 @9 w4 O" A upp_dma_receivestart();1 S) A7 L* p# a/ v% r/ M8 p; U) J
ret=1;# U9 _( Q. G6 h2 W& W( g: r
#endif
$ A9 L% O0 X% V$ c+ z D }8 x6 I. K4 D9 b: N
8 M2 a9 a6 S/ }, u4 X$ B) }
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
: I5 B$ I5 _# E% G {
+ C4 y! u7 S) ]& d/ |# h8 U Log_print0(Diags_INFO,"erri.\n");
3 N- W* T2 K# t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);) q: U/ B7 a! y {' o& e
upp_error_count++;
# X, `& T7 Y+ C# _$ Q }
2 `1 F' q; q6 `2 ^& {
4 ]: A) `- T4 |2 V# ?! x2 u if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件4 b; v9 z) H& N$ @; w3 D
{
% p/ l, a; b4 B3 n Log_print0(Diags_INFO,"uori.\n");5 o/ T% ~8 u7 u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
3 ^6 I+ E% j2 |& `& ` upp_error_count++;
/ G. r# i! f3 }2 y" X, I }2 i+ s& I& i: w* `) H
8 ^7 C) \7 D- ^( n0 N6 I& h& p& E
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件% s5 n2 t$ x% Z, o7 E7 k9 \# o" q: ~
{; r) c( a+ @7 k8 g9 e
Log_print0(Diags_INFO,"dpei.\n");
& i. j* ]1 V* T/ c& k/ B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
: R% S h f; W) B$ }7 `) g upp_error_count++;
! U" j% J( _( _+ N }( Y2 [8 X: T: h' y8 S
e: R* C( a! Q0 N+ J. a if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
7 a' W2 f% X) U- T3 j- J! E6 g- G0 v* a% v9 R {
V4 g) q' E1 c9 h! B I( u// Log_print0(Diags_INFO,"eolq.\n");
5 U( g- k0 Y# H+ A- z( h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);3 R1 R; [0 y4 v
}7 z& w/ P/ i' u: g, B
1 O! B5 x4 r1 b" F/ {4 @& c* _. b if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)3 P U M1 b3 Z' b! a
{
9 m# e' t+ I" e) ~( [// Log_print0(Diags_INFO,"eowq.\n");
, w$ h: R) V+ F% D; b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);/ ~; v' s0 U/ G+ d- Y/ p- C2 _
upp_interrupt_count++;
/ I% [6 I0 Q9 F7 c( g#if UPP_DIR_QI==1
1 P8 {8 f( o7 G upp_dma_receivestart();4 S! c8 B% X. k* h" u+ M6 b$ X
ret=1;! L# L- R" X0 Q$ o0 m
#endif
+ W) p. k& [4 P& M6 d2 @ r4 ] }
9 O% L Y2 R' x+ _% w# R0 r7 V+ x) d! n: n3 h( Y7 v9 ]
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
+ V( D5 Q( @' |$ _ {
2 ]; b- d. K' q Log_print0(Diags_INFO,"errq.\n");
% ~$ q1 q& P0 y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);; X0 {$ a0 V, k; w
upp_error_count++;
! o. N: A1 n( ?% k2 F$ Q, x% |# Q }0 z. e3 i, U: i0 o) c+ Z
' G2 B) U& _; f3 `
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
, @) |* a( o9 B0 U1 J' x {* Z7 F& _2 C& `
Log_print0(Diags_INFO,"uorq.\n");
+ @: D! V+ i% O" A upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
% S/ I! [9 ?0 }5 j; Q upp_error_count++;3 o( U2 J( O+ I* G5 u: p2 I
}
5 }7 R" R2 z( u8 Q9 Q: U; Z" n4 {8 K- T1 b2 ~* m1 m: D8 F; G: f
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)$ \- B/ N7 k% L2 K
{
0 Z# ^( {# ?7 w Log_print0(Diags_INFO,"dpeq.\n");& E" D7 @ {0 f. U% d1 J. t H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
8 {+ V; t/ f# ^ D' h& S1 B upp_error_count++;
8 C2 H8 i& }+ t; ~& B$ U0 v7 k }3 [& t/ Z% d8 c5 G9 c
0 v6 m2 R5 D/ M& J' W
// make sure all interrupts are handled+ T$ U$ u' q, n1 S E
intr_status = upp_reg_hdl->UPIER;% s: D. P2 K: s! A
}4 H& t( M' W# {! F" e
9 l( O* k6 ~' \; f! R6 G/ \
// finally: write 0 to EOI register
, [- f+ }5 u+ U4 R upp_reg_hdl->UPEOI = 0;
9 M# z$ T# N* M return ret;4 M0 d. ?0 m) G$ Y1 w( W, H* W
}7 ?! j& d# A* w; B& ?) ?9 c
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I): E1 |* _9 y! o/ X T3 T" m+ M8 }
#define upp_dma_sendstartQI(x) {\
/ H' d) G9 _2 A" N+ A, _ Wait_upp_SendReadyQI(x); \
1 ~ f+ W* ]2 Y9 j9 A: D4 i upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
( N+ a- ]1 k2 W ?+ | upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
1 r8 ?2 h& j. { z( J! t upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
! B7 \. G6 C& K# l9 S: X! { }
0 \6 i/ Z, w9 R% S' q5 a% D3 U
- f+ T$ k6 `: y- A9 ^6 S
; ]4 f( J/ p- t+ N9 ]" K#define upp_dma_sendstart() upp_dma_sendstartQI(I)
' Y" V' d/ G( ?
! W& q ~. v# ]/ W% t6 b3 _1 r) o6 T* R8 g5 `
想知道uori错误是在什么情况下面出现的,好做出修改。8 [- G; ^5 x) j7 T
! X+ d* V H6 F( N% @8 p2 `7 s
5 ^7 z$ T& O- t, _5 `: ~, Z% F' ~ |
|