|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?# G0 R5 d# V3 ^+ z. r& i3 W* L
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:( r2 o" F4 R) k% r1 f/ [
u32 UPP_Isr()
" Z* D6 q% W7 S( K+ b{! P+ m3 ?/ u! i' S* I# c
Uint32 intr_status = upp_reg_hdl->UPIER;5 I3 V* S: q) M
upp_reg_hdl->UPIER = intr_status;//clear
+ `1 h. A$ Q2 z! }: ?7 U// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
4 N& ]$ ]) Q3 | u32 ret=0;- t4 |# M" I: X& }" Y& o0 k
7 O. U2 g' o' J6 O D! c) h% p
// inline functions
- t8 J. [" X s+ | |, T" ]2 X5 f6 ] while (intr_status != 0), K% F' i9 J4 n M0 a
{
5 w4 q' s' G" L5 I if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
1 I. x/ N- U; r- {/ ]. @ {& f0 @- s0 h- H
// Log_print0(Diags_INFO,"eoli.\n");
+ X3 p+ G; V8 j B upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);' F! q0 f; p( g8 L) m: g5 F" `- r
}
- e7 o+ N+ {5 ]' W5 I2 a. ?+ q, S4 y2 n2 q! ?$ K D
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件8 s; U" M D1 u0 z- ?. P/ Z
{$ C, h& H" L, b- A( b
Log_print0(Diags_INFO,"eowi.\n");
5 x' w9 O8 ^3 l" s3 P upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);0 K% C& D0 o* Y0 p. e3 r$ t6 o4 m1 j
upp_interrupt_count++;$ l" {# Q. X. B1 w4 k9 q
upp_interrupt_eowi_count++;
+ E) _+ F! L4 r% T. m
0 f. `, {& W7 o+ u) R#if UPP_DIR_QI==0
& E4 a f5 r0 D, E upp_dma_receivestart();5 R8 K0 c9 T: e, Y `
ret=1;
. n- U# V ?$ {% K O#endif
# Q; p. ~( a( M) w# s }
/ h# |1 A+ ~; B ~' A4 @+ Y, A+ a' I8 K
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
. d: [0 u5 S0 W* Z- [1 q8 H7 T% s! v {7 r# U/ J' _, l$ Y, n, O0 B6 S
Log_print0(Diags_INFO,"erri.\n");
7 w/ K7 y7 K5 @& C# V upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);# Q! l/ ]* @) h5 @, @+ ]
upp_error_count++;
. ]7 h- ~' A# c2 M* Z }
0 r8 t6 N) V' S# r' ] v7 i
' B+ E/ b0 \; }* ~" y if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件6 u! H, J2 [5 @4 V+ h
{" N. N' a& Y& J6 k5 {1 Z3 ]# M! _$ u
Log_print0(Diags_INFO,"uori.\n");
% r2 U- `1 ?3 R8 G) M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);( Y, l4 j9 ~9 v0 m% X* N- K4 x) W
upp_error_count++;+ i& O7 O* d0 ]0 C, v" g
}$ }% s! ^% a7 g3 F
. q) C {# x. k
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
. t8 w5 r9 J0 \) p2 z( I5 c% g. l {
3 Z: `3 U/ @# k2 ? Log_print0(Diags_INFO,"dpei.\n");5 @( f" K7 ~) _: ~
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);. H9 R9 t n r5 y
upp_error_count++;
) q) k% P8 f+ ~5 o- Y0 ] }" H, \4 m; f: n. D
4 i. @$ i- i& N3 e
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
1 S$ q: D: }2 _+ w8 X6 k0 r {
: I7 p2 C/ ^+ c6 b// Log_print0(Diags_INFO,"eolq.\n");3 G# T5 \8 W! G5 [1 U+ _$ [
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK); j# x2 z7 i, [$ V3 Y8 K* A8 e
}# N7 ~. H3 [4 m: A# M/ O' b0 Z
, h7 Q7 O! I+ t1 E) N2 x& a0 C$ d if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)0 o! W* ~$ i8 O% a4 J
{+ e5 c, H7 W0 I5 W3 ?+ s
// Log_print0(Diags_INFO,"eowq.\n");% L! r- Y) ~4 k4 _3 Q6 }/ w" J( @
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
) {9 k' W6 n& R4 f2 u3 R upp_interrupt_count++;" p8 d9 E; U7 I4 S
#if UPP_DIR_QI==1
/ @. v% n$ Q, a+ B; h, E2 ^6 Y upp_dma_receivestart();
" t5 T8 U2 F8 b3 Q8 P) A7 _6 [! u8 A. b ret=1;! B3 v! A8 b% H! J4 }. L$ S
#endif
2 \8 `/ S5 j" [6 h9 W: i+ q0 u }- |% v. [5 i# ~' ?- U( r0 Q
# O i& s \0 Z0 j if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
7 h5 v* n' F: J, H+ \6 j5 N {
/ X/ |; C/ n- o Log_print0(Diags_INFO,"errq.\n");
" H" J7 _& g1 E6 o+ j+ a2 L, q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
2 p* ^! ^$ s. L5 r upp_error_count++;
9 g% G7 N" O: L- C. [ }
" l& @- i' G- G) D- x- |! g2 E) h; B# X1 z4 w! ? f
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
5 v A# y* v% o& z ] {2 f G5 x; l# Z
Log_print0(Diags_INFO,"uorq.\n");7 c0 W3 j* ]3 I3 h" H3 `$ h6 m
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);8 O8 q. n7 w+ q
upp_error_count++;
4 \* z) e8 F' E6 Y6 \ }" T% G6 B5 S* E1 v% `/ } l
2 z+ M1 q4 n' H) O3 t& P8 E
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
! q: y( Z& n, E# P8 l( X {
! B5 H* A% D( m" h$ p1 q, t% y. L; z Log_print0(Diags_INFO,"dpeq.\n");) W9 B# d* z* G5 r: o4 A" }
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);, y8 }" O# A, Z+ X7 n* f2 i+ D
upp_error_count++;+ H4 ?. a4 w* r1 }
}# k' F8 z# i! B4 P
% H" `/ e( e# j, f+ X& ?0 p U* C // make sure all interrupts are handled
' I7 Y$ K5 k' |, k/ g intr_status = upp_reg_hdl->UPIER;
% O% f0 r$ \$ K l5 g* l }
# K7 F) h0 s1 ^% u- f1 @' |; ^* @! | v$ Q; U
// finally: write 0 to EOI register
6 F4 M9 M: X4 o6 v# p upp_reg_hdl->UPEOI = 0;
5 f# Y3 C2 G$ m8 ` return ret;
% A r5 t7 R `; H2 F% e}
+ G; U5 `7 {+ K# T1 G) {dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
( Y5 a8 Z: e. y9 N#define upp_dma_sendstartQI(x) {\! V' E S3 H9 v7 q
Wait_upp_SendReadyQI(x); \' g" t% ]+ T. P! t- a( r
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
8 U8 U* U% u! _' J5 V upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \) a8 G3 q# W: e" ]6 b, }) z
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\1 Z' f9 H( M* P1 c# k9 }! x
} P7 Z# b1 r1 a! L# q! z6 L
( r' u- V3 O9 o' u7 N) b9 } j/ s" |7 M: |/ b# c
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
) q1 k" R/ o- s8 j6 {% U7 O& }3 k# V: x$ v% v
$ h/ f, w% f7 v2 m% W想知道uori错误是在什么情况下面出现的,好做出修改。
, d9 I- o( k- v: ~9 M
: R6 |5 V$ }9 \ P6 U
" Q$ k3 T8 l2 f1 V% l3 ^+ I; H/ v9 J6 z8 l |
|