|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
+ s6 z! s# D/ m9 e9 l7 m7 p8 x* |dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:3 H8 G9 [8 c& d' F* I: Z
u32 UPP_Isr()
) u5 R6 {$ f# Y. Z }1 E! h- r4 |{
2 P/ L( Z+ q Y$ b/ B Uint32 intr_status = upp_reg_hdl->UPIER;
8 ^. b' i& ]8 V! [0 D upp_reg_hdl->UPIER = intr_status;//clear$ K2 e( P- z2 \' a0 I, e
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");' c" t7 F1 M5 \6 C/ M
u32 ret=0;
. z5 M. s) r3 ?
+ ~4 {1 n# z) z+ z" G! Z& u // inline functions
; ]2 U/ N3 b6 {# A% e while (intr_status != 0)) R& p1 C) v* z9 X8 W% d
{
: P/ H. M; H' E if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
4 ]2 i4 \+ M. N4 i5 t {- ~1 m6 e; ~9 H! q
// Log_print0(Diags_INFO,"eoli.\n");
2 z7 n' r3 y J9 p! F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);4 V0 m3 N2 d- p# D
}1 u+ V: X) S9 P. m6 W6 c
, q! A g. a% `5 k* C5 a if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
5 \! I6 a9 }7 z$ ]5 d* `& e3 @' v7 x2 c {
; v* ?, B2 x9 n1 c; p8 ?/ ? Log_print0(Diags_INFO,"eowi.\n");
H5 p6 V2 a; T: C6 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
O# z* v* d' m5 s8 B n- r upp_interrupt_count++;
; b$ Z! i5 y; Q upp_interrupt_eowi_count++;/ T. X" p8 h6 B6 Y( o; |
6 R4 P" l5 I7 O#if UPP_DIR_QI==03 d- x, u! W) Z
upp_dma_receivestart();
j9 k+ }: r5 x z! b ret=1;) ^/ {1 o) } E5 c2 m! S) |
#endif2 p! Y0 F8 K9 g2 d
}0 N) C3 O1 ~( i
) D2 j' e: r3 u, k- L/ B1 B( C if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& x6 J/ G v. ] @& I* C$ f6 M
{( q) B j. ^. `( W
Log_print0(Diags_INFO,"erri.\n");, r9 [3 L3 |+ _1 d; [4 @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
& q! a( H: \7 I' Z upp_error_count++;, M8 D/ Z: `' z- \' ^2 L
}9 w8 ?9 y3 n. l$ F2 z
' N6 A4 v2 j7 \& x7 {0 ~
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件& M9 Z$ @: B2 E [2 A: C
{
3 }9 x- s9 ?: e# w, a Log_print0(Diags_INFO,"uori.\n");
2 q4 J5 {3 S \ H6 C' k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
' j3 F! H0 m1 n1 j) k upp_error_count++;7 o+ l3 B! r+ ^$ ^- X& a8 i5 U
}
q& {4 w7 r+ ~2 T1 b4 b0 D
$ {& [/ Y" I7 V$ {* G5 a if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件" G+ [' E# L7 d- c
{
" @# h- C* E; y# G4 A) R# N" ? Log_print0(Diags_INFO,"dpei.\n");
- q4 d9 [3 J6 T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
0 x' u1 Z$ q$ J- K$ x/ D$ x, E upp_error_count++;' L+ i }. t1 d7 p9 v: A9 i( N% @
}) a9 a, F3 A% q* e) q
8 S0 `3 @, h/ U* f/ d7 [7 X if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)0 C# V7 ?# J+ B b# r" V$ Y
{
% A/ a8 B ^+ u4 ^, \; d// Log_print0(Diags_INFO,"eolq.\n");# i; {% o( b9 U" B' z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
* m- G$ E8 z' t- i3 i3 h }+ [' ]2 x) c7 v) E: ^7 k) {- P
) s5 u1 K; @' X# s
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
3 p6 X3 d; ~* \7 @, Z {5 h$ r {
/ C+ g1 D$ A5 j: k2 W// Log_print0(Diags_INFO,"eowq.\n");
1 O7 V: C. E& X/ y+ d# X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);, P0 I/ f1 `) o$ W( F8 e
upp_interrupt_count++;
# Y+ M; W! U% N( Q% Y! q9 U#if UPP_DIR_QI==1: g/ U; l% ~" p
upp_dma_receivestart();
' E& t* l0 ^) D' s5 ~6 b ret=1;# g6 `4 S. s* E7 N9 N4 T, }
#endif
# N$ N/ B4 P" R9 F9 O& ~2 Z }2 t( T4 i4 i$ T' M0 j, T/ n* t
- ?4 M, W9 s% [ if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)$ w6 r* R' X4 n& C) b* H
{% C2 S0 y8 a( c9 N% S: I
Log_print0(Diags_INFO,"errq.\n");1 t3 B. t! v2 X0 o$ ~) X) u- r s& [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);$ e+ \' G2 Y8 p/ l# g
upp_error_count++;) p4 f5 B9 f$ n& M* _' p
}6 ^& M+ S1 u# [: h, ~9 v3 W6 W5 r
6 h8 C) |& x3 Z& \ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
: H# Y( T; U) \9 V( U% m {
/ L* v! ?0 B8 `& O! p+ Z0 m, a Log_print0(Diags_INFO,"uorq.\n");
+ U* w% J8 H' u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
" g7 p3 T( x$ ~2 i! F! x+ D) y upp_error_count++;' H2 t* T; c" `2 ]+ x% p: [
}( x: B* ^6 e, d: b( Q' J3 T
; X& q4 Z/ y) ^. n6 U
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)6 E3 ?6 Q& A M+ B
{& v+ T+ X) w/ Y3 H( Z. p
Log_print0(Diags_INFO,"dpeq.\n");' D% A8 b; ?. b9 y' K9 k) j# K \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
& M: b' w; T2 a! m, A% } upp_error_count++;
- `; F/ p$ b1 v Z# w }! f9 i1 ?' R7 ? u% X' f
) q2 j* ?' _4 b+ u0 N( J
// make sure all interrupts are handled
y5 v/ F7 ~) F: r* C' ~; g intr_status = upp_reg_hdl->UPIER;6 S1 F/ F3 W0 @% {4 D
}
9 f: k" }; v' n! s- N% A* x. A7 A9 ^
// finally: write 0 to EOI register
8 h2 W3 ]) U: @! G upp_reg_hdl->UPEOI = 0;( `1 n+ S+ P/ R9 p! Y
return ret;) r/ `3 A8 E) i0 U# o7 S
}
8 p7 E/ S) }. G8 i) }. P; H; kdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
6 n8 s' g+ b& N+ Y: Q#define upp_dma_sendstartQI(x) {\" n+ } k# d# {. @. y R$ V9 S
Wait_upp_SendReadyQI(x); \
4 Y Z. z( B- G4 B0 S4 L upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
" C: \2 ]. Z3 l+ P! H3 \3 T upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \# y/ S; Q! C2 x. w3 a
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
! t. F' Q/ x% ^. E, U3 U2 l } X! T: C( }$ G
- ]. [9 S ^. X2 A
) y6 f- O% D, k0 E$ w$ H+ \#define upp_dma_sendstart() upp_dma_sendstartQI(I)% T0 M8 }- M3 v( Y G
4 @; _& _3 N+ k( ], J1 N. j1 l
9 r+ B; J2 K' a) A B5 R* r# w
想知道uori错误是在什么情况下面出现的,好做出修改。
2 }) ~) U: ?7 ]$ d# ^% o; z+ ]" C1 i- A& E
) p6 G! I: k M8 [& C
|
|