|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?$ {: B, k; H: V3 P: D
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:: F& H: B' M0 r/ O" L$ A6 Q
u32 UPP_Isr()
" [( W0 r+ W. d. W+ d# M{
0 f3 E8 D# m7 I4 D- U8 { Uint32 intr_status = upp_reg_hdl->UPIER;6 n( [5 C N1 Q6 {2 B5 J$ f/ b
upp_reg_hdl->UPIER = intr_status;//clear; a1 [- _7 T& j3 Q
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");8 J" P; X1 ^" x+ w) D0 p
u32 ret=0;
& a' o% b7 a' ?7 V$ K. z
' D1 _9 b' d0 F7 w! s3 d // inline functions
! b- r$ }8 g7 ^0 Z2 _) ] while (intr_status != 0)
9 Z3 J0 h3 S' r+ a7 J {0 I" }$ T# P9 z% ` J
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
' t# ?1 J4 v- J3 a- M {' T K$ c1 ]/ [9 L: H g$ o
// Log_print0(Diags_INFO,"eoli.\n");
7 }' Q0 h7 c R- w. X upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
$ o) w- ^& f7 X! j }3 `6 ~+ X# Y/ ]. k1 P s& D( ~3 S
6 v0 m: M2 c5 C( }# i! S; s
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件/ t" J0 _2 }2 ?7 g+ \
{( b. M9 F8 m% y0 L9 I" G: t0 P
Log_print0(Diags_INFO,"eowi.\n");0 J% t6 w, B! V$ U5 X; m" ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ D+ c$ r w! T upp_interrupt_count++;- U+ v, y. w. s. ~0 a! N- x7 U
upp_interrupt_eowi_count++;
6 I9 G5 i% Z$ f/ ~* W5 f, y. e8 r9 e# X6 g
#if UPP_DIR_QI==0: X& _7 |: J, m9 n3 q- e+ ]
upp_dma_receivestart();
4 I' d- t) u& u; a ^# O! G ret=1;; x8 m' Z. Z: M
#endif; w+ k) U, G% _" V; N
}
u# e: e& \" K; h' g9 c0 x: n0 F3 @: `( A; E
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
( z3 W5 l" m* X. \) G {
3 s/ i8 L" {& S4 c, r Log_print0(Diags_INFO,"erri.\n");6 v! o8 u# H8 D& k0 X# k% i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);1 s# U. W% S6 U5 N
upp_error_count++;
3 J, U' M4 `. z. Q+ ~4 M( g }
) _9 S9 p+ U/ y9 Y" ?, V- A
1 ]5 |1 l$ z: Z if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件9 C2 Z% A1 W2 L1 C& W* I
{0 ^. Q; l$ l, P
Log_print0(Diags_INFO,"uori.\n"); p; z% b+ ?; Z6 W" A& y
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
) P0 O% N1 M% H6 p& h% q+ c. h7 j9 E upp_error_count++;
6 A u8 K6 O2 Q }
1 P7 s4 ]9 |% g) _8 B& K! E* V s, C% T# R
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件' m, y( E- e% U" o
{
- ?; J2 L+ `+ X% G/ [/ O: _2 _- s Log_print0(Diags_INFO,"dpei.\n");
2 S, j) }$ s' \0 S% H upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);+ C3 M* {/ e4 Q4 N
upp_error_count++;2 z6 |( E! q m+ D
}5 g8 O5 P; f. U4 Z2 W/ L7 Z7 @- ~
. a- g1 j+ z! X6 d! A, t# U if (intr_status & CSL_UPP_UPISR_EOLQ_MASK): j8 q; z1 F/ @: R5 Y
{" n3 T+ Y& B5 |" h, M! {
// Log_print0(Diags_INFO,"eolq.\n");
4 Z L5 q) W, t* \3 W upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
5 {. u( [, r, }% J$ ^: @ } V. U6 i! ?+ b7 a" Z
+ n" ^6 H7 e4 I; K3 v5 H. B1 I
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)+ Q% h6 \& O% d3 _2 H+ Y0 d
{
: ?# h1 j; g i4 H! ~// Log_print0(Diags_INFO,"eowq.\n");
) C# W" ^: s+ J# K2 C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
3 g W, b8 ~- _. |) }; G upp_interrupt_count++;
A: V, V3 v" k! j! |# [#if UPP_DIR_QI==1' M: g, J p% ^. W* ^2 b
upp_dma_receivestart();/ p9 s1 P$ }5 M) j5 `0 ?
ret=1;; S; o+ j+ u, T# F8 |& Y
#endif6 \9 ?1 R/ |- R6 T% i% J
}7 J7 l5 B4 i9 n4 a! H1 s0 h8 l6 g* u( L
6 }! p# l3 h; `, H
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)7 W5 X7 J4 i: h& l, a9 n+ H% f' K9 T n
{ k1 w% H1 P% i
Log_print0(Diags_INFO,"errq.\n");
) Q" o& E w: J0 D( B7 Y7 T upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);. n3 A3 u; H* k( C. C2 g
upp_error_count++;. o0 U; W) z; \4 ?& J
}5 B. X: s5 _6 w" Z9 p
' E6 ?8 V2 v" b+ V/ a if (intr_status & CSL_UPP_UPISR_UORQ_MASK)" N2 V( Z/ c! E: Q/ u3 p
{
& ~- z$ `1 n' x$ f# Y Log_print0(Diags_INFO,"uorq.\n");6 B# x# J; [- q( G$ i" K
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);9 h' q& x- R/ K5 |8 L. P
upp_error_count++;
3 }. Q! I0 Z0 {; G }
1 o* ~) c3 C/ Q- g* y7 I7 M, W+ g' }4 L! F
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)" Z# d' s0 K8 o% u$ d9 c1 ^; R
{
* m$ z% t$ ^4 z0 S1 e Log_print0(Diags_INFO,"dpeq.\n");
% n3 ~7 i7 _# j. w0 S5 f; n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);$ H+ d% I( l. G0 S! f! W8 @9 ^# K
upp_error_count++;7 S8 u" ?; i) \+ b/ ~: _; h V
}! x; v" A7 j: Z2 ?* |
3 y* Z9 D3 b% `% f# I0 ] // make sure all interrupts are handled
8 h: H6 V! m: {! R4 f intr_status = upp_reg_hdl->UPIER;
1 z" L3 f3 s0 J3 v& n }5 w3 ?: X7 H8 q5 a0 g3 L
0 h( G9 U* B7 P7 ]6 E& @
// finally: write 0 to EOI register
( |5 v" \+ D5 ~0 Y& b upp_reg_hdl->UPEOI = 0;
2 h: n- a4 Q- }, {# s1 v return ret;3 B0 Q6 ?) g1 b9 T- w, s
}7 A- I7 `! M, P8 s! \8 L2 s# T
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):5 c6 X7 ~3 R+ K% j3 p( i E
#define upp_dma_sendstartQI(x) {\
, s+ Z$ }) t" T; y# o2 ^1 I Wait_upp_SendReadyQI(x); \
* w* o J8 h3 w6 w% j. g$ _/ F upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \9 w4 h3 q4 \6 S0 `1 j3 o/ N% J
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
2 v2 X$ x) k. q1 P0 P upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\$ m6 Z, e) Z7 w! U
}9 ~! R* {$ W: C2 C1 S( m
$ L1 I; k& ? @5 F( \$ ?: t
! u% O2 z5 [) L; E# m8 R#define upp_dma_sendstart() upp_dma_sendstartQI(I)
- M1 ]% w2 u% J% L/ v
+ P+ f8 S! Q4 Z# z1 V
- M3 h% ~2 L( |' o! U想知道uori错误是在什么情况下面出现的,好做出修改。4 X1 R) B9 A9 r: J
0 b7 F( r# A7 D% z
& n/ j7 H, A9 J/ v" G+ t
|
|