|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?$ a j' ~1 P9 u! ]# |; Z, `
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
0 t4 S8 D. q+ k. ju32 UPP_Isr()
1 E( t+ ~: \( T7 U: N m# \{
8 }3 ]4 ?( _( i/ n/ u Uint32 intr_status = upp_reg_hdl->UPIER;
4 D2 c" {) ~ `( \: [ upp_reg_hdl->UPIER = intr_status;//clear
! a! q* {/ w" R' C: n& G* X7 E j// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");6 c. o8 J% S( r
u32 ret=0;) _2 h3 W6 u2 m$ w" ?- K' t
- F1 B7 M2 L, H$ _2 L
// inline functions
: Y1 i. \# i% I# o- M while (intr_status != 0)& D. O4 m& N2 l5 K
{; N. P2 n ^! Y. U: }) t
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
2 q6 S- Q5 E. j! z5 d% d- g5 [5 N* m {
6 S; R% X, r4 x! O+ }0 i% {8 @// Log_print0(Diags_INFO,"eoli.\n");
6 l2 ^. K$ ` L7 G2 \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);: ]& S: t P& e. l; o
}
# \7 N% N+ m$ n" F% S1 S' G5 ]0 G8 H& G, g3 Y8 i4 D& |( \4 p
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
- r A- T9 V2 ~; ]8 [' J {
" ]$ }2 y9 h& W% [* u# P, ]% v Log_print0(Diags_INFO,"eowi.\n");3 s( M% n `4 h
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
: O+ O2 ~+ B. O upp_interrupt_count++;
2 |% J+ T1 j* w8 P* F upp_interrupt_eowi_count++;- b( V3 s) z, ]$ Z: r P/ i) p
# g9 W# R8 V$ X$ e' r
#if UPP_DIR_QI==0/ [ x5 R* J y, ^0 C+ n
upp_dma_receivestart();
" E9 ?8 J* K# [; f- Y0 M ret=1;
3 f( C3 c d4 L3 Y& e- t! R7 u#endif- O) g; o+ P% T' s) J& T
}! D( B" F4 C% Z4 v' r- z
0 g0 i" V. M7 ]; b! E) l if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件# _* q( e+ t$ F" N" Y
{. w. `( x# i: i7 c+ M
Log_print0(Diags_INFO,"erri.\n");
4 c' s2 q: G/ F9 _9 j8 A( s5 ~% @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);6 [9 r; o( a( o2 a3 Y
upp_error_count++;
+ W7 Y* G; O4 k; s0 s i. D }4 `- {& h5 a$ i3 v: N4 ?+ a
- L& f( P, a+ H+ X3 [9 ~
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件- a% t% m m- f" j
{4 U# U& B0 e7 \9 _8 z5 P
Log_print0(Diags_INFO,"uori.\n");
' Y1 a% C% A; l9 n6 D) Y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);) v4 y% j: E+ r
upp_error_count++;
) m, s; u8 N( ^0 Y) ^: Y! s8 g }
& Y" R v% r: I6 H+ ^( n/ }5 B! p3 V/ z/ T4 y, N$ H
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件; v( Y& f0 h/ A' J7 i
{
; d7 `* y: G/ c: d3 p3 e Log_print0(Diags_INFO,"dpei.\n");
& u0 I! b. C; e0 S& |# b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
4 Q( \2 R$ W, c4 D4 e& ^. E upp_error_count++;+ d9 W* u! I9 S+ Z1 h5 a
}
, t: y: E$ v9 C8 e9 @/ U8 o
# k/ w. j7 h) Y* R1 F* H$ l if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
: b6 p: a% A3 W5 f1 | {
6 m3 M) e" s1 u% M v; q6 e// Log_print0(Diags_INFO,"eolq.\n");: E" E# H% i+ `0 c# _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);9 D1 i0 r( @; p, ^5 m
} P& A. |) Q# v. W( x
) l0 U! {8 F- M5 T if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)+ n; N& |! \$ S L
{) C1 m* @9 L3 z* g) Z
// Log_print0(Diags_INFO,"eowq.\n");
" T6 }. F% f: g& f( o; r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
: u7 g- n: [/ Q; }1 Y+ K upp_interrupt_count++;6 s% H. B9 }1 f6 E+ R& [6 e
#if UPP_DIR_QI==11 w% y1 v+ [7 y. s# I- G1 [
upp_dma_receivestart();( q; m: E* ~3 p; H% h
ret=1;
; ^9 M- Q! |9 `6 L( q#endif
/ _3 F5 b+ H" \8 \* C" ~ }
" e" R. h' @& c9 Z" H7 @! z
7 Y+ _1 [, I8 X3 D! J* p% K if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
, E- p" n- p) n, i {9 i/ y5 |* C/ q3 g
Log_print0(Diags_INFO,"errq.\n");) y$ l1 q4 ^% q' F( u- a$ B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);) A2 j9 S9 X6 i$ n6 e Z
upp_error_count++;( w+ [& M5 L0 M3 `* v f% h/ M: ?' O
}) @; [* j: p8 o! R' H4 h |; E
! N1 p. W8 X7 i+ `: o/ I* ?8 }$ L
if (intr_status & CSL_UPP_UPISR_UORQ_MASK), x+ }* W, N8 a: N# ]3 p" B( o
{6 L) v* w4 {6 n* m, F1 E4 N
Log_print0(Diags_INFO,"uorq.\n");
3 x+ i+ F& E6 O: N2 F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
" v$ F& H/ s! {& F upp_error_count++;# Y G5 _- ]( D3 T9 ]% q' f
}
% v& {( P0 X+ ]; P! Y& ^
- y3 [# a( w7 X: t if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)* L" X9 D5 n b& B
{2 y. h# l- P- C/ q# C- W5 [7 B
Log_print0(Diags_INFO,"dpeq.\n");
7 D, _" \1 O$ A& S- J) j& w upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
. y& {2 U4 W6 n% @+ ]7 `9 T0 W) @ upp_error_count++;
, B# ]' D8 {7 A! b }: k2 Z; J8 b+ H9 d
- g3 y7 B. u' J // make sure all interrupts are handled
% w2 Z# D, S) }: U% `$ C- P# | intr_status = upp_reg_hdl->UPIER;3 j$ `0 H# Z8 v0 C- S( C
}
, D, i- B0 T- ?# I4 i9 j" P$ P8 l, Z3 @/ X
// finally: write 0 to EOI register
& H2 w. g! g2 v% e! z$ `: P. O upp_reg_hdl->UPEOI = 0;6 c, `/ Y. S/ F) j' n
return ret;
) {0 O5 T9 K4 b4 V}, s2 |! {8 S) O# m+ w
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):8 V! e" m* t0 Z c
#define upp_dma_sendstartQI(x) {\8 S4 n* B$ r: E" ]% B4 x
Wait_upp_SendReadyQI(x); \
7 _+ p& \" T9 U: ^& O upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
1 X0 I! v) O W2 c& t upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
( |1 n' e/ G! C1 q- p6 f upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
$ S! g6 x* |4 @5 I2 f9 b# g }5 L# R! Q+ D2 l" e- w
9 E2 p% K' a. v' P
! W+ }1 l% C/ i# O8 Z* D" n: R
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
+ c2 `1 Q& ?. M9 o5 S
1 W* Y3 r" ^2 ^% H* @! o$ w- \( i& p4 q# d0 q! x" s5 K
想知道uori错误是在什么情况下面出现的,好做出修改。
0 ?1 c- m: S/ G+ t( o" L1 a
9 B6 T3 I6 s! m9 Z4 L. A( I
' S7 ^- v2 H( V6 n& N |
|