|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
" r& C0 n1 A8 f) S# s0 ]dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:; k$ G3 K& s1 S
u32 UPP_Isr()- Q. U- x3 f) n
{7 S! O' p2 A& n: y$ x* U# z6 N
Uint32 intr_status = upp_reg_hdl->UPIER;
$ c! l. M, q4 M2 q3 x$ J upp_reg_hdl->UPIER = intr_status;//clear2 m' |7 h4 E2 A( H4 e m9 y
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");: G" |+ y* e. S _" @& ~
u32 ret=0;) \) Y' X7 }" `+ ~% J
2 ^* D! ]1 C+ x2 U3 p // inline functions0 q/ I* q- w3 @, F' D
while (intr_status != 0)
9 ]8 ~3 y _$ F B& I) M% p { |0 ~6 M1 `& T
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件9 Y% R3 z( D. E3 A! |6 s
{
' D9 m9 L: ?8 m- J9 y// Log_print0(Diags_INFO,"eoli.\n");
- q0 E& d- \& Y* v0 g upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);9 B4 z$ @9 D+ p+ q. A5 L# s( J
}! c( b, L8 @4 \7 n. P
% T: h8 c7 o3 Z+ j9 ?7 \ F if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
& a9 V/ c$ I) `% N, f9 R {& ~/ A' D6 y9 z! m5 ^% v
Log_print0(Diags_INFO,"eowi.\n");
0 g5 F5 \* D% P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);: o: e& [+ ?# V1 L$ ]* E# }3 b
upp_interrupt_count++;
$ h* P$ F- i& a* E; d% K0 U upp_interrupt_eowi_count++;$ Z# d5 ~) E9 m: Z! K8 R6 ~
9 s5 k: g6 X) Y7 H! T) A) i& b' O
#if UPP_DIR_QI==0: l$ W* R5 ?& x3 {- V U
upp_dma_receivestart();$ j! k! ^+ n/ s Y6 f2 D, S
ret=1;9 {. r s2 w2 }4 a) b* u- a
#endif. N. j, N- G' _3 G
}( i l- {+ p, \
: b9 N9 _0 O9 H& @
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件: h4 @0 @/ Z& C" P7 b
{: C. i0 ?# S2 f* t. [# ^% l# F4 a
Log_print0(Diags_INFO,"erri.\n");
. |, n. h) v$ }" Q, Y$ R q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);9 F5 c/ l2 o! ^+ h. s
upp_error_count++;4 W/ p- {/ t( m; @; o
}6 n+ G+ z8 W3 f
]* [4 l* ^8 i3 o# P
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
% z# K* L3 E; P X {" Q8 o6 v- y7 R
Log_print0(Diags_INFO,"uori.\n");
+ f" z2 b. E# \2 z5 U6 r. e upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);& Q# ~9 n; ^! j( O
upp_error_count++;* w e! t) H& P8 ]4 z& g1 U L6 A
}* P0 ~" N9 e) ?- y
/ c k/ O. H( T$ X# p3 ^5 \' B if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
( V- N. g4 A g {5 |" }; `) _5 i2 E- B7 A9 X4 d
Log_print0(Diags_INFO,"dpei.\n");
$ @/ M$ f' ~0 f2 t* N( T* V. R% b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
/ H9 g$ z2 V8 ]# n4 b, r upp_error_count++;
4 Z/ h& {% g4 u( A3 c }
2 i' M! _# ?* { S* G! z6 M, @, M' j. E
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
8 H. u0 J4 Z0 D" E* d9 a& _9 k4 n. @: ] {# y# y* G, q# {# `1 \) s5 y
// Log_print0(Diags_INFO,"eolq.\n");
* V; @: E" X& }! C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);5 h Y0 h: N& [& i- T
}
" E; @: K- I+ I( \8 r* f/ c$ ]! d% C6 `/ `2 o6 q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)0 T9 s; y/ M, m$ ^, K9 P# U& H
{5 q G# x3 Y3 L& b, P- M7 d* Z( z
// Log_print0(Diags_INFO,"eowq.\n");
# _. ~! o3 D% u4 w7 R/ _) | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);- @( [2 `4 v9 k3 _1 E4 n
upp_interrupt_count++;1 r. U, p$ ~4 I% p( }" F
#if UPP_DIR_QI==1+ h p+ D" G' W9 b" N* ~- @
upp_dma_receivestart();) \: P/ D5 d2 [( d
ret=1;
$ Z% t0 k) j" z! r% u3 V. i O$ H# ]#endif
+ M) Q7 \; L' j Z: D/ }6 ~1 e# ~ }
3 w( a* M) {$ ]; M: X) i
, Q+ h: T: }/ B& j# G if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)4 m" w/ q) r( ^: W; O
{. N- z9 [) w; i- h0 _
Log_print0(Diags_INFO,"errq.\n");9 r2 z7 I% r& U# [, ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);! c. B8 c9 ?" R4 L/ e' X
upp_error_count++;& k3 e9 H& G7 s( Z# o% c9 r/ Z6 v
}
" e% a) e! c: H% K# |% o* W8 W4 @' A0 w/ a* P
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
, e0 n1 y1 j" Y0 f! d* G {+ d. Y" D0 U2 p' B3 p7 _6 T/ Q7 Q0 C0 D9 I
Log_print0(Diags_INFO,"uorq.\n");
% H( U! y6 x' h9 r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
9 v# a' k; W) E, @/ Q4 C upp_error_count++;2 y" [4 n* V* i# l' E$ z5 u
}
* V* R2 @2 A. D- l4 _
! ^0 R: _3 A; A; J* m* X4 O if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)4 M( `8 s9 {, A! |' Z2 o1 O
{9 F( ? L$ N+ J+ s5 |7 D. o
Log_print0(Diags_INFO,"dpeq.\n");5 g3 t' O* E. c2 p7 H* J
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
' U' C2 U7 X2 C upp_error_count++;
. S4 ?1 I8 `! q) W- Q }3 L5 z: t5 p6 k
* `# f5 S$ `5 L _! v- U9 A- V
// make sure all interrupts are handled
$ A! t" D' \ Y& \5 ] intr_status = upp_reg_hdl->UPIER;0 l* f) c f$ X( `/ U
}
/ B2 ]3 S, e$ _2 y3 F; E/ e4 J; w. t8 K4 F+ n) |: a
// finally: write 0 to EOI register0 J/ b4 K* B7 D9 f! d
upp_reg_hdl->UPEOI = 0;8 q0 ^9 p9 ?( f: J6 Z
return ret;
$ M8 H3 P q# d. V F}) d+ t1 r' A# p
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
- ~/ [9 l( R7 T/ j#define upp_dma_sendstartQI(x) {\
3 g8 E- o. S) q" A Wait_upp_SendReadyQI(x); \0 X* |! W- Z) \6 [
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
( _# W( y- r6 [$ F. {# h" ^ upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
& R* L: b* N* B* h; p- V& c upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
( I" O3 m/ `3 k7 ^ }( r5 B9 L2 I# S' W" S; h- m. L$ O
4 w1 t3 p/ f1 i3 c4 \7 r# L7 t9 P1 y% S6 }+ ?
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
& w. c* {/ Q9 _( q! z
) B' [* d1 t$ W( }% c: q+ @9 j: H$ Z7 w3 \5 G# ]$ q
想知道uori错误是在什么情况下面出现的,好做出修改。
$ v5 @1 H1 x( g0 T B4 `/ V! o) p; [5 D) k2 U3 u- E. X
' }& I% t" I; Z |
|