|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
& \ G% _' A ~1 Fdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
+ C/ m7 n2 b; e, ou32 UPP_Isr()
' J |( [! T5 }2 B% N{. o/ h, S- _; W/ |: s
Uint32 intr_status = upp_reg_hdl->UPIER;
+ e1 Q4 n. K4 L2 \8 ~5 L upp_reg_hdl->UPIER = intr_status;//clear) M& _3 i0 V/ f( V) X/ z2 v: Z
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
! s: z8 A% g# O4 Z+ \3 H5 N u32 ret=0;
x# ?/ K" b) N" U( X% v$ m9 b
+ X: }+ h, f+ Y1 d" w // inline functions6 {" `- r6 I( I2 a# c
while (intr_status != 0)2 T3 ~" P, N5 |4 h& u( o, p
{0 O e- h& @+ G! `* J
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件2 U8 p) b8 ?. H5 X1 n) {7 M" j( N0 T
{0 u2 k) \7 \7 N: e
// Log_print0(Diags_INFO,"eoli.\n");
3 r& y+ p" `: \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
2 r9 J0 I d, C0 w, A# W2 ^7 \ }* K/ B3 S+ _, r% e. Q
0 q$ j6 M Q$ j$ D& i: c
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
& X4 j; D6 U! X3 V4 L, S) w {" b# s+ H, z- n1 [; L) `
Log_print0(Diags_INFO,"eowi.\n");9 b' g. C) @1 S7 r' ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);0 c+ v) D) \! k
upp_interrupt_count++;
1 h8 k+ f2 G8 `, I; f. x7 ?6 \6 t upp_interrupt_eowi_count++;
$ N$ j% u9 M/ O; ~' Z
; N6 e. `) d! ^5 i1 x#if UPP_DIR_QI==0
: u9 Q% ~% g* [$ H7 _ upp_dma_receivestart();
1 h# h! r( w; _. y ret=1;. o9 \3 W9 M6 G, b2 W% Q
#endif6 B* Z+ p: t) F3 y
}5 d" t7 P( ]/ x
: p M5 F1 X- I" V% o
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
+ ^' z( v3 S" o+ |# X# \ {
% y* S: G9 Q5 _$ b! m) g( x Log_print0(Diags_INFO,"erri.\n");! p1 U: \( f1 F2 S5 X
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
% [+ r* F+ e; F0 ^ upp_error_count++;& \9 X; P9 j2 d2 }1 R+ ]/ }
}3 G& g9 ]! d$ `
& G2 `+ k8 v, J& H- E
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
& E2 Z" |+ C1 H: M8 h: F {
( Y+ |) b, V" [! V Log_print0(Diags_INFO,"uori.\n");
3 V4 G1 G9 C$ G+ }( v. P' ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
1 b' E1 h% f4 U+ d9 L6 s9 E upp_error_count++;
# W. p" D' F, d }
. E0 K( p! E: R6 \; V" R. ]2 X5 W
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
" `7 \9 @4 B/ ? {9 M0 d1 b! e9 a$ {" H
Log_print0(Diags_INFO,"dpei.\n");( d6 r: p1 Q" h* T% g8 |8 K/ \+ {
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK); @, z2 ~& S8 z
upp_error_count++;7 o0 T$ z+ D' ]6 \0 ]; e. _/ }
}
& K+ g$ y4 T" g
& ~( @; f2 G8 E, I if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
2 h9 z8 M, T1 b2 |4 n {; W# a% m4 A" ~( j, j
// Log_print0(Diags_INFO,"eolq.\n");
. I; U! B5 U6 Y; t/ O& h" F" p upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);/ V; D( m1 j0 K+ m9 E; A
}7 A6 v8 M0 Z+ x$ o6 @- W9 F6 S
- W, }. F! y6 L P% g( x
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
, I ~1 {) h+ q0 D& A4 V {( Y9 P# w/ t6 F/ j
// Log_print0(Diags_INFO,"eowq.\n");
: G1 m4 D; P/ c; U9 Z2 T1 N# Z upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);& y! P( [2 ]( j& l$ N
upp_interrupt_count++;7 K9 k, P$ y) h8 n
#if UPP_DIR_QI==1. K; l6 `; A0 t! D
upp_dma_receivestart();
9 K5 x: [ D0 v z8 F& d0 C ret=1;7 ^4 H4 ~) ]0 j& o
#endif
& U3 @! S) t" m/ ^ }' a; ?" d/ R( ]9 ]% g; }: x( x
7 T" K9 i9 A& q) [+ G } e. ^2 y if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)6 e( L: Q9 d0 T+ U( \0 Z* v0 T
{
9 z# S# [+ X X5 O" X6 ` Log_print0(Diags_INFO,"errq.\n");1 W+ I/ j- T0 B$ o7 F" {
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
5 u' L6 X6 G% @7 B upp_error_count++;
. `1 V) H* b( i" d( Z }- E$ T6 c8 Y S) r$ f# I2 K& k1 T
( z5 l2 J1 {4 `6 w/ ^3 ^
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
, p. T; }$ W* d9 D* e {
& P7 M+ I8 D. F! _3 j; r Log_print0(Diags_INFO,"uorq.\n");
: H" ?! k" F' b1 k5 d upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);1 U4 J0 [3 F _
upp_error_count++;
3 N: }3 {, [" r$ p1 r% s* E P0 V T }8 o- b. _+ ]8 j
: [5 w- S* V, L+ O9 d7 Q" }
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
\ Y" a; p7 T; F5 B {+ p. Z [+ q% y: X/ t! ]4 V" U2 m1 o/ h
Log_print0(Diags_INFO,"dpeq.\n");! H/ @4 K( _3 }+ |3 n0 m" l# A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
5 @! W" S" E' {/ O- a. g: V upp_error_count++;% V) c [# L( M* E6 Q+ B
}7 \2 y3 }# y1 \7 [9 {, D! W; o
( l% N1 Q* [) U* t( c C // make sure all interrupts are handled$ o' z) x) W# ]
intr_status = upp_reg_hdl->UPIER;
6 G: _% G; d: D }8 x* l! _# v; S7 {- D m8 x
; K# A6 c0 g& m G, f // finally: write 0 to EOI register) }* Q. O. W( g/ f+ l, y
upp_reg_hdl->UPEOI = 0;
+ w1 n- p) i* ?& M$ K return ret;
# l5 I) j9 X7 e. n8 w( O5 ~}3 @& D0 P3 \8 t; |% C1 |
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):9 Y% Y) g) L5 A+ u6 N9 \, }$ _
#define upp_dma_sendstartQI(x) {\
7 `4 W/ C4 W& v+ Z+ @7 [" g Wait_upp_SendReadyQI(x); \" x* ?4 S. Z2 o, b& t$ S
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \5 { n" A4 G( z7 D' T9 n
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
W: Z# {3 a7 g- d( Z: q: ? upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\+ }0 P r; `0 l5 w
}+ w" z# w2 k2 f4 H2 w
6 W! T3 b w3 i/ h& g: w5 a
5 |9 U3 e" u8 H: Z
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
+ @( p' v: {9 F% z9 H( w
; K. Z8 b# k, c' ?2 {9 ]2 c' ?
5 ^" ^: Z3 g- a n. S: m想知道uori错误是在什么情况下面出现的,好做出修改。
( S! Z/ r& _) S7 u2 N9 {7 ]! y; j% F( i; `9 A) m9 A! _
% X0 B3 C ~$ W X' f) X3 @1 q+ z8 ?2 N
|
|