|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
1 [1 U$ Q: T* o; {3 T/ z: Kdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
' U- k. `3 w, z: z2 n/ Eu32 UPP_Isr() G! E @* A7 `5 G' I6 I
{" n, n j6 P+ [
Uint32 intr_status = upp_reg_hdl->UPIER;$ J T$ A; v) m) m
upp_reg_hdl->UPIER = intr_status;//clear
9 Z/ I& O( x; c// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");/ V7 ~2 d4 e2 |) o$ n2 Q4 L9 F, s
u32 ret=0;
9 b9 x3 ?$ ]) a$ a6 q1 |: W ~$ C1 h! f
// inline functions
$ ]2 O, c4 D0 U/ w& l1 z, b while (intr_status != 0)' A& T- x2 c" H2 s0 L# t1 ?; E1 I
{
' v0 q. M' |$ Q0 o" j- D if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件0 D3 J0 X( I: h: L+ U
{
/ M! l0 v* S0 G0 E. s% w// Log_print0(Diags_INFO,"eoli.\n");
$ ]$ M& X* Q1 A0 W1 ^3 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
. w7 O: a, x4 _3 j+ \! F }7 F7 k( f; \3 ^. w% x! |7 M% v9 H
. N( G* I- c7 l: i" x4 F! P if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
. |5 N8 b% I7 _$ K+ K1 ? {! T1 v6 `6 {1 X% T
Log_print0(Diags_INFO,"eowi.\n");5 Z ~6 S: D* |9 `7 E' i" b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);) ]& N+ V" j& |4 M& w7 A
upp_interrupt_count++;$ U! w3 W1 j; v7 r3 p3 g8 n
upp_interrupt_eowi_count++;9 p* M4 G; h# k: p& d8 |8 X, w
! g6 s' N7 E0 N) C
#if UPP_DIR_QI==0& O" z# f2 |* D3 ~4 L/ o w/ x D
upp_dma_receivestart();
- i! H8 T, X b. k5 g) ?; v0 J" _ S ret=1;
9 t, h2 ~3 L; R0 X5 l# J; Y#endif$ C* [$ D# P* x
}% G; C, `. o- p* b7 N
$ E* `. e* s7 M1 d8 \. X
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
! T0 [6 D O) l& ~2 f% U {( ^% N9 E2 `% o/ y3 F
Log_print0(Diags_INFO,"erri.\n");- m6 d1 n$ v3 v+ ?! u
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
+ X3 T D/ p* T- ]6 w upp_error_count++;
( r! F P5 `2 K L0 o5 L. ` }9 s" _" h2 Z, A
, C1 ^7 o' B7 v if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
9 \ x$ [) `+ c6 p& r8 {! T1 @ {1 h; x' Q. G* d6 k4 [, r) G0 N
Log_print0(Diags_INFO,"uori.\n");# d$ Y1 p6 I: K9 r6 K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" O1 `7 n; p' D7 v: b' J1 t; G
upp_error_count++;" |$ L7 G# L. y F) a
}5 [3 Y" G& q8 I8 Q" ] I1 u
" ?1 _" c* G8 M) Q) J; }0 @
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件9 w; Y1 p! h# G) O/ f r
{
3 e! t- {& G7 @0 p' H" J Log_print0(Diags_INFO,"dpei.\n");
1 R8 G, a1 h9 R, u: v6 b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
$ C H' J( D/ w* ] upp_error_count++;0 f4 y; t; u$ N% ^0 x
}/ l; A( F1 r3 x4 @
, U0 I0 m- H1 Z
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK): T6 t' Q I- n- p/ P f5 k9 i5 `
{
. [7 V- Y* Y( V4 I0 P1 K// Log_print0(Diags_INFO,"eolq.\n");
. w: l2 g) g8 D2 o upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
& Z& t/ G, a8 o( [. k }, s% f( | n' `8 h' @' P
% J3 O8 q) V1 L5 G) k: h$ n3 x0 R
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
) O1 @' N+ q# i2 \ {$ @# E7 n; l$ I3 J) q2 ^! a. H0 X
// Log_print0(Diags_INFO,"eowq.\n");2 x( J* ~( c2 }& Y% `' e1 Z, ]! y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);+ t# b+ l5 s2 r2 j8 [
upp_interrupt_count++;
! |& e+ i# k" t0 n#if UPP_DIR_QI==14 q, r# `/ F, O+ z" ]
upp_dma_receivestart();
5 N. R+ x* G* ^" a ret=1;
( F6 t A6 c* N6 q( t. }#endif
, W1 k4 ?* E* e' C; r) M( F }
! j1 M% [8 p2 X) }. V, E! B( W6 i: n& W, W5 }/ E2 F
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
2 i" T3 G5 C) e/ p {
! D9 O5 {6 d3 {$ W6 ] Log_print0(Diags_INFO,"errq.\n");
+ Y0 g2 `( p- w2 B. q5 P3 m upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);9 Z2 ~5 B0 V, P0 n& @0 I+ @# B
upp_error_count++;
, k% K7 T$ h! ?8 n& d& @: I }
5 m7 `% n2 C" D7 |- U7 v3 T+ }# R5 Q+ D- I- H
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
! n8 }) o+ ]( Y! h5 d0 U* A& J {
, g. P2 y7 x; S Log_print0(Diags_INFO,"uorq.\n");) g$ @. m4 B0 m4 ~. H3 q2 g. O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
8 g, V, V3 K, X2 X3 W upp_error_count++;0 f- v# k4 ?+ ^7 e2 y
}
" h$ h$ E: m5 {5 M4 f" @
`) [1 ^/ |# z& \0 z9 L: P if (intr_status & CSL_UPP_UPISR_DPEQ_MASK), d7 c y" q$ h+ G( w1 \
{; k" w& G, D) A1 O% H
Log_print0(Diags_INFO,"dpeq.\n");! {7 s$ O2 V" W2 H* T: q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
# l: \1 T) ?$ j" ]; U$ [0 o% | upp_error_count++;
2 n5 K( X1 i& r& X# ~ i2 ^" r }) ]$ q7 o2 Y* g' a- k4 K
) R* x( E' s! D8 Y" D2 i // make sure all interrupts are handled
) V. m3 e0 r& l1 q7 Z5 `" F8 I6 C intr_status = upp_reg_hdl->UPIER;* d/ m3 r8 E0 h
}
4 b/ l" v, t6 l( R+ [& f8 B9 V( o
/ V# t8 k' W6 z) o& A // finally: write 0 to EOI register; w6 w; ~9 V+ ~" |) r' b5 g, Q* f
upp_reg_hdl->UPEOI = 0;5 [/ u) [, M' c7 n
return ret; p+ o+ T9 r1 [, C1 n B+ v
}
q. w, N9 I/ pdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
; A. Q! G' g, H- N% c" o. ]#define upp_dma_sendstartQI(x) {\8 V! g0 E9 N" b, S$ y
Wait_upp_SendReadyQI(x); \
8 v3 D+ Z* |% P4 S7 T$ r) T5 B upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
# R5 _8 z$ R* _& y/ t upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \% I6 G% r5 K" H, e( [! O/ L
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\- O6 Z' }( z& W& Z, f, s3 A; _
}+ |) } L% j; D0 r
, } I; E4 j, ^/ r+ B7 @1 E- B6 g- k# Z1 h7 u6 I7 ~- K
#define upp_dma_sendstart() upp_dma_sendstartQI(I), U ?( P( t2 B n; n% f
$ ^4 {+ I0 n2 ~5 j
% U2 ^) i& {* x' N
想知道uori错误是在什么情况下面出现的,好做出修改。1 t5 G4 {2 p# y; m- u9 k
, Z8 N4 d! l( Q% m$ D. V
. K5 |. c% p& E |
|