|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
8 b6 z( f% A7 x6 _dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
' y% O7 `" h f! w; v* b* F* @u32 UPP_Isr()4 D! b' t' z. ^ ^" d) D
{
; x" R1 @; v9 O2 u& `+ d Uint32 intr_status = upp_reg_hdl->UPIER;, _( r% M7 Y% j2 M' d1 C
upp_reg_hdl->UPIER = intr_status;//clear
/ E& |4 [, z* e; r1 r. o) Q4 o// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");9 J T3 [7 z: ?1 T z2 H
u32 ret=0;
' R6 x3 ~' ~9 R# \. r$ l3 H2 ~, r7 r% S7 s/ b1 X0 R' Y5 x8 h0 M* i
// inline functions$ N7 k5 c' S, J0 c: r8 E
while (intr_status != 0)
; u* g% B- l8 u, v: Z* @ {
& w( \; D+ @( p$ ]7 b6 S; Q' _ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
# i4 a$ [4 l# H* C# R$ w& K { Z) t' |; p/ c _: V( h
// Log_print0(Diags_INFO,"eoli.\n");2 ]7 q {; a# H/ f5 G+ G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);5 M( _% E4 n4 K' b& s% b( _
}
% m3 A6 \2 {9 }& q
- B i o; N3 s9 K) P if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件! R/ `" q- V) C1 l/ Z4 j6 a
{
+ x8 `9 ^2 V4 i5 D2 M B) ]# D5 M Log_print0(Diags_INFO,"eowi.\n");% t; |. k, r O3 i! [% c7 A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
i2 R9 H# w* H2 T) I. Z upp_interrupt_count++;# D6 I& Y9 m6 }5 P8 F0 E
upp_interrupt_eowi_count++;. A* L. O3 X+ F4 j# R; R
+ E. \9 ]7 v1 C3 O: g$ d; ^
#if UPP_DIR_QI==0% M2 f) r. q [5 V w/ f" e
upp_dma_receivestart();
* y1 ^4 [$ h( _& B& V2 ? ret=1;$ G- w% F/ i, n) R
#endif! Q. T7 ~1 p: l7 h' {- \' h7 ]( m( Q) x
}
$ y& w9 U/ ^ ~
! k' V/ O/ I; y/ Z/ r9 I y0 j4 t if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件8 x+ k( c' w6 c Q
{* x) e% k/ A( b0 ]4 j' F- e$ U
Log_print0(Diags_INFO,"erri.\n");
5 {7 ]0 a; |1 f1 H9 F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);1 s8 y! q( M6 i6 [/ o
upp_error_count++;+ G4 K3 Z7 B J' w: `* `6 }
}9 a8 [8 W- }6 S' z& ~" U
7 T1 E, r/ `7 p! E if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件$ H: J9 H0 W. q3 C0 h( p) T- ^' E
{! x" Z9 Y9 |! g* L- V
Log_print0(Diags_INFO,"uori.\n");
9 D( E) t. [% S" y! K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);( N, B, N/ l2 w4 O9 w/ s3 K. Y5 P4 A
upp_error_count++;
; T9 {4 A# s9 C5 N; b, b6 i }
7 E& _/ ^3 H" f3 F! B+ V
4 K# ?- u. s' B: y+ F if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件- i; {' G K1 ~3 @- T
{* |0 a7 S- P) p7 U8 e& l# Y) C7 J
Log_print0(Diags_INFO,"dpei.\n");
6 }; S: m+ ]5 `. U) f2 c upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
6 U. z. X& o8 x& k; G5 Y, q; t upp_error_count++;
# `: n1 b" b0 w }4 T0 A3 d3 f9 d; C2 `
% K- m: ]- K3 M1 P* I
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
# F# a) w2 g5 ]) W9 n; c$ ?. W {
3 y- V1 Y- {8 p8 c* S// Log_print0(Diags_INFO,"eolq.\n");% K. R3 i5 j% n- ?- v3 I( g
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
# ?- Q- k1 _9 ^+ k }
0 D# D' U& M0 {$ v2 }' M
, g, E h" j* B( S! A9 F if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)! c- P7 O. a3 S7 I: {& u2 I; E- p
{9 x. G/ Q& ~# J3 F2 J% [, K
// Log_print0(Diags_INFO,"eowq.\n");
9 m; k! n/ {$ T3 n; V: G/ ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);! k1 _8 Z) a( Q9 Z# N% X% [
upp_interrupt_count++;
5 y" b3 G2 ]2 A y% U, \( a#if UPP_DIR_QI==1
; o2 A0 ]) S& Q5 D+ g9 Z) R upp_dma_receivestart();
3 @1 Y, p# ]# R" u! ^4 [; x ret=1;
( F! e5 H5 l: `: x% w3 Q#endif: j* x! c, c6 o6 G% D" [
}
( d+ s( d/ n2 Q2 D$ p0 D# `, |0 ~% b: V
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
/ i$ N" |2 n! q1 f( V0 N3 a" Z {
# P) n. W7 l( ~9 ~1 K, H Log_print0(Diags_INFO,"errq.\n");# D0 Y" }7 s4 h3 o/ o
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
' P/ `% i7 _8 q upp_error_count++;
- w( `, b4 u' [1 r; E2 e5 h& w# A }
; y' r3 T+ ?1 ~' K1 o/ O* f
+ [3 J! F1 Z# C, y+ Z! }1 i if (intr_status & CSL_UPP_UPISR_UORQ_MASK)) i. }5 N" z1 P
{+ V5 e8 s* `9 N$ K
Log_print0(Diags_INFO,"uorq.\n");
F0 y* x, X( e7 }1 c. c6 R1 B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
& u) m N) k4 S2 r upp_error_count++;
9 Q2 N/ K1 Z% t" g0 l) f- p }
3 s( P/ F4 |9 C. e
3 N, V- h3 }$ j; Q if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% B8 L- c; V+ C1 b. w/ a$ p {
& n7 n9 P, |6 m' f' y+ F$ y7 w Log_print0(Diags_INFO,"dpeq.\n");
( Y4 Z: l$ T- [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
5 Q- Q# e4 B) \: P1 ]3 Y4 q2 t upp_error_count++;" r- D6 H% h; y: s% c- e! X# |# s
}
) p: w; n$ i, V
/ P3 y" l$ j7 A# E+ R // make sure all interrupts are handled
$ l8 x% c! ~) C intr_status = upp_reg_hdl->UPIER;( S2 _4 y/ z7 j' \( E
}- s! B* x7 o% D) x: |6 B$ L
5 u9 m7 l: L. L* l
// finally: write 0 to EOI register1 z9 O- a# ~1 {
upp_reg_hdl->UPEOI = 0;
: o/ w* G% c* C" j% W: ~ return ret;
! Y( t1 `4 B0 Z1 t) @, i}
/ X" \- z" U; \5 gdsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
7 {3 J- F4 ]# y#define upp_dma_sendstartQI(x) {\3 Q4 M6 K( M" @; R! ]
Wait_upp_SendReadyQI(x); \, F$ g, N( z2 {5 p/ z
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
" p: A6 _5 J3 Y! x upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
' K' }! z3 `1 o+ L" A upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
! _2 j% U, P% D$ l }
" t$ n7 ]) W; U& [) o, I; s
& @9 ^. L/ t. O% y
4 w% b1 I3 j% m2 W8 W2 Q2 C4 m% |#define upp_dma_sendstart() upp_dma_sendstartQI(I)1 m$ M3 f- h3 k# b! m) p
1 Y9 v B% Y# S4 r, @6 J) I% O* I
# p) @: \) o0 R6 n1 o
想知道uori错误是在什么情况下面出现的,好做出修改。
- ^5 j l4 u/ |1 l9 d O
' H3 T. q% A9 R( }2 ~: I: F; S/ o9 v; w8 V1 Y" P% E
|
|