|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?- l/ j1 e6 q$ W9 `) U) W |% }
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
0 s2 I& l. d" Mu32 UPP_Isr()# q. k0 c8 l8 L% |& g
{" [% ]# A, M2 W. q# X
Uint32 intr_status = upp_reg_hdl->UPIER;6 p) f8 u R$ C+ z0 P8 r
upp_reg_hdl->UPIER = intr_status;//clear# |9 h) U5 {/ |, Y2 u7 h' j
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
9 x% U" T! Z, K* Q u32 ret=0;
7 M |" b4 B3 X2 p, |" [( U/ T* t( }$ f
// inline functions
% p: s4 r" c- d; W" L while (intr_status != 0)+ T' l. M, H5 E$ b6 B1 u. I" A
{2 e' }) x7 x! V4 k
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件: x. t0 `/ H/ d4 d* {
{; _( \" J/ M# x3 I- C7 b
// Log_print0(Diags_INFO,"eoli.\n");, C' g6 M" d2 `0 H+ V9 E' h
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);$ v; J# ?6 X$ L6 g
}
( U) Q- \0 v* O X3 Q0 r
% r w6 |5 i, o! e8 u. Y, c% w if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件6 @4 z( G( Y) L B
{
4 I. P6 v# q8 m: n Log_print0(Diags_INFO,"eowi.\n");% n" K: w0 {! [8 ?
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
/ M. M" |4 x5 b- l: U! \; k8 ^ upp_interrupt_count++;9 V: ^) W7 Q: p- P1 u
upp_interrupt_eowi_count++;! T4 ^% R( u" q# n, K( g- E; a
- P& z+ `; j: P3 O
#if UPP_DIR_QI==0
1 e% e: D4 C* A$ Z upp_dma_receivestart(); f$ T$ H, Y- z4 W: T, y
ret=1;
. G9 o' D% ~! r x% l" |#endif, t, Y9 q5 c3 `- J$ s% I J' A3 K
}
9 T" A4 }3 i3 d
$ d9 N8 a4 i: ]1 g- k3 h- _' Y- w if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件& c% y/ ^' H- ? R
{
- g# u, V3 j+ e( q1 e Log_print0(Diags_INFO,"erri.\n");
( J2 r* P1 T, F- t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
# T1 m/ {: O8 Q% A* k1 R upp_error_count++;+ X/ G7 v( M- C6 p" N+ q T
}
. E8 |2 a: e0 f" E3 `; i( S: L% [) h) q( l: k6 f% ~
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件# X/ [3 u1 o' Q+ L- t
{
' v' Q, F( S% y+ V! K. B Log_print0(Diags_INFO,"uori.\n");
3 I- N5 i9 R+ T$ u7 H: K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);+ ~0 E' a% A* r. @" p* l- J
upp_error_count++;, ]* v. _. ?: j+ N" T w6 _
}
' a+ d8 |3 j9 p- t* r; G% X
: P: j2 ]: ]0 v! w if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件6 F6 t1 D x& u2 z
{& j! r9 C% s: J* @
Log_print0(Diags_INFO,"dpei.\n");
9 K, g; U+ k: q3 P/ r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
% @1 x2 G F: F$ x upp_error_count++;3 b, h. Q& ]/ w3 S
}
4 c$ G6 y& s/ W- {8 [, k O4 r4 Z7 n1 d2 W. H6 q4 S( [
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
! T% A: `" l7 t3 ^5 Y5 ^6 @: O {6 r( l* Q7 J& A0 r0 U
// Log_print0(Diags_INFO,"eolq.\n");* }# z1 V' U$ w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);, S) Y: c8 v6 X
}
: h$ s; ^, ^5 ~: O8 W7 A6 x' k% e5 L" m: ]+ Z, T# J: y
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
2 V4 q) R" Y& B {- B5 k/ Y" T: t) |$ P
// Log_print0(Diags_INFO,"eowq.\n"); ?; u7 J% L! M# R' f
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
; i8 O$ x) Q: N5 h/ D, e0 l# j upp_interrupt_count++;
# ]1 S& \9 ^: m7 P#if UPP_DIR_QI==1( l9 |& E9 u- V: w' f
upp_dma_receivestart();
* H$ I `7 e7 {' [$ p0 ~8 o% N& c ret=1;: Y+ A+ V+ G- p; `6 x
#endif
8 A/ F6 ]: \& a9 y! B3 l7 z8 t }* r1 y' p; V1 v) s
+ N1 n: }$ M, y& b
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)# u) ~8 O* h6 R3 I7 X, ^4 [
{
. I5 U- O1 p% \# A/ u# s9 A; B Log_print0(Diags_INFO,"errq.\n");- g0 y6 T4 c* q- f0 Z: O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);- ]$ v7 p, Y) Z0 B. F4 n0 D
upp_error_count++;9 N3 V6 |- ]- }; j
}
. L- t( A. N5 c% |7 J& e1 l
1 a- n4 @% z+ o" }( O+ Y! F if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
5 ~- ]( G3 Z) @+ j {
: |) m. g' G+ ~3 I) e6 ?8 M Log_print0(Diags_INFO,"uorq.\n");
0 M8 S- @7 ~% q/ ^+ ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
! {2 \! w3 y1 l0 k3 p4 D9 o$ a& p upp_error_count++;( p0 U+ W0 J0 d1 A3 A* K
}. m5 @+ [* o0 N+ u% u5 s
/ v Y; |$ v, A/ _, h+ L/ V6 L% l V if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)# C# b( n8 I4 h4 b4 P% B, m
{
3 [4 L( L5 ]" v Log_print0(Diags_INFO,"dpeq.\n");0 h! N. Q) g' u9 ?) A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
! f. k$ e l" O+ v h upp_error_count++;
$ Y; a$ c1 j$ d8 o/ v4 l8 k5 d }
- q9 f. i0 b$ A# z( x1 A9 o4 }; v; z, f6 r. v
// make sure all interrupts are handled- F! f/ g5 {- L" e. r+ I
intr_status = upp_reg_hdl->UPIER;
% m" \; J% z. w }, e# D' q4 B: g% R8 b
. x/ Q8 x. Q6 L- H8 _, [- ?
// finally: write 0 to EOI register
+ m0 B* K9 h) m0 }& i& Y upp_reg_hdl->UPEOI = 0;
" F* }7 \1 L e4 _ n* g( i return ret;
, s2 |9 u: {* B. `7 q9 L+ p}
) { U* j, W8 v! Ydsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):& _& h) l/ O% D) `, p$ u2 n" H
#define upp_dma_sendstartQI(x) {\" _0 g" E) d) M% H5 R
Wait_upp_SendReadyQI(x); \
5 F( ^+ v. B3 F5 ~, G" W: } upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \8 X1 J6 K1 E! b1 P
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
; x0 P7 W# o7 I/ m5 I4 R. U upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
! q7 ]. i* |& h0 N0 q }
/ i% D# v2 v0 b1 R8 i( v* t5 T8 j1 v5 k$ n
3 q, a- V q7 v- I7 g* U#define upp_dma_sendstart() upp_dma_sendstartQI(I)
* l- S8 j% z% `" k# e2 w; o3 M# u6 P0 T# N# F6 a6 u6 ~/ ~, r
, y. G! z+ h; R7 U% ]2 ?7 _想知道uori错误是在什么情况下面出现的,好做出修改。: m# Y7 [9 Z$ M. a
% r/ m% Y$ y; J0 W# n& h
8 F8 g5 S6 P% C* O* A5 T, i" q |
|