|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?8 | i; x m+ x/ P* k1 n
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
/ a; B# b1 q% R9 `+ Q: su32 UPP_Isr()
- C/ Q, x& X9 M8 O* x9 J; z{; S: s1 G6 T7 q( a9 d3 u6 z' g1 _. P
Uint32 intr_status = upp_reg_hdl->UPIER;. ]5 h: G* @8 a0 j+ ?
upp_reg_hdl->UPIER = intr_status;//clear
( ^& [+ D; K3 |- ~' P" Z// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");0 P3 \, i& W7 \8 d' L& I" z) M
u32 ret=0;
- n; x/ a; p3 d2 A! l" a- S+ B+ E+ r/ S2 L
// inline functions
5 \4 _- Y- @! i( y while (intr_status != 0)
4 k% H: w6 y8 [( S9 b6 J6 ~5 X {
7 r, u9 h: x* V# }: K if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
8 O6 x, k3 W. G* b9 d {
7 W0 S2 ?2 h" i1 o- I% f1 X0 \// Log_print0(Diags_INFO,"eoli.\n");
' {1 A( Z( A$ K: D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);# H% t4 B. z% i% r; U
}
; s0 Q0 F6 y8 C9 E, W) {& K
& I8 x) G* [ n- @- V$ F if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件7 c# ^# s% N5 h$ B
{
" D- V- T& J9 l Log_print0(Diags_INFO,"eowi.\n");
* p* C4 Y+ N# X7 z, C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
* _0 s( R u2 ?4 ^9 x1 O upp_interrupt_count++;
0 r. G( ^1 X" f {7 p: v upp_interrupt_eowi_count++;
7 g. ]6 J8 a. N% z m4 d4 Z& C) k- h; i/ \
#if UPP_DIR_QI==0$ b3 U P! b8 U8 J: V. Z
upp_dma_receivestart(); b9 u. R$ H, o/ ] }8 j' F" _& @
ret=1;
" `8 f! y+ K$ A' G+ j( T! q#endif
0 W! J5 U7 O( p }
( N0 a5 q1 Q6 `1 D: X! L0 D( D2 {4 _) [3 ~6 d
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
u. Z" P& S2 x% F {
/ V3 f8 c4 D* C4 I# k$ \ ]5 E# O+ Z. J Log_print0(Diags_INFO,"erri.\n");' u! w- ^' }- f/ y9 n; [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
" G' T) r0 ^4 F" M upp_error_count++;
3 f7 F# B9 E. E T }
6 j9 N9 O- L9 l: f- E
6 s* Z2 {9 s+ A# Z, S& s/ F! d if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件, t0 i6 K* Z, b% b/ j4 e0 }2 c
{
! T0 r8 I2 S, K Log_print0(Diags_INFO,"uori.\n");4 s6 Z5 V0 O; x: g% s
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
/ k. y/ i2 N' D1 A$ ~" ?8 a8 p upp_error_count++;& P) y; D* {- N5 T+ ~- c6 x
}
# b4 _7 G0 D7 n
9 j7 m& }! f9 I. |& n& ~ O if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
* B3 Z. g4 b& q4 e) w {) @& Z% f% S/ E, c1 W% s
Log_print0(Diags_INFO,"dpei.\n");9 j- H- q! g2 ^9 e' x& u3 V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
v w; o5 ^( t. a. j8 O upp_error_count++;
3 m5 b" P H# p$ f- W; J4 y7 i; X- E }
) k# _- [, E) O1 S8 p: ~5 t% }
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK), O* k( r I7 s. _
{
% I! H3 e& g$ k8 G n7 @! }9 O- I// Log_print0(Diags_INFO,"eolq.\n");
/ `8 Y, P9 E" ]; C( G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);& _: L. T& U- L
}1 R5 q& Q% n3 @! y
- Q4 K4 f% i' L4 Q1 X% a- s
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)( I% v2 g9 l2 V! [2 D. L
{
! F, R+ o* [9 _. _- O// Log_print0(Diags_INFO,"eowq.\n");! P" z' i9 v; x: y5 ^) ~4 m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);; `7 t+ F( h7 ^8 E
upp_interrupt_count++;8 `1 N q) ]5 ~& P5 m
#if UPP_DIR_QI==1
/ b- y' |( I6 Y upp_dma_receivestart();' `1 m7 `( R# `" S6 v3 S/ _
ret=1;
4 d! A7 @4 V) l$ k" I#endif
( J1 x; F7 q9 y. U }
- G# m f- A2 w9 x" B' D
2 ~$ Y9 D0 l, ]9 X if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)9 }) P5 C7 `2 ~4 {
{
/ F/ F" o* W, d2 w0 Y Log_print0(Diags_INFO,"errq.\n");
1 r/ a! Z- w& X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);2 P% D* N) d4 J, ~3 y+ j4 v, P
upp_error_count++;/ j8 e [' T- v9 z. n( v0 U9 H
}
2 ~ c/ |6 Y- X: ?+ K, p
# o% i) m6 {6 r- o5 K if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
0 {* Q. a" u% H9 y. ] {
; x8 c1 n- J- F7 J4 K Log_print0(Diags_INFO,"uorq.\n");4 N; o, X) q; ~! J1 `9 X# y9 e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
# [+ w: X8 {7 J2 N# ?$ } upp_error_count++;
2 A4 j' g6 h! Q c* v }
' f \: K' W+ `4 s" n
. F" C5 e( |, m if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)' y r7 X0 R, @/ |6 H
{& \$ j# b( d/ a
Log_print0(Diags_INFO,"dpeq.\n");! b2 v% T% {8 e& B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
& i5 q% [' o3 T; A( b upp_error_count++;
, n4 n1 u7 v& A, \$ @ }
! O) Y; k9 r/ q7 k; Z1 I. G
$ z$ }0 t7 S0 Y( W // make sure all interrupts are handled
3 u. t g8 Y$ m% ^4 E intr_status = upp_reg_hdl->UPIER;
0 m. H1 ?$ I7 n5 S* ^ A. c }
1 P; E2 [& o3 A" I" |- c# U
2 z {8 o4 Z, M7 r: |0 r/ @ // finally: write 0 to EOI register
' d0 i$ E% K8 Z# B: z: R! l% H upp_reg_hdl->UPEOI = 0;
; y' h: g7 d0 W. e9 t6 q* @ return ret;, F0 z: f5 U/ n: P5 v% b* \
}" O! d. G( O6 e
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):+ p9 }1 I! i; |. j1 T5 Y8 Q
#define upp_dma_sendstartQI(x) {\/ i* X+ ^9 g# I* U6 \- r7 ^
Wait_upp_SendReadyQI(x); \
G/ m) Q( n, Q1 s. ]6 i upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \# V) D0 ?6 v2 V, f O
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
- V% j! |, {' I8 |* H, c2 \ upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\1 W4 l' H `( R* x3 U l* t
}: W5 j/ g. K- c. Q" s; t
- v# {' Y1 m3 }& T. y/ N" C
3 l+ x7 x [, I# r3 D
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
; a* l1 k' m7 l. o9 S' E* ^1 z
' R# j4 R5 D# E5 d# k% {$ r/ y
1 i g7 F1 l i' P5 t- ~9 [想知道uori错误是在什么情况下面出现的,好做出修改。
; U: b- c9 P* p" v
, a. L% H% }0 W3 [" X+ X9 q
7 l9 ?$ p+ i- i0 J* B |
|