|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?7 }) }2 |, W: ?3 n; ?" u
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:2 F x& P* w* n1 k
u32 UPP_Isr()* Z! ~5 |9 h$ ]+ s2 m
{7 r2 k4 j. D" M8 D. x6 H
Uint32 intr_status = upp_reg_hdl->UPIER;
0 s# w5 ]- }& z( _ upp_reg_hdl->UPIER = intr_status;//clear' N3 M" b4 d7 x% G4 a b- J
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");4 q/ \- H+ W" k" E
u32 ret=0;0 l1 D. Z+ S" J, n: e3 X
4 U$ b0 j6 M4 g% } // inline functions% S% c3 N$ [; I3 g, R
while (intr_status != 0)
! Z. x1 H* r0 t* @' Q2 F {
* H( v" b5 s# u8 z* }7 `, b* Z6 Z if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件% w6 R8 |$ I5 d7 G
{
) |( @# t g0 c9 N# R// Log_print0(Diags_INFO,"eoli.\n");
3 ]8 o) y2 {* x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
! l' D) }: Z* {% G6 r6 [ }% {* J3 q9 G; Z; b& c5 T
- ^7 R) L7 z' D/ t- F0 j if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件; L& X5 M1 [& C
{- o$ K9 z8 X9 s/ v8 b# R' }# G. F
Log_print0(Diags_INFO,"eowi.\n");3 f1 w! U& R' N0 E6 d
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
' U1 t0 w+ K3 c6 O& p upp_interrupt_count++;
$ a9 x3 @* ^% w1 ]& G7 y; l upp_interrupt_eowi_count++;
0 k4 h" k& G& [7 j! I/ ]/ O
8 m( s" D0 P: }% q#if UPP_DIR_QI==0
) b. T. ^* [) w5 a1 j: _ upp_dma_receivestart();
' Y. v; {5 F. J! n/ a$ V ret=1;
3 Q3 |' E _" ?5 y5 V5 _( G* _# V) u#endif
% ?- u- [1 D9 Q* y4 G }( R0 l# y' f6 o
' M! p" R* k3 i L0 R if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件: ^6 d) ?/ `* s/ p9 l" u) @
{
& X) z3 e4 ^3 B4 N! `) S }, U, S2 E+ d Log_print0(Diags_INFO,"erri.\n");/ i5 f. D. q1 `9 w$ e
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
/ H2 v3 x) p& f4 X, L upp_error_count++;; Z7 W' G6 ^+ y( d3 a0 l/ |
}6 T2 v3 |! ], N
( ]% ^8 ^, k0 z* B if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件$ d) E$ E! Z, N% i# U
{! f4 u0 t; _% \* q7 K
Log_print0(Diags_INFO,"uori.\n");2 a7 f' D' y" `5 Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);& W0 B+ g! V9 Q
upp_error_count++;% c- y, n& Q4 ]: @
}' N# g& D% U( K+ C! y z7 f% t. H3 s
7 Q3 g' }% d0 y2 n if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件* u0 W6 ^$ L5 K4 O
{
: y. a7 `7 K ?( b Log_print0(Diags_INFO,"dpei.\n");
1 K A) W. e% M) f6 K S3 h: i upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
/ O$ O1 q* z5 [$ G upp_error_count++;
4 J6 n$ a- v0 B$ z5 B }
2 `, f( O# U; A( N# j+ X4 b6 u& |' E1 o3 S6 Y h) `
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
7 ` K' i. d- `- R% c) p {
0 V: z% d8 K5 y [// Log_print0(Diags_INFO,"eolq.\n");3 I. S1 \# M& b, ], Y" O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);4 U' s. ~; H6 F# Z7 P
}2 c1 p5 i5 W3 V5 |( v
+ W+ P( n+ F: g7 |! R) ]" S( M! g* c if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)$ n5 i8 p G; ]0 G' O+ I/ d
{ X0 j# s$ j& `' _+ \. T [
// Log_print0(Diags_INFO,"eowq.\n");9 y2 O, d8 r+ u) _2 o. T" E: o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
% Z# P- ?/ r5 w' R upp_interrupt_count++;7 J! Z+ P$ I+ L" t* G6 z
#if UPP_DIR_QI==1/ x. C7 Y8 B- K, R6 a8 z
upp_dma_receivestart();1 ^8 W- I- [& v/ J
ret=1;
5 C0 S; r4 l0 d; V#endif
% ^4 }& ?" g- U% ^7 M) x }
7 a9 s3 W6 I% S
, N2 O, m' q9 d0 f if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)( Q2 b, K" R: N2 K+ Z! |* \- Z
{
9 K" A L9 F( Z' u. y, q! { Log_print0(Diags_INFO,"errq.\n");9 n; \2 L, @; ^: j" s; Y9 r1 r% z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);) J$ O* J% ^% M
upp_error_count++;
* n, N: r* Q; f }7 |/ p6 I8 C+ `
" L0 k4 A4 o/ H if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
5 _* l0 ~6 r; X9 n {6 h( J w2 n8 _( Z) o' p2 S
Log_print0(Diags_INFO,"uorq.\n");6 r+ `+ V$ d m3 r" w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);' V: Y# R9 ?+ l& U4 |. N; ]
upp_error_count++;3 i" q. H2 W0 v& G
}" `$ u4 ~/ f3 ?8 [) e+ k
8 r6 ^' W$ @5 D; o: C if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
. l M, C. Y/ m, _5 G9 m$ [# } {1 }3 n7 \. M2 \8 }: s# e" Y, s# k
Log_print0(Diags_INFO,"dpeq.\n");
% m2 Y3 @8 H+ o' N, c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
; _) n* X0 [3 @0 V2 r8 l$ B2 \, S upp_error_count++;
% k; f. W6 F" `' M& l; k7 s5 d }
: ^' f8 ]; n) {, Y9 b7 f1 f) i! g% g9 B
// make sure all interrupts are handled7 V- f) t1 a+ X
intr_status = upp_reg_hdl->UPIER;
, P/ f3 B4 @$ D" K$ o! `8 V }7 L/ s+ B" c) V0 Y# c0 ^ |) G
5 B' f2 w8 G% c1 l' s // finally: write 0 to EOI register
) J# h* y8 G$ d. @0 `9 V7 a* L: h upp_reg_hdl->UPEOI = 0;
7 R- [6 V1 A, N* V. B return ret;
w" u1 A4 R' Z3 E- g' J) |}
' D# u- A) [- J) Z3 [/ f1 Hdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
2 |( M! w5 V# Z; @* r#define upp_dma_sendstartQI(x) {\
* Q5 T, J) |5 C" F" @' B Wait_upp_SendReadyQI(x); \9 |6 W& Z2 i7 Z, E$ {3 ~2 e9 ]5 M" f
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
; ?) d& u+ e+ M4 l, e upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \( a, U: T$ P3 o y7 D5 q0 }
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
6 q: E" X4 m& A }
2 i6 U) o5 j* f1 C [- I
; ?, v, T* X9 l0 w+ D
& I' t4 E9 ^ q#define upp_dma_sendstart() upp_dma_sendstartQI(I)
" x4 B1 R/ R+ ^; J0 H% k+ ^4 @# y, ^) V4 ]
7 \: j8 C. N4 P0 {6 j& _+ {, d1 O
想知道uori错误是在什么情况下面出现的,好做出修改。! J* @9 b: h' E4 A
7 i9 ^3 p9 b# ^$ F1 k# [6 ]! ]7 |: B; s% n# M
|
|