|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
2 }5 _* H, C9 ~dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:- z. W; ?1 M. f
u32 UPP_Isr(), T) n; C1 C; a) |( r, |* Q& D
{! x4 ], E1 P! S, Y3 z9 c
Uint32 intr_status = upp_reg_hdl->UPIER;3 b9 A5 i a8 `( d3 Q& k
upp_reg_hdl->UPIER = intr_status;//clear5 H/ g3 P# p6 h. I4 {) M' D2 q
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
0 Z3 N3 }/ N$ x$ O& U u32 ret=0;+ q; W; e; V* ^7 @" X1 V
- d# |0 _3 ?$ \; e; X* W7 Q% h" P // inline functions
- r1 H- `: P7 ?& s1 `" n; N while (intr_status != 0)
2 B% b4 X2 K4 @0 }, m {( f$ l. i$ n6 O7 F" P! n
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
: Y9 H4 m3 Q* J3 X+ |/ M; C {
, t5 P4 p, l w1 ?% e. _9 Q# {3 W// Log_print0(Diags_INFO,"eoli.\n");
& }# q) }8 {8 p4 {$ W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
8 G; X3 ~8 s& L }
3 D& t6 L& j) x5 w. I$ K& y
7 R. D0 Y1 u! T; m" ~! R2 @: y/ | if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
8 R U ~, x q. w {
" M7 \( c" z' u% I" `2 h* S$ x Log_print0(Diags_INFO,"eowi.\n");
5 w7 t! u0 ^) Q$ C1 p4 |9 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);# x0 B& A( B, {; R$ E
upp_interrupt_count++;
) ^/ h; z7 X: A" R upp_interrupt_eowi_count++;: f* r2 ~! ~. ]- Z& R# r
4 o6 C$ |2 O4 \8 f. A/ ?/ y
#if UPP_DIR_QI==04 o. g, A7 T5 a' l) } A
upp_dma_receivestart();
, H5 T3 b6 R$ t! V ret=1;
; T w' D' o) E& j4 K7 Q w#endif
2 n0 q Y+ I' R+ I4 e" y }
2 }1 ~: f) N2 P/ P* i$ w5 a8 r6 b2 M+ q, H& ]# `7 b
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件% _; z) m8 O% S% n) j& o7 p$ f/ X
{
/ D) S0 j; @; u! K) d9 d0 o Log_print0(Diags_INFO,"erri.\n");, H& v0 T6 c: {9 ~+ I8 A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
+ m8 I% L* j: i. g upp_error_count++;
2 y/ [; S& S( X }4 W6 x6 k3 j9 t0 ?+ o2 P0 g* c
; e8 n2 w# n+ y3 `6 \* A! f! l8 N4 V if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件 j. r8 {! Z' ]+ B
{6 ~& y2 N) t7 I: \5 q9 I p
Log_print0(Diags_INFO,"uori.\n");
, {5 h [6 F, X R upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);" i! ]: A5 v9 `% G* n
upp_error_count++;
& c8 p! h4 M% a! @% K! M }6 q# M6 \+ Y( X2 U6 x/ W6 P1 B. z
! _9 r/ @) G. B. g. J- \ if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件, F; g# E" K" t7 T: G
{( l% j% j' K/ k9 d4 ^0 H% }$ F) j
Log_print0(Diags_INFO,"dpei.\n");
3 \ r$ N: o5 ?: |' y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
: |- x% {. d$ ~' c+ a upp_error_count++;
4 ], t6 m) B' e }8 s/ A+ g' J0 a. a' L
' J( R! Y- B B N0 B
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
. ?8 }) b# N7 T {
2 L' x4 G, O" b+ [" X( j6 J, H// Log_print0(Diags_INFO,"eolq.\n");, H5 v, ^3 L* x6 k5 V/ y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);7 m+ Z5 r K/ ?" r3 I8 Q
}
* G! w2 K& m# H$ M6 O. ]1 O/ _1 ?0 g7 y, }) L
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)% O/ F( |, b1 \$ t2 X1 s
{
( P+ ?2 b4 c. \1 p1 M0 X0 [ f// Log_print0(Diags_INFO,"eowq.\n");
2 e Z2 `! V- |1 ~. } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);- Q! p4 I9 H- K
upp_interrupt_count++;" ~7 Y+ R" L0 _* P% z) o8 b$ Z: X, s
#if UPP_DIR_QI==1( z9 M) e: N# c! L+ S
upp_dma_receivestart();! `: P* J9 C' Z( @$ X9 ?" O! {
ret=1;
4 R4 b* P9 B6 X/ S# s#endif
6 I; }, [$ ^3 p! Z) ^7 x }1 K0 C% `; n* r) g) i& m6 ]
) {9 l9 z! ~6 N if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)' ^# ^& H2 P5 r4 F
{) P' s% p l, s' D s, ?
Log_print0(Diags_INFO,"errq.\n");# g7 t8 W, R6 g2 P( x) B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
: F2 W' |8 p3 @" g upp_error_count++;
- x* V5 Q0 \8 l }
6 N: J5 _& h3 k, w6 L! L( r1 s. V1 ` b0 V2 f. [
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
; l2 D2 u" E8 R$ v5 h3 {" }! T {* V$ ]( Y. i4 s, }" ^8 y2 I5 a5 H* u+ a
Log_print0(Diags_INFO,"uorq.\n");
. F( ?, n! C7 |% F5 B4 _* s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! b# K0 x! @$ j! O upp_error_count++;
1 ~2 b0 w7 ~7 }& v+ A6 g5 i }
) C/ m8 w1 B4 R' [: |0 p# C. o$ O7 ?. x- E. {: D
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
: B9 ?. n, q# n/ I {- F6 O. l) D1 j2 D9 A/ R* Z& ]5 j6 I8 b
Log_print0(Diags_INFO,"dpeq.\n");7 q2 _/ f) W. n& Z$ j+ X( l) d/ |
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);) _$ E) t1 m6 {
upp_error_count++;# y- ]5 z( n" A/ ?7 w
} P8 ]7 V+ ?$ y* I* i9 @2 q, L
, Z1 \# `0 J) M4 _9 A5 u% _
// make sure all interrupts are handled: k; _3 R: T/ s
intr_status = upp_reg_hdl->UPIER;! x1 @0 w9 C( [2 R/ a
}4 m2 y+ R4 j+ Z4 A+ E
- s; R0 ~9 B6 ]1 a) f
// finally: write 0 to EOI register
+ `: d/ V$ T6 }8 y upp_reg_hdl->UPEOI = 0;
; G. o; ~, ^8 n/ [6 ]/ w! n1 z return ret;2 P% o' R5 q$ E
}
" u: g2 B6 ^0 j" M, ^dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
8 n' D' ?3 [; A! C; x#define upp_dma_sendstartQI(x) {\( Y4 ^& ~1 H S) q/ e2 h4 J
Wait_upp_SendReadyQI(x); \
2 L/ h- k6 l) G+ J( @& Y/ q upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
' O, M1 \' C2 f2 I: n upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
5 s: Y7 q4 H8 q& m7 B2 ` upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
# D. x& i9 t/ e4 c! A }. V, ^, f1 m6 p
3 t0 J8 v" m2 S
- t M' L. d) r* b# _#define upp_dma_sendstart() upp_dma_sendstartQI(I)
, v$ g" w1 X- y" ^5 ]. j3 \/ Z& }$ d+ ?9 _" {
. W5 ?. P1 }; v7 g$ G
想知道uori错误是在什么情况下面出现的,好做出修改。+ K+ H, P- P9 n$ Z. W# h3 z# U' ?
6 D Z, H: E" r; ?/ Z2 O! ]
4 ~8 E, |! |8 S6 f |
|