|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
$ @2 m4 b8 a! Pdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
8 P3 H* p/ t& V7 F9 `0 au32 UPP_Isr()
" \* D: t! r. o: p" l5 Y$ f{
- q. I! p0 D; X% _5 O+ h Uint32 intr_status = upp_reg_hdl->UPIER;5 e0 n; p' z5 S; i" w- h) R
upp_reg_hdl->UPIER = intr_status;//clear
# _& Z2 j+ j, F$ d// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:"); Z" V, N" x. M" P# N( s
u32 ret=0;' r% b: _. G1 K9 [( o0 a
: C7 y& X1 k* M9 i; S
// inline functions
! K- j# o ]4 }" M0 p/ Y while (intr_status != 0)
6 o3 y: U- [3 |* k' Q6 w {2 M$ u/ K* O9 \. R! x( L) i0 y% A. L
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件( @6 G4 l. f$ y% \, D+ u# y
{8 D( ?; n7 ~3 |2 L& G) e. S
// Log_print0(Diags_INFO,"eoli.\n");
) W% e: B0 Y# N/ [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
% B, L+ `( f6 {6 @- i9 c) E }% g0 g2 ^8 K9 j3 ]6 B% {( O
2 D+ |8 ?5 V3 M' `. j! G% ] if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
. r1 C' E( t V* C# _4 V( Y) O {* R) n# `8 v$ J: o) E. P, Q
Log_print0(Diags_INFO,"eowi.\n");
2 M* G6 z1 h8 i7 h# ^, N upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
2 V! Q! w4 c4 n upp_interrupt_count++; L: ?1 c( F7 H7 j0 O$ W
upp_interrupt_eowi_count++;
9 `' B2 _ s2 K7 r7 e0 P& C" ]* M) F
#if UPP_DIR_QI==0
+ U5 }# G2 Y2 m4 s upp_dma_receivestart();
# G" R. j. B6 r% ? x ret=1;# J" s2 }" ^/ ]( }/ T' R X
#endif
2 \- Q6 S" l y R9 P9 K }
/ V" t9 Y; T- H) y4 J2 y
4 Y5 n3 Z1 {# n* \; H if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
' r5 R4 a, R8 _1 T( O' D7 r {" X( O9 D$ G7 ]9 J8 |
Log_print0(Diags_INFO,"erri.\n");
" b L. b! }* V6 g5 g I+ R6 \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
2 F* v; u; X3 U) ?/ } upp_error_count++;: [) v! S% b o0 Q3 e+ k8 H: ?( f
}% x: }- A7 g1 y( l9 Q9 m$ U3 ~! I
2 F; f8 B- i) v3 A if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
0 a, F) ^# [ R/ v4 @ {5 j) [& {) E: ~2 {. ~1 W
Log_print0(Diags_INFO,"uori.\n");
7 [" R2 O* `4 c8 u upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
# H3 I I& T7 i" x' | upp_error_count++;
$ A4 F) \* u' g3 S) p }
* A: i) L7 u* K- T1 S3 l
2 m. |6 o p/ N. e; K- E9 ^- f) Z" X if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件: o0 k. n3 w* `3 @
{
& i8 E2 O- c0 J) k0 N Log_print0(Diags_INFO,"dpei.\n");% \0 b* e9 V! A* P( A4 _% P7 w$ S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
: }3 V# R$ C2 L( Q. R+ k- b upp_error_count++;3 I. `% U( w8 ~( b
}: F; E' z) ~& K1 O! Q4 J
& x' {. |; @: A" R+ P* f5 V
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)4 [* |! u) ~) P% r+ v4 l- g0 V5 Y
{
) e% |; z, m4 x+ r% A$ D* |// Log_print0(Diags_INFO,"eolq.\n");2 \# E; R* [* Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
9 G' M4 \5 ?9 l4 w7 \ }) \7 U6 z# @8 Z6 e& i
- u K' ^8 R0 _% {4 O2 C2 e3 Q
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
! } W: h; x' P1 D {1 h* O: e/ N! P! J' v
// Log_print0(Diags_INFO,"eowq.\n");
" b6 }4 X; D% `" N8 w+ x6 c# D upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);+ U. q+ B! a2 J |4 _
upp_interrupt_count++;
0 [; y3 N- p/ S0 \3 ?8 O* l5 u#if UPP_DIR_QI==13 F/ Z$ i" S- |* _
upp_dma_receivestart();
- m+ |8 M, s' Z ret=1;+ K7 u o5 s% C5 b
#endif
$ \" Q" S3 y4 I8 P }0 f& V' ~& U+ y* n* K
. H; Z: I- w# N) v& P
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
. {& C. s/ y3 ~5 N {" p) V1 m+ @2 M3 L) m
Log_print0(Diags_INFO,"errq.\n");* G- v5 H) \, E
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);% F d Z6 ^7 |$ B' ?# `2 ~: }
upp_error_count++;/ b; T5 ?0 W7 A% m
}) M+ q: b+ q3 ~5 [2 F# x: O6 _7 f
2 F0 S% j: w7 K/ d' w9 t) M
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
- Y# [- z% v: \0 q) y$ \ {# J l8 U0 |0 U1 J) z$ I7 ~
Log_print0(Diags_INFO,"uorq.\n");" U: V% e* `8 p. F$ G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);5 F+ n: ?2 t3 W6 p$ x" {; O
upp_error_count++;, \" G+ {; O! a& B: X: G! K" X
}
8 B/ A7 ~; _6 B3 [; X
! K, Q4 Y' M2 U2 A9 P5 P8 H if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
4 Y% w- W7 h: A2 w {
~. N0 U0 Z3 ?* {7 o- h Log_print0(Diags_INFO,"dpeq.\n");
; Z/ e, Z. B2 H; c( H9 J upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
- D* D x. l# R: Y7 `* c upp_error_count++;
5 v+ w5 Q3 [ d0 ` }
% ~1 M0 A& P' V) D+ N6 ^
5 N7 Z7 m; g$ p7 w4 ] // make sure all interrupts are handled V/ ~1 ^+ O- P: Y) r
intr_status = upp_reg_hdl->UPIER;' Z; v$ |1 F( g+ U7 h
}
, b$ u/ m3 A O6 l
$ e6 N0 m, j- L; C& H9 r$ m7 p // finally: write 0 to EOI register* A0 B: M3 Z8 B I; W3 [; S8 e' n
upp_reg_hdl->UPEOI = 0;, o2 V, p3 L' f0 {
return ret;
$ {' j& m2 R( Y% l}+ N0 t8 x# B9 L% p2 o
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
! g" g! Z5 u. ~7 g3 R" `#define upp_dma_sendstartQI(x) {\
. R& _4 h: G' C Wait_upp_SendReadyQI(x); \0 b: a/ k' Z! V" c! ]/ x/ T0 l* A9 l, Y
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \3 _) X$ P: H1 ^$ x. l7 t- t C1 j
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \- S" A2 P$ p. Z
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
5 R2 X Q: n4 G3 ~3 h7 G) ` }6 E% v- ~3 T7 z: _
% Y$ Z% ~) z, O2 R& E6 H0 l ], f n9 W3 B3 [% A, j* W! ~9 T9 V
#define upp_dma_sendstart() upp_dma_sendstartQI(I)# K1 z, E5 `# ]' p9 L
$ e% G6 n0 P% }$ t. q9 ~
" s1 L* t1 y, C. u" R' G: p想知道uori错误是在什么情况下面出现的,好做出修改。
; f+ b' N" G7 X8 X1 V5 L& `
9 N2 c0 x& V4 R. Q6 A/ e- f) t% x, G/ R7 L$ S, Z
|
|