|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
* [" u' O: J8 Q! j) Fdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
4 H2 D: h: U5 l3 yu32 UPP_Isr()
- F6 Y5 v7 q3 |( u{: h& o7 V- n! F, s/ y$ x
Uint32 intr_status = upp_reg_hdl->UPIER;9 T7 ]- a- p. ^ l. Y
upp_reg_hdl->UPIER = intr_status;//clear( L) A( o( I. ?7 {
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
; l' ]- P. Y; x! K' |0 W u32 ret=0;
7 b8 b# i' E9 i5 y* b3 s# ?' n% P2 k, X8 E
// inline functions0 ^ ^. r- y% H$ e. n
while (intr_status != 0)
( q3 T5 \) m! t8 D, l1 D, W {! k9 r; v5 R0 ~7 f. u) ]+ S
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
' O6 m6 g: e1 s: [5 o( c {
1 c3 H- L, d9 u* Z7 Z0 R1 }// Log_print0(Diags_INFO,"eoli.\n");
$ z6 l0 J( B7 B" ]- s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
. _- r2 K6 N Z1 Q }
& J7 z Z$ y- ~/ p3 L9 x
4 l/ j; e' Q4 \4 P+ u if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
# [; R8 Z# H0 j" @# K9 G" _( M {
% _1 F# {& q. g9 [4 g/ ~ Log_print0(Diags_INFO,"eowi.\n");
4 J; T4 E' y2 Y9 b upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);5 G4 B2 v% Z7 H1 f+ ^& u* Y1 p
upp_interrupt_count++;, N- @7 C% {' P% O: p, b$ @8 P" L
upp_interrupt_eowi_count++;
6 K& g9 X5 [' J. x$ x) a9 a9 G% w% g( x8 ^. f
#if UPP_DIR_QI==0
* l7 \1 H w5 A2 w/ x upp_dma_receivestart();2 ^# a& P8 _* U6 w$ w
ret=1;
3 P n( u2 F, C#endif( T! a* f$ w9 H8 A; K. j. y& u
}
, H" \7 y2 H0 g0 ?% `4 I1 I, f$ J7 G1 T& M. ~; D9 m1 w$ M
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
: ~% h- Z6 T) S {
, \/ D2 r4 e7 \+ P# z Log_print0(Diags_INFO,"erri.\n");
( K" c$ z D. ?% _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
, K5 |' N2 B0 K6 h upp_error_count++;
/ ~* y2 K& |; E0 ~8 r }$ U& O2 [- t. m. o2 N8 Z' _7 a
" P* d% ?8 m1 r/ ^; C* T6 V
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件# l% G0 O$ t3 j5 u/ i5 w
{8 F% U4 C9 t- I; i5 q4 a' {
Log_print0(Diags_INFO,"uori.\n");
9 a6 u ~6 L6 |4 L5 s upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);) u( B" I' @9 D) c. q/ O% o) _
upp_error_count++;
_, ~; t! x1 A }7 G0 V8 U7 [. l! j3 Q2 m0 m0 W
& B3 c" I; [2 ~4 D. d5 T3 { m
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件) u9 h! g3 H$ m5 L0 O% N3 o7 }; E
{
+ t0 J3 @- y! L, x& M; J Log_print0(Diags_INFO,"dpei.\n"); `" j4 Q5 ?& A, U# [* m: |! Q) R, i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);! _+ o. @! c+ V2 p) g7 E2 i
upp_error_count++;* j- Y( j' f- ^8 ?0 C C
}' j3 C3 N' I1 |0 W. w% d
2 h7 b1 r1 p8 w$ s8 n; v0 x/ J if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
& @$ d1 U# F9 w7 ?! z4 R! \# J { o( S2 G% P3 M5 e/ S }
// Log_print0(Diags_INFO,"eolq.\n");. D. C/ y# ~8 t9 M" j
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);; N2 e# h6 r3 h# h C. A& @( @
}* }) n6 t" w# V! S+ j
2 |( Q+ J+ ~& r; F
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
2 B! O' R9 J/ l6 S0 k) o1 F {8 \# s! l. { m! F: p. l) w6 B2 E$ O
// Log_print0(Diags_INFO,"eowq.\n");
4 q! V8 I% h+ G e/ K. q0 @6 D8 G upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);% o! U9 S& e6 _, m! u4 ^
upp_interrupt_count++;
' [3 x2 ]' w) y, K% y" k7 c#if UPP_DIR_QI==1
4 b6 z0 }% \- E" o' I' o# A6 O upp_dma_receivestart();
4 \5 j7 [6 r C0 u- W% o& D ret=1;
. U' W" E' o8 {#endif% _8 c# U* N) r& E( U
}; K% G. c% S E
- q/ n# ~- j# g! Z G$ o2 Z2 c if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)3 w, a( c# g- ]/ }2 D) V4 |+ n9 O
{
6 V, d' ~/ w* |( V4 ?& \% P, s Log_print0(Diags_INFO,"errq.\n");1 {" `( e8 {8 Q' s- o- U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);* z$ F& t5 ~( O! v! F9 ~& {
upp_error_count++;8 f0 ?2 r2 C; M6 U" W
}" e" @0 X) w3 k$ l7 u( J
1 J e. t+ d4 w6 O, m if (intr_status & CSL_UPP_UPISR_UORQ_MASK)3 i; N7 o( v" x; q8 }- P
{
5 H1 ~9 \$ e% Z Log_print0(Diags_INFO,"uorq.\n");
3 ]/ T1 e: P0 R ? upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);+ A" c2 n$ L2 M: {' Q& `
upp_error_count++;
9 j# Y8 l3 s# M3 i5 Z! { }
4 ` j0 `9 D7 Y" m3 r5 {
[: U3 ]7 |& y' K( O if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
1 }: y; P& }1 D {3 W7 C5 v6 T h
Log_print0(Diags_INFO,"dpeq.\n");% T" O. }0 F# y4 g1 N& O
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);3 n4 f0 P6 M) I& G: ?6 c; w
upp_error_count++;
3 z+ u7 f3 j( R/ C }; ], P) |) L% h5 B
6 Z2 ^/ @: S1 f9 r; c7 X' a; e // make sure all interrupts are handled% Z6 }9 ^3 J6 e/ L% O& B
intr_status = upp_reg_hdl->UPIER;
7 M5 v$ H0 G" d3 } }! v* D/ P+ V0 ?; V6 n
( E/ d0 L7 L3 O1 b) e. q+ v // finally: write 0 to EOI register' s1 D7 K* O3 \% B1 x( J& _
upp_reg_hdl->UPEOI = 0;
3 a: n. z* ?/ [5 P7 K6 c return ret;9 X" y* q6 T5 m) I5 k* e
}: s+ [4 h. ]* ?) _
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
0 F& E/ K J; U% q l, c# b& V/ X#define upp_dma_sendstartQI(x) {\
" F. @! z0 d6 S7 n+ ? Wait_upp_SendReadyQI(x); \
6 q6 [8 Y4 l7 j; j5 t9 P1 Y upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \ w7 x2 f, J: y
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \; ^" l. v% ~4 ^6 f1 `1 W1 ^
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
8 p3 B& z- G! T- X+ c }. _) M6 ~4 x# l: D! [( H- M
$ N5 @7 ^+ R# G0 W6 d. ^% [
9 |0 K, q M3 w- C$ }4 A1 F#define upp_dma_sendstart() upp_dma_sendstartQI(I)
5 I" z0 M: o$ x$ c" X! @: j
2 _: u, x. `& K& q
, \2 E* P/ l2 e. z( O7 Y" ?想知道uori错误是在什么情况下面出现的,好做出修改。
4 v0 M9 z6 x2 x0 ` k% j. N, l. }# V+ T0 r) ?1 T1 U& m) Y2 E
. K/ z2 [$ j+ T3 }5 ^! E
|
|