|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
) y8 ?1 E8 c7 w3 b6 \1 o$ i' z. n& ydsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
% a& ~) R8 M% ~; O2 ~u32 UPP_Isr()
/ L) }: h2 w3 i" w1 v{
+ Z; n) t8 u. S4 {9 G1 D/ L' c! ? Uint32 intr_status = upp_reg_hdl->UPIER;
- O& ^6 Z3 p4 z! U, H t upp_reg_hdl->UPIER = intr_status;//clear
$ @+ \; I% y3 C- p8 j+ }* m# H' \* R5 k// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");( k' w4 ?& I. e3 h& B
u32 ret=0;- e9 [* u8 B, z3 h3 `1 O
8 u* j2 O8 Q Q4 Z // inline functions
# w! M# v9 p$ x! e) @ N while (intr_status != 0)
, V3 R: \/ o3 ? {3 n" U' i* T! E
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件7 z- v, B: u+ o' l# l+ D% f9 ^
{
% r# d( e" l" I. b! t// Log_print0(Diags_INFO,"eoli.\n");3 W1 X4 E. `) f$ ]1 c% Z! z: U! Q
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
& R1 n! V( B" P; ? }- |1 { I$ [& a: P( i# O) N; s9 @- ]
1 {& K1 I' O: t' j if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
5 I# S% M, o1 A; T, p5 J {6 u7 m3 A8 l/ ?1 c1 a* y
Log_print0(Diags_INFO,"eowi.\n");* Y2 N! s* F9 [! b
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);( [9 C& }3 l- @7 N9 [1 ?
upp_interrupt_count++;
- `% ~8 M4 P P+ {4 S( M upp_interrupt_eowi_count++;
6 B) D, z# z; v0 }1 s# @$ F2 E$ [3 J2 j, k6 j# Y/ n1 |; R
#if UPP_DIR_QI==0
( e d( e" z& n upp_dma_receivestart();
: v+ L. [, h n: }' n# r& T ret=1;$ r: i5 R% i! k. \. ^8 F
#endif7 o1 |6 r: k9 Z( h0 \
}8 o, n, w9 ]7 Q8 h
! S$ ?! m# P. B1 M- R6 H if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
: j) t: C; c, N {, [; {/ O8 A9 Z# V# d" |
Log_print0(Diags_INFO,"erri.\n");" ^ P4 o: h1 h: _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);2 \3 R/ u$ b2 J' F
upp_error_count++;
; `6 i% p( P2 v+ q7 l }7 J5 S& M* r6 V7 _( p# t8 Z# s
- O* t4 _* {# U+ x" |% ?
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
, Z. k8 _$ W. R+ s2 a' ?# ^& Q {0 M) l8 h) ^0 R0 p- ?! e: `
Log_print0(Diags_INFO,"uori.\n");* ]6 n3 a- T% s7 e! K* `
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
& [) z" I! p/ S+ q! R upp_error_count++;8 y2 q) }$ _+ t9 k! p
}
+ q; ?# t s0 k3 Q8 h
5 Y9 @7 k2 V3 Q; P; @! j if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
* c: ~( D# n0 y4 j. w/ |: s {+ m, T* z& n7 v6 W2 f" B
Log_print0(Diags_INFO,"dpei.\n");& b* | p% D! K/ p; ?1 Z: d# n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
{' Y" ~2 R6 Y4 D3 p$ y- y1 U/ C upp_error_count++;
5 R j& E9 ]. }7 x5 M5 _% `. I0 N }5 c6 ?( d; }9 \+ O
- C l3 h* k- f if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
( G9 |6 O+ D" B$ A: {" z4 S {/ ~/ K( Z4 O* x6 E9 Z" }8 }' F
// Log_print0(Diags_INFO,"eolq.\n");; M; A; d* J" ?9 ~' u- n
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
8 B! y+ p& S! V" O5 R& P }
6 r, W7 v: k7 G) w
8 o: P/ n+ j# i% W# R if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)* Z8 h2 y) p1 p, w! Y& x" h
{
9 x$ E0 c* \2 I* ` H// Log_print0(Diags_INFO,"eowq.\n");
% l) K& I; K J9 L; X+ `6 ?% X1 j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
( ~, l* `8 T0 x upp_interrupt_count++;& W( P7 [, S& C# A
#if UPP_DIR_QI==17 G) S/ g. [+ `2 Z$ I
upp_dma_receivestart();7 w$ X+ N$ G' q# X6 S5 m
ret=1;
, i. b6 c" [) S- a9 _; }- t- J#endif. H! n$ u$ p) D2 Z% @
}+ v) B: Y9 B4 U8 e
, Q x7 ]' N, G3 E
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK); r F# {( `& D+ y$ |( Z: x
{$ x3 u. f' P$ H0 N% o3 T
Log_print0(Diags_INFO,"errq.\n");
( B; S' t; l+ U3 k upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
, F' V; Z4 G+ u upp_error_count++;6 o7 U! }2 k! D' ?, `0 R3 F! W5 ^
}# ?- \; g6 y( m. h7 J& N
1 ^ }9 Q" c' v, d! a
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)+ ~+ K( ~2 N( k3 _
{
% M1 H7 n# O: m Log_print0(Diags_INFO,"uorq.\n");$ U0 \1 g6 D5 t% v6 k2 f$ _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
1 k* U: F9 Z' ?9 v# z upp_error_count++;0 n4 U5 p- x5 Y/ D
}+ _* @$ o: _# X. ?' P( z
: y8 z, Q1 s8 Z if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
7 G. P! W& R, Q: w4 S; d5 C( `- z3 c$ P& \ {
; k% `8 {$ z0 f( u Log_print0(Diags_INFO,"dpeq.\n");, W) w; {* z. W) ]1 Z' i
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);# Y$ j. g+ \; C, e q
upp_error_count++;
e0 T7 y' K0 K' L" ~; O }9 b% b) |8 s; R4 T& `3 k3 B
3 N3 c8 J! u0 h9 Z // make sure all interrupts are handled& v% u2 d2 s- Z" V& E" @* m
intr_status = upp_reg_hdl->UPIER;! v) ^( s8 p$ }8 q9 l
}. o; |; w( a7 f/ D& u7 n
2 E. ]7 S* `# Y! }# t. R
// finally: write 0 to EOI register4 W1 w7 d8 Y4 d k, U4 c o8 }( j
upp_reg_hdl->UPEOI = 0;
# P4 K- q! F. R$ d' x# C) @; r4 e return ret;- N& A7 W0 [) L. v9 `8 U7 g7 a% Y
}4 E" N: t7 i$ ~: Z. ~, s9 E
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
) B+ W( U" V4 c- x#define upp_dma_sendstartQI(x) {\& W' c$ t) C6 {# n1 {, C' C7 q% n) F
Wait_upp_SendReadyQI(x); \( u7 u. `' F! f6 b* i/ e4 x) p
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
3 C5 `! d$ O$ I7 T) o4 f upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \8 f. }9 a; L9 |3 t5 [, n
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
* S0 |$ y: r) _! o9 J) e$ O( F }- K% M% s5 U$ f8 t! x
$ y6 A2 Z' O9 l. {8 k( m4 L. R
( Q$ D- l* z& U% ?2 z0 n2 F/ Q#define upp_dma_sendstart() upp_dma_sendstartQI(I)
( n4 N: q5 ]- S. i6 {5 i
- s- g0 \0 _/ T6 i
* B7 Z: s3 U, A5 ]* J- C/ P' D0 R& e想知道uori错误是在什么情况下面出现的,好做出修改。
2 t8 \4 Q$ C+ t( K9 P3 H7 T% L1 W
; y2 n+ A8 L* n* h" a# w+ n |
|