|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么? i+ c) ]; g7 ~
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
7 ]9 ~7 G9 I6 P$ x; f! c* `3 ~6 ^u32 UPP_Isr()) R+ D9 l% ]; l4 Z. S- Q, o
{ p5 f# o. X, k4 f: D6 ]
Uint32 intr_status = upp_reg_hdl->UPIER;$ v7 i. y1 j+ [! M" e7 x6 i
upp_reg_hdl->UPIER = intr_status;//clear$ ~, C, J* D8 K+ Q+ i7 S1 V, N
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");" g- ^5 p2 n* `# }. Q% s( H" I9 H, I
u32 ret=0;8 G5 B. T- d* ?
/ x1 C; @5 e B% }! R+ O, }# a8 m! S A
// inline functions9 x1 z" P9 m L* X
while (intr_status != 0)
1 w; j1 D, Y: H5 q0 T( o {. ~7 M6 \4 G& ]8 P% V
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件* O5 ^/ Y3 |; t- k( v
{
8 J: f$ w6 H4 v6 @$ f! \5 p// Log_print0(Diags_INFO,"eoli.\n");
3 }1 |( T) y R& f, D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);- S* o2 }. \1 w) Z' E# n
}
* N; e9 A3 i m4 T5 U$ S2 B, ?" a w
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
/ d! `$ C( H. a% ] {
2 m6 j d1 ]+ [% K( n. s Log_print0(Diags_INFO,"eowi.\n");" E, q! q. F2 }' f" `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
) \" i# X4 c9 T! W- N upp_interrupt_count++;
2 p( j: q8 `& D) V9 C! |$ O upp_interrupt_eowi_count++;
- }; s& _0 u( e5 q- A* p- ^) @4 H: o! [$ p# n
#if UPP_DIR_QI==0
3 `+ X* t0 A; r+ Z8 I2 k upp_dma_receivestart();
& \3 e5 z2 A/ @9 E+ P ret=1;. i& i( X ^/ p2 z6 I
#endif- K+ k" `. O# p8 r: S ^
}' G3 g; u2 ?# B7 o6 f: V# c2 K
6 h% x2 r* m1 j5 [0 I; _
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
* `7 I( b* q# U9 R5 v {- R+ a" V( r2 n8 S/ R
Log_print0(Diags_INFO,"erri.\n");
9 y. ]# `1 g6 R- {5 S' e2 A# } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);! x$ G/ c; w+ D/ x- t, |% `
upp_error_count++;3 x1 A; D) l+ @: g/ M
}
0 H: w% C1 G& `& N9 ~3 h0 X3 ~ D' i% V# J0 ?% K
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件- L+ n: |0 j5 i6 X
{3 U) n9 Q. [3 \) N( B
Log_print0(Diags_INFO,"uori.\n");+ Y, }* a5 n' J; \! k$ @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
) t) f1 `7 E3 ^0 f3 A+ |9 F1 P upp_error_count++;
; w# p2 q" m4 l" W* v) Z }# y8 Y% O! U8 n2 `% {4 ~
* }5 k2 g C4 u
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件8 N$ D5 s ]3 x
{
; p8 l( Q( E; } x4 S& \ Log_print0(Diags_INFO,"dpei.\n");
( E @% R6 O3 A2 y2 s! v& _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);- y0 a3 d3 |* ?. z2 J
upp_error_count++;0 l3 @, c( B& G6 e# i% H
}
5 J6 x; `; K9 ^; F9 @5 E) e5 c
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
4 Z# A3 R* f0 n {! R' T+ [6 P T8 k
// Log_print0(Diags_INFO,"eolq.\n");2 I& {( U3 U& `; K4 o$ E# Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);' D6 e. X% ~9 C r8 m
}2 [; P# M" L, q6 Z) ]3 J7 h" k& U0 p, E
6 S1 W; `' V( K* @- \3 ~+ M& j
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)6 r. B0 h. l1 M5 S# I/ ]
{# h* o9 A, l$ I6 {3 r1 c( X
// Log_print0(Diags_INFO,"eowq.\n");
" O' K# u0 [4 K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
' l; {( `. A9 D) \ upp_interrupt_count++;: A, ^$ r/ S; w) d, Y
#if UPP_DIR_QI==1% ?- Z9 F8 i$ j# |
upp_dma_receivestart();, j7 r& f" N4 p9 f2 R3 u& T4 s$ L$ o
ret=1;
9 L& F1 S( G" C9 d# i9 E#endif
/ M" t; ^$ Q! O, l3 u9 W }( H9 h& e! S) b4 Y
3 V& j2 I+ \& G: _6 o7 W
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
& J# j3 {4 h6 c2 t/ e {
' r5 n% G2 c3 [* K! |2 c Log_print0(Diags_INFO,"errq.\n");
0 I- s/ @! S8 F1 I" J" x upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);/ }4 S5 O) x, ^- P& L
upp_error_count++;
- O4 k, V6 }8 {9 Y6 W( h, O" O }
* k8 [0 C% U4 g h p% s) P
: M. q F; k7 s7 |0 E* E; {2 ^% S* \ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
" H- ~* h1 x0 H( t) T {' z$ x) n; h. a& H4 z3 H
Log_print0(Diags_INFO,"uorq.\n");% z& I6 S4 [4 Q+ h }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
& D% T9 o* a E* U% ?5 z upp_error_count++;
! `" X& S8 l M$ s! @ }' m# b; |! P7 v0 |6 Z
" G$ D! }) `7 X0 k& j# D' \
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
4 z! [! f9 b$ \! B {2 _1 K0 \: p; f6 r+ J/ n! p
Log_print0(Diags_INFO,"dpeq.\n");1 n1 ?; S7 P: N- J7 k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
$ n% g( z v X3 r upp_error_count++;
/ S3 f' U: ]1 }$ Y$ p }
9 d* m# [8 Q1 `9 ^8 u. ]5 Z/ k# Z# d4 m/ V7 f6 c; _) f
// make sure all interrupts are handled
, N9 U1 e" g7 O3 K intr_status = upp_reg_hdl->UPIER;
& o6 |( b3 t' o8 I1 `. W }
* @9 c( T5 X7 H9 `( q8 C
" H d) ]0 {# e4 W // finally: write 0 to EOI register
6 V3 X2 V+ i* z; |; ?( J upp_reg_hdl->UPEOI = 0;3 E* k8 b' C& M
return ret;
( _& j# \. U% g& _" U* J l6 d7 s}8 }! U- {. f% v
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):* l3 K) y4 W. ^7 {* }4 t
#define upp_dma_sendstartQI(x) {\
8 M1 L% X" O8 i! ?) Y Wait_upp_SendReadyQI(x); \
9 J# ~( c/ d3 Y1 B3 O% f( k* D upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \1 {. _& G, h/ |9 p3 Y
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \% a5 Y/ p: }$ V; ]) r
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\. B9 R$ O, _6 ]# ?; h1 q
}
0 Y, \8 p" G7 @6 y* p
[9 e# E }1 {% q2 }- B: H5 R9 J" O& f
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
; ]# W/ i8 X1 T5 C' G1 H5 _1 ^. j' s, H( t2 J5 w
" c4 Z+ G: [7 F想知道uori错误是在什么情况下面出现的,好做出修改。/ M5 U6 m$ A. o
% p6 f, k& o7 C" t* u0 A
) q6 K' _7 a' X/ O |
|