|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
" H; W" q1 B' G0 ydsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:/ T6 Y D: l6 j7 a( ^8 j
u32 UPP_Isr()/ ?! |6 h+ o4 k9 j; i" r# f; ^
{% s# W: ^( V: p2 \) G9 U
Uint32 intr_status = upp_reg_hdl->UPIER;
8 ^7 _4 w) q1 z- Q% P1 e m upp_reg_hdl->UPIER = intr_status;//clear& |* @/ {: m; Q6 b3 w# M: N
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); b5 L$ _0 J( `4 m/ v, J4 W: z2 z
u32 ret=0;% s# O1 B$ H9 u0 V* M$ c3 C& Y
2 C1 V; S* u' }
// inline functions
( B/ x* F1 |7 D' H6 ~ while (intr_status != 0)
3 M6 x. X* B8 `7 w) l {$ |2 A! e9 z9 o+ q
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件 v4 z" W- Y0 h1 [
{, R3 C, {: u- ~5 U( X: u1 I! m m K
// Log_print0(Diags_INFO,"eoli.\n");
3 y$ l! R; E7 w: G! W% w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);3 P- g# T+ W6 {1 d! v4 f8 M& Y
}$ m. [# \2 f5 h
1 H/ \5 v7 `+ ]4 G: r5 d
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件2 j4 K( V+ h9 q* v/ ?$ m2 \% v- Y
{$ L* |6 d8 m: A9 `& B
Log_print0(Diags_INFO,"eowi.\n");
3 ]5 {' e" F' S' U+ x; x0 f upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);: k) J* V9 y% x0 g8 J D% z
upp_interrupt_count++;
1 k3 d9 Z( |6 R upp_interrupt_eowi_count++;' Y+ m, c) `( S& O8 N: G7 v( d) |
' p5 n# v6 i& O( B$ q/ C#if UPP_DIR_QI==0
$ @9 p4 s2 H! o* Y* v upp_dma_receivestart();
8 I# d8 k, I) i! d ret=1;% A$ \, J. C# u2 Z8 a* g9 ]
#endif
) m0 ` E3 O) i6 ] }* Q4 N# ?1 a$ Z2 Z# R- j4 ~4 q) T% V( _( M
7 m9 a8 S2 R4 k
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件) ]1 V9 j0 n5 O
{3 P0 D) ~1 V& }# p t
Log_print0(Diags_INFO,"erri.\n");
) S' U( W8 j: g! V7 G: [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);2 {8 |) [: F6 G3 m/ g6 v
upp_error_count++;' K% ~1 { s$ n
}
4 T4 Z6 d/ z' F9 _! ?. I9 O3 C* h/ s9 W
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件- q8 o- @& w" M9 K+ {4 W
{2 I+ W, V& Q& X. h
Log_print0(Diags_INFO,"uori.\n");
6 [4 T& o: m& H6 b; F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
1 p% K' x2 |9 U upp_error_count++;
/ \6 _2 E4 U& d }) g2 c" l$ N4 \0 s) y/ E X
4 i2 w; A$ ]; V) K3 J+ E- _ if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件3 d2 A/ ^ W3 e @3 J& T% Y, b
{$ E7 |1 D4 e# A" T* {* E; h$ ?
Log_print0(Diags_INFO,"dpei.\n");
z$ C- V q% Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);9 x7 T7 l5 S# P9 d% Z& h
upp_error_count++;4 K& K8 u, E( c! C! }9 K
}4 _3 U; ~% r) d% ]9 w, z/ v
- S/ q% c/ t o. P: e2 S
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
, Y" a* E# }+ R& A1 U8 i {) i/ O2 L; p9 {1 k* s# u! s- [
// Log_print0(Diags_INFO,"eolq.\n");$ E; @+ T+ B$ r$ R6 @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);7 j2 e# ]0 n* G+ e0 K2 J7 X4 p
}
: ]4 M- r) g$ Q/ H6 u& M) R: o; P* v& M
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
2 F5 S4 C1 ^+ G7 s( U% i7 z9 k {2 L$ P+ A: Y Q
// Log_print0(Diags_INFO,"eowq.\n");& o# o3 Z9 c& s5 O7 x& \4 y4 b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
# n) W$ c6 H3 a' r+ z2 m upp_interrupt_count++;
- a/ k0 t5 c# M. t3 o$ N#if UPP_DIR_QI==1
8 k8 _% V4 D& A8 v: Z: } }: G& { upp_dma_receivestart();: n" t* H0 E/ L
ret=1;# ~' S1 n9 Y$ b- K4 Q
#endif8 R" {) ~+ B" [. r8 m Y. L
}1 b& i! U/ o2 j- j8 d
8 z `3 Y8 f& ~# N a7 z6 M+ p if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
8 u* t" C. I$ c w% T/ v2 | { B$ [% G @" I% T
Log_print0(Diags_INFO,"errq.\n");
* J- z0 M0 K4 O/ v. ]. U! ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);# v' y* a3 d4 A- J
upp_error_count++;& h4 p8 N( ~# Q7 Q. ^8 K2 }
}9 U$ D8 n }# F6 R6 N2 I
) m4 E/ t, k' [" Y. v9 J6 g
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
1 h0 R" W, c$ V! I, ~" ] {# V& }! y0 s" z( r3 y9 r6 x' ]
Log_print0(Diags_INFO,"uorq.\n");
. x" {' g3 r8 i6 @1 v% n% [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
) j t1 V6 `5 z$ a upp_error_count++;
# J( w2 c, a) j, U0 O6 C8 w8 p }3 C$ w6 E# T! P3 C) W; N- l
% C- _5 l& H- R/ M
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% Z: C! E" O4 u1 o6 u {
9 T- g2 H& w( A Log_print0(Diags_INFO,"dpeq.\n");
8 k- ] u5 |) L upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. v) Q1 y+ J/ j# Q. Q; T1 H upp_error_count++;
" C+ R3 o$ s _2 d& ~" L U }8 N& l& u" s, Z6 b4 j
* g X* ~7 j$ l/ e& ], a7 S
// make sure all interrupts are handled
. ]/ ~ k" R7 a! K" ^7 y5 h3 l+ i9 ? intr_status = upp_reg_hdl->UPIER;
, ^" v6 g( \& i/ B0 X% y }) H, C1 _/ ~6 P' w2 o" Q
3 b# R8 I2 g/ ]- @3 c4 u // finally: write 0 to EOI register
4 K" |1 w' R2 @+ x6 A$ \1 B8 [+ s8 w' G upp_reg_hdl->UPEOI = 0;: h" X9 }- q2 z" e( }4 ]2 U0 H
return ret;& ?" P# V/ K5 \9 J2 b2 T
}
/ Q- }4 j1 O7 w J% c; a- Ldsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):6 |& r$ H d& `7 x
#define upp_dma_sendstartQI(x) {\
0 T1 h& }0 M0 [5 }5 j Wait_upp_SendReadyQI(x); \
; W/ s0 h7 B! P5 ], e. g1 d upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \4 u8 w( J& R) h0 j/ h' f2 E
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \' d* X/ Z& U5 D7 L$ C+ {9 }1 A, _
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
! n- P. o' m4 U' u1 |8 U( b }9 q& q. V# W- t. \( W# a
5 T- }- Q# W* v# M! l
1 K5 e. \9 ]0 ]' R% U1 B#define upp_dma_sendstart() upp_dma_sendstartQI(I)
+ k- B: d+ N! B( [) q) h. K& z) Y) L' V! l+ z
# R, i2 G. D6 K7 M* v% j
想知道uori错误是在什么情况下面出现的,好做出修改。
$ R2 w, g& N, Q( ^, o
/ b' k+ B* T) L/ ^
0 L( { M2 D2 J& i |
|