|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
- a5 ~: p5 }' F# Jdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:/ q% [; |# i4 {1 ~5 P: v
u32 UPP_Isr(). s+ l; S- P$ i1 ]
{
% r, p( J: o" r2 g1 m) M Uint32 intr_status = upp_reg_hdl->UPIER;" C- T: b2 p$ F2 S4 h% `0 x
upp_reg_hdl->UPIER = intr_status;//clear
& U) h9 V6 ^* u) h0 e// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");. m" s% K0 Q' ?3 N' p
u32 ret=0;9 h1 l; r* Q9 Q3 L
- E/ F0 a# N% \% b0 Y/ N. o // inline functions. n* K9 i" N$ t1 t* f7 `/ B
while (intr_status != 0)4 w: L8 ?8 B$ u& J! n$ r2 r* }
{
; o; y$ {( }+ y! \1 ?0 t if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
* @% T' w# ?. B {
5 ~. h, \, X w# Z1 H7 v// Log_print0(Diags_INFO,"eoli.\n");
2 {) ~; h( ?3 q9 V2 R; e9 u4 y( k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);+ W+ |7 m. j2 a# {/ ]6 _2 d( l5 u
}
9 C$ J1 j2 J0 V$ v- g) k5 M
8 {" i6 A$ U* x if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
* i! q: f8 k" j- e0 }# o" ~ {* u7 y( z" E1 \5 D3 a/ Y
Log_print0(Diags_INFO,"eowi.\n");
$ o, e9 }# r6 u1 k A8 z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);. q# Q& L1 f/ C- E3 X
upp_interrupt_count++;4 l7 v k; v% H" @
upp_interrupt_eowi_count++;8 }0 w/ s: p8 v( C, m
4 q- q7 C( F+ _: P
#if UPP_DIR_QI==0
& Z$ D% L; n! R5 [& \ upp_dma_receivestart();/ W8 k/ D: |# d' N @; \" y
ret=1;" t0 p q4 N$ w
#endif
( q% M7 w. ~# x( }& |% d; P. p }
8 i! Z, G/ z- U2 G( d. C* ]
7 G; c0 W, T* g6 P) B if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
* l$ F5 T+ p6 s W, ?0 k* ~3 L) M {; _1 v9 e8 S1 X, ?# w: I4 L" J5 x- V, Y
Log_print0(Diags_INFO,"erri.\n");
4 k3 ?) J/ W; [! [) { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);2 |" {8 P% c$ Y3 N4 E5 c" ~
upp_error_count++;
& a5 m \1 G7 s }
; ]$ ~7 g' f( H/ x% X I2 M. o2 `; X$ t
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件# w* a) N* m$ X7 i, y
{/ L. n+ r, t$ R( j: T ?
Log_print0(Diags_INFO,"uori.\n");+ W1 A5 n4 G1 [# t4 @) ~ w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
! N% G+ G# e# x8 u0 v upp_error_count++;* d9 s M `6 B) c" o" C2 ^
}; z$ ~2 a' ^" T* {6 \
! G, @7 |. s6 r+ Y8 T; Z if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
" t& U/ L0 Y* p4 x5 P9 a {
g2 B! E) H# e* @3 n- n Log_print0(Diags_INFO,"dpei.\n");8 e4 M* N7 _! }- O; v# v* S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
8 D. J3 h0 }7 S7 Y upp_error_count++;+ v' B" Z& [' D9 t7 Q
}: C% J3 @% ~5 J0 x8 W0 S2 @; F
1 l4 o! e. V7 R- }; s if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
- @' [) [! N$ @6 E& g! _ {
^. Y: K$ V* m1 _7 q) ]// Log_print0(Diags_INFO,"eolq.\n");
7 _; ^# s& P2 R: }3 S8 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);- U4 m) v: k) h( G$ H/ G
}
" N4 p* S+ w! H8 E" o
( i* H# p% m6 k8 {2 Z a if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)! Q' L. `* O- @& n% |
{
5 T) b7 ^- T- Z* _! T# B// Log_print0(Diags_INFO,"eowq.\n");
. m, q1 n& N; x4 Y: f& ]9 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);% ?" e$ a# m+ C1 h4 O
upp_interrupt_count++;
~* R( v5 t( Z6 L; K+ P#if UPP_DIR_QI==1
0 o1 v8 T, l% V upp_dma_receivestart();
5 o5 Z# i( z+ e. ?- P+ A) m# a ret=1;6 d% c+ w' I9 q9 m/ n
#endif
_" G# P- g6 v& R( B; D }8 m4 ~. a' d/ g$ P( K& p
2 q) k) M2 K2 I
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
: {4 R- M2 Z n5 E {
# O$ c! E7 s1 r! O+ a Log_print0(Diags_INFO,"errq.\n");7 ^* w3 H. h: C8 c) v$ j( R2 _" v
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
+ R# ?! C/ L2 _, l/ r upp_error_count++;
- I2 f1 z4 S9 P2 h5 q6 y }% S* h& k7 Z, x
6 B- o P0 C7 S2 j/ v# o0 J' @ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
7 @5 ?1 A) ]! m. E; w& N {7 G8 p0 I# V' h. N% G
Log_print0(Diags_INFO,"uorq.\n");
7 S p! m( @$ s! { upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
" X' P0 _9 y* F/ {2 \4 N* W; C upp_error_count++;
, h p' g# x; t$ n N) [* F }! R; T {! s# H k6 I1 [
/ R5 n: @. P4 I2 x- K if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)9 ]5 Q% ^" Y6 p: M
{% F+ Y5 g, c' A2 z/ _7 \
Log_print0(Diags_INFO,"dpeq.\n");
6 }6 [( G* B% s1 r! H( F' g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, D7 G5 c4 h) T1 V' o
upp_error_count++;
Q* D2 e7 r! r% g7 l/ g5 G }
, B4 s; v% j0 R# r( v P
1 B0 K X* m* Y7 a4 I& ? // make sure all interrupts are handled0 s1 \2 t7 ] S2 o
intr_status = upp_reg_hdl->UPIER;$ l0 N5 l8 g8 B0 }9 q. z2 M" g
}" {. S* ?7 F6 O) f4 e* a
( c: n8 M, x- l6 G // finally: write 0 to EOI register4 i, u: p, Z0 r: r. T
upp_reg_hdl->UPEOI = 0;( p7 L: Z: h) a$ O, z
return ret;* z8 j2 d P+ s9 |
}* u, k+ K" A& i- s
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):. W5 G6 R0 J' s- v8 P
#define upp_dma_sendstartQI(x) {\
' [! }6 I4 U, d @8 |# u& W3 V( b Wait_upp_SendReadyQI(x); \5 u4 k) g( ?" j/ V4 j( b( K, K
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
5 ]7 E/ u; Y, s9 i6 P upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
& |) h* y7 K7 F9 h1 P! K4 `9 d X upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\- Y; ]7 a: K! o, T: m% D7 K
}
) A. S, ^/ q5 b6 y8 a$ D, v* B% L
+ g) R7 h0 ~; \* ?5 ], L7 h
# b& m3 t, k G" p#define upp_dma_sendstart() upp_dma_sendstartQI(I)
. Z, b' o, V$ {. V% E/ M. s' \6 n( J5 o _3 }* L" k' L. W k
$ Z* z) q0 n- c3 }6 l, A
想知道uori错误是在什么情况下面出现的,好做出修改。
7 n1 L9 p% S- j; g3 ` E3 R# j, c0 O$ S) D
: l( B5 L% u! `6 \+ X# _3 z |
|