|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
; P- c7 f) X% }7 p; r0 c, r$ ldsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
* Y, D- ^& H) X# `; g7 h% f' Y9 su32 UPP_Isr()4 x" q k3 V% r2 o% i
{
/ ?1 n) {: E* _) f: s& ~& u6 s* T Uint32 intr_status = upp_reg_hdl->UPIER;
1 I0 Z/ w! n7 H# {$ t s upp_reg_hdl->UPIER = intr_status;//clear) C8 Q' ^' {2 b8 X
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");& y* K0 o! i( B# e
u32 ret=0;4 e V1 q$ _: J, L r: _9 O
: V, a; C7 }9 d0 ~
// inline functions5 q! Y+ m, |5 a5 z6 ]7 H9 d" L
while (intr_status != 0)
O! A1 r" f5 b( o {$ O+ c6 c* ]) j+ E3 n
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
* i7 b: c) r; Y- _7 e+ F {
. m1 u6 d* H8 i% i# ]// Log_print0(Diags_INFO,"eoli.\n");8 E, C4 E$ G% r) l' i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
" \; ^, ~5 E9 i1 d3 S }
4 U2 G" n3 o' a# |
/ o# \$ }- j% i6 g$ k3 T if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件; `& D" H: c7 v$ p; `; k+ j
{
# d( R7 Z; j9 L' f Log_print0(Diags_INFO,"eowi.\n");
, w- A! W6 O1 l3 q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
8 T: x8 [. h! R, s E upp_interrupt_count++;' g; ?1 [0 v& r |* P
upp_interrupt_eowi_count++;
7 g, Q$ U5 D( V$ h; A, c1 K$ S( t& R& D$ J6 k9 X7 k5 T
#if UPP_DIR_QI==0
. R! F e9 N/ W" T upp_dma_receivestart();9 ~7 j9 c; U6 ]6 N
ret=1;: i2 t- [* w3 g0 z9 L. E4 Y( ?0 D
#endif
+ `+ Z, b. c, G. r }
/ @% Y- Y, T _: N z7 U7 e0 O
( G4 U" s/ |' @: _) V- t% Y0 T if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件, |# S! E0 A0 L: J
{
# H' F2 X) ?: y+ s9 H- X Log_print0(Diags_INFO,"erri.\n");/ ~$ @( n+ |6 ?/ D# O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);( D% b- Q, W8 G# c6 q
upp_error_count++; t+ Y; \- p6 s k' z
}6 e0 X; U5 f- @3 s0 s/ m0 m, c5 ~
, \# J) O8 f( w5 i% W v
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
9 L: {2 E* `1 x4 h1 d" {. s {
0 b2 M9 a/ o* P+ R/ d, o, x6 U. d& ] Log_print0(Diags_INFO,"uori.\n");
/ j1 A/ |& K! X; c9 x/ @) r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);2 U2 O9 s. N) V, q5 n1 e/ G* {
upp_error_count++;$ H. B! f. d: K/ G
}
2 K9 v) t3 T5 a: f
6 i" _- [- c* X/ \8 E7 R& S, B, D if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件0 F9 m( ]0 Y6 v0 Q6 u
{
" C) a& U$ I# t: L1 @ Log_print0(Diags_INFO,"dpei.\n");* A1 K1 W9 \ ]
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);- O% v e7 V [" v
upp_error_count++;: f/ ^7 Q2 i/ U$ z" _2 x) p
}
6 H" k) r' u) w% _5 S1 D7 E; i! N x! Y' g I
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
) P8 l8 `, L8 L' t3 B- } {- A" ?, _3 W8 x
// Log_print0(Diags_INFO,"eolq.\n");
0 Z- w( F4 S1 c# Y, E, r upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK); F& J0 H7 u: A, p: a2 k: S6 N
}
0 l8 ]* X6 \% Z5 Z% u& L! s4 n$ M, G0 s9 P+ J) K7 s# p
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
/ X/ }7 G5 {' p2 ? {3 R! L3 Q t; c% Y/ a0 S g
// Log_print0(Diags_INFO,"eowq.\n");: x: G8 z9 C; X+ U5 Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);4 U0 M2 ^+ @/ |5 C* S% f5 c) e
upp_interrupt_count++;; ?0 O% B+ X* M2 D/ p
#if UPP_DIR_QI==1- ^' x/ E% g. \1 f3 ]( ?8 Z4 j
upp_dma_receivestart();0 D6 p0 _9 g" h& c) A7 \8 Y
ret=1;. M9 Q5 G2 {- Q7 ?' M9 G4 U
#endif* Q# Z( K0 x/ b
}' u* i" T ?) K* l* T. L& j" M3 J
! O7 S: n6 \% k! _% g8 j
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
6 V& a. x3 E8 A8 J0 z {! t7 R8 \9 i1 r; j* R( }7 P8 T
Log_print0(Diags_INFO,"errq.\n");
- s" ?: o5 d1 X- Y# @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);0 y. Q% M7 `" l2 q
upp_error_count++;
) w4 F- _8 U8 w1 g' B }! N5 W; Q- c; O3 F8 Q
4 J3 V0 n* @# n. j, @8 a# t
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
2 y! d( K' i4 e2 i {
) Y) b1 h& p( f' k3 C Log_print0(Diags_INFO,"uorq.\n");
5 U& V- ^1 @% k# B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK); d+ @" G, D5 s' F' o
upp_error_count++;
& b* n6 t# e3 d( c" \; I2 d: X- v }: @/ }7 }6 B* M* b A
8 r- i( A. T. q ~ `+ W1 [
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
6 E" h+ m% ~3 P6 _- ]1 q4 S {
- A7 _4 k% J' R) T' D5 q; i9 U7 B Log_print0(Diags_INFO,"dpeq.\n");
/ I. L8 X8 v. s9 G$ M3 U9 B9 I upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
1 y+ E8 m6 O" [6 N8 u9 | upp_error_count++;
( V& C2 x3 y; R% ?, A& ?' ? }* e7 f) w. D# Y7 W* B3 S1 \$ ~+ [) F
& w) S9 D: [, p9 B* ?7 ^8 \/ h" j // make sure all interrupts are handled
# O" x: I2 o3 G2 N intr_status = upp_reg_hdl->UPIER;" G- D3 ^4 n, L( F4 \" P" L9 ?
}4 A* p3 A1 ~+ A, p0 Y8 R: d
' O* j- a+ k$ f' ^
// finally: write 0 to EOI register5 X+ H& s6 i& P6 {& H' R% @' ^
upp_reg_hdl->UPEOI = 0;
8 y3 C9 u" p& B return ret;
; C, C* G7 g# @& Q}! o8 ~. Q" u0 Z' @! N/ E
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
0 L; _ N v" g8 O( v' U#define upp_dma_sendstartQI(x) {\1 H: q. E! Q0 O8 v: l! j- x; `+ A
Wait_upp_SendReadyQI(x); \7 \0 i* w2 | }# C8 y
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
# {3 `9 R6 r/ a2 r- I upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \; J8 _2 J7 u0 j6 S4 I. h; H
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
8 X& C \: x; m5 ~6 ^ }- P+ d; q$ h' ?, [9 }1 j9 w- k
6 Y6 \2 v: B+ ]% l
: E$ Q5 t" V# P. S#define upp_dma_sendstart() upp_dma_sendstartQI(I)$ o9 v6 x2 a1 c; _; s* I0 p
9 z- r0 Q, Y' _7 R+ p) F S( \6 n0 U; M! S# E& b" L6 [# n
想知道uori错误是在什么情况下面出现的,好做出修改。
1 k, ?+ U) a6 S1 ?
' b' P: p5 L1 J
6 z' q9 { G/ U" U7 X |
|