|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
( f7 G7 i( @) g9 s# y% X6 ^5 udsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
2 m7 C1 E5 ~+ H7 j6 d1 s2 n+ L/ D9 n, tu32 UPP_Isr()3 ~7 K8 q4 M3 O! Y. Q% y
{
- b6 a" d3 A$ [ `+ A- |- k Uint32 intr_status = upp_reg_hdl->UPIER;7 P! r g: {( I$ `- y' u0 ]- @5 i
upp_reg_hdl->UPIER = intr_status;//clear
# c0 K6 J b f' J& }// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");+ V9 M: |2 g& Q- V/ D
u32 ret=0;) h+ R5 i# i. A6 m' q$ ]; O
/ M$ v* S1 u- K1 v! x9 i, X2 F1 M, j
// inline functions$ A6 _% e: [* {2 R5 `3 S: Y
while (intr_status != 0)) e* y# Z: P6 z7 G5 M
{
0 q$ C8 K6 k* {8 \ if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件% M# d2 ~/ _: D) A
{6 V6 K. p! a6 c/ C) {! L
// Log_print0(Diags_INFO,"eoli.\n");
4 u2 r+ o5 X( I! }4 L+ E2 } upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);$ ~0 f2 u/ b9 c, l, ]; G
}2 I, P( b$ h, B7 e
! F/ m0 D5 l: \
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件+ g( p( |8 ^5 ^! w6 X
{
& w t# H6 g% q& ], }# ~1 W$ x2 e. z Log_print0(Diags_INFO,"eowi.\n");
& t( e) J6 r* S% q7 n8 N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);* e' Q. q/ V! ~8 ^, M/ N
upp_interrupt_count++;, p9 B3 s! {; K a* @. s- j
upp_interrupt_eowi_count++;( W& t( i' K% s( P7 Q/ @
7 [/ g1 I: t. n+ `
#if UPP_DIR_QI==0
- j. y# p3 q1 K* G3 B1 @6 U; Y5 R: K1 \ upp_dma_receivestart();& N# X1 U0 T! h4 D" U2 i
ret=1;3 f' ?; E0 X" V4 y; Q r
#endif
* P/ B9 o Y6 D! ^ }$ {% q; L' B& V: X1 s9 g
a, ~6 i) D5 w if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件 e, G/ i- e" F' s
{7 K2 K( |) c, I2 u$ q5 o" y2 S
Log_print0(Diags_INFO,"erri.\n");. h8 s* v9 J2 w, s2 U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);1 y& i/ F5 m% n/ H
upp_error_count++;
/ ^* Y7 R) C$ X5 H8 y K) d4 d }% D, A) \. p* U: ]
% c" u% c7 d4 i ^% ?$ p) e if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
3 g( h$ Q1 d. P1 D% |' T1 U* @+ _$ h {5 M7 E; h m ?( W4 r
Log_print0(Diags_INFO,"uori.\n");
2 J" } i1 E5 J) {8 @8 H% n upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
" ~; X$ o- O4 j, U% B5 h4 G upp_error_count++;1 v5 R# o) I; M
}' G6 t4 A2 W* u* \6 a1 x
& s" j, x1 u4 r: n6 `. o* H
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
1 f8 k; B' k7 C0 S {& }# x. b. W9 [1 R
Log_print0(Diags_INFO,"dpei.\n");- V( x8 t$ Z" L5 m2 B
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
% L {6 s3 v' j' |9 H- ]- B upp_error_count++;
+ L: `. l. O/ Z) w7 y }# ~; z+ V7 Y5 [2 ?7 D) q/ r
( @8 ?4 p: U$ ]/ g0 G5 {7 q; t7 Q if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
2 w1 U3 E! Y$ y7 R( H$ k" t {
5 r7 J% C: r: O; M. U+ ^# Z// Log_print0(Diags_INFO,"eolq.\n");
0 q9 o8 o- S' ^' j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
& _" A3 k7 |; r b) g- v2 w }
1 M6 y( J! K+ L; A5 c$ N2 k5 S- U' u
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
- u, @3 A/ k: J2 J* T {
5 }# x, n3 r0 L# z$ n// Log_print0(Diags_INFO,"eowq.\n");
, G/ O# \, V6 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);6 z7 ^0 U1 E; D! H. N1 F# v2 L6 X+ q
upp_interrupt_count++;
0 Z+ o4 m8 w% v. ^#if UPP_DIR_QI==1
8 e \+ `' r- E* w' U upp_dma_receivestart();# f1 T' f0 \& W, g# G( o" p& R
ret=1;
2 l1 l7 G: r3 ^8 k4 V7 R#endif
! ^$ K# y. w3 ^$ `% l! L. C' k: @ }; J. P% @% [: @5 U+ S
$ M. i4 h$ {- D! L( L; r if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)* ~1 a" u& t# M8 f: ?9 Y: j2 K; h
{
+ G; W; H- Z0 p/ p Log_print0(Diags_INFO,"errq.\n");
* ?) o8 V& T$ L) |7 ] upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);1 i6 [7 s: h" r* S" E
upp_error_count++;8 R% m- b6 d. Y, c! d
}
' j n5 W: X% b- S, E
Z0 e( O ~, H4 Q& ~ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)3 M: P7 O$ y( p& N/ V Q- [6 s
{/ B% K# x5 Z" r, N, ~
Log_print0(Diags_INFO,"uorq.\n"); E. T4 m$ i+ W# q3 c; n1 t% l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);3 ~4 p: K/ w- Q( `/ u
upp_error_count++;
% I7 k) s/ C4 z( o; ?( ? }6 V0 m% D O% G. N' i
" x' e: s" o6 L3 A
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)9 T) |2 Z* O+ c3 n) W; f
{" o1 \7 N x6 `
Log_print0(Diags_INFO,"dpeq.\n");: j9 d5 l$ R" ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, V# K8 d h, o# Y9 @5 P Q3 V7 L
upp_error_count++;
& w; v( [" x7 ~2 o& N7 I }# n3 f- S7 O$ J4 D, G1 `% e( D
3 Z& d; ?& S& `2 X // make sure all interrupts are handled
0 R: H, `4 M3 O' J$ c0 f intr_status = upp_reg_hdl->UPIER;
9 V" p8 w6 }9 T n0 U# f: i4 i }% `, U2 }8 k& U( g8 r$ d* X
3 s2 o' C8 P8 G# Z. i$ d
// finally: write 0 to EOI register
|3 b2 p B8 X" b$ n/ `: K# U upp_reg_hdl->UPEOI = 0;, \) s5 P- R. R( O9 j* r7 D b. n
return ret;. j" e, s& t& @
}3 r, \; Y7 ]% R) u9 G
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
* | q# T0 q5 P' R#define upp_dma_sendstartQI(x) {\
2 u/ J- \# k$ L# Q% k7 Y Wait_upp_SendReadyQI(x); \
4 ]3 K! R' `- J7 M3 f upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \( G: o, E) Q0 Y; A4 X
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \4 B7 p' S5 m5 s) x$ i+ r6 J5 }# A: ]
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\: Y0 ?+ P) r, ^, D: a5 Q- x5 f+ x
}
( ]% ]* U2 |) Y. e8 ^
$ W8 K7 D6 _+ n& N0 n+ \% h' I1 Q+ L: T/ k* O. a
#define upp_dma_sendstart() upp_dma_sendstartQI(I)4 I& P0 j. Q% w1 \4 W7 z6 b
$ n6 H1 ?& U# [) N9 J$ t
" S1 x# g, H: ^1 V- S" p想知道uori错误是在什么情况下面出现的,好做出修改。. q8 z- q( p4 k! `, q9 G: [- s, {
) B; Q0 Z5 R5 } X8 e/ L4 c4 _$ l) K+ A8 p
$ J2 P4 ]9 P3 A$ E# Y3 l
|
|