|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
+ ~' k" F) H O }. Vdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
% m& a* J+ v* e- t, h C5 }1 ]6 m2 Cu32 UPP_Isr()6 T0 P8 R3 H/ [2 @) s0 L9 {& W
{& C3 i7 ~! |; x9 Y. {. Z, f
Uint32 intr_status = upp_reg_hdl->UPIER;* j1 r5 l' g9 S7 ? ^, S
upp_reg_hdl->UPIER = intr_status;//clear0 V C2 h" g5 Q+ o, k( { ~
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
2 o& I! S& G: C9 ~5 M6 G* ~ u32 ret=0;7 `# X8 a& y1 O. B* [( [
; y; t. b# [& Y4 h* J5 J8 Y
// inline functions9 ^: I( E- [5 X9 }6 R% b+ N
while (intr_status != 0)$ J2 X G0 A; ?5 i
{
' X: m# t' R& K' ~. F$ ?% O6 S6 A if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
" W0 g5 [2 ]4 B: C6 k% ]7 j% C {5 Z2 D7 V( }# b9 K, @) M, ?
// Log_print0(Diags_INFO,"eoli.\n");
6 Z: ^7 { Y7 B& i& X' t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);( ]% M, J8 \0 t/ p( Q+ ]- H
}- A3 W( T% [5 _, r* }
; ~. Z. x) v" }3 g7 L if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
; R0 B2 o2 Q/ Z q& U9 X {; h2 ~, R5 Q( Y0 h' b* l
Log_print0(Diags_INFO,"eowi.\n");
! P& c+ P! ^( v5 X* ^, M upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK); \# d& c4 i0 t6 D
upp_interrupt_count++;+ p3 W2 J# K. w
upp_interrupt_eowi_count++;9 y* \: N: x6 ?3 ~6 K+ l+ m
# T. I% s' Z6 b/ l3 A- u7 m: m( |5 t3 F( W) _#if UPP_DIR_QI==0& e. x& w' q1 y6 c
upp_dma_receivestart();! i( \. W8 F, I' Z5 M
ret=1;
/ r; m5 D4 O U* x+ c; Z#endif
7 b3 F' z8 z3 w9 P9 z$ E& O }
! G- f: T5 ^1 q& P: D+ J6 f* P' I% D& s T" p
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件9 O4 C6 h2 Q4 w0 q" ^
{
0 a$ |9 O+ T+ q6 o0 A Log_print0(Diags_INFO,"erri.\n");# E4 @5 h! H; R/ B3 W: o* w
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);3 O8 N2 i. r/ N8 ~3 g
upp_error_count++;
9 ]% z h( k& M0 k4 _$ G! w# w }
Z6 `; c5 c5 \. S6 g# A6 M4 w" h3 V& S) @& B; x! o9 U
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件: ^6 x( {* Y3 J
{
5 Y7 M( T) _* ~- ~ Log_print0(Diags_INFO,"uori.\n"); ?2 \' w1 |) {- A$ l% Z* R
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);3 c' b- v# {3 {
upp_error_count++;
* W6 C2 J( U' ]# f. c- M }
, z$ i. B7 R: g: g n3 t
( u, C% X4 V. G; u+ Q- \/ K! W if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件- t3 Y& k% i2 b5 n# T
{' O$ u4 q6 C7 \# s# ?& |
Log_print0(Diags_INFO,"dpei.\n");5 B; @) ?; ?# F5 G
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
; Y& [# S; r( l& d+ H @: ^8 K+ s) ]/ B upp_error_count++;
" C. T& }& _* u }2 q( Q! k; N! a9 `
`! ]! P c$ |, M9 p. O) T3 a' R if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
" }* n( z2 s8 f! ^# r {, n2 U9 ?- R& R' w9 w
// Log_print0(Diags_INFO,"eolq.\n");
' t" x- f& q* b8 z" j/ @ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);% Q' K1 B9 k1 N) ?# K5 N
}
- {% M. Z- ]# i4 _7 j+ n4 G/ N ] Q, I; B
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)$ m6 v$ |1 @0 h/ o8 w9 J
{ e! G/ H3 r h9 E" r( n
// Log_print0(Diags_INFO,"eowq.\n");1 b2 G3 H6 Z9 S$ L
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
' A$ ]' c# J% P/ `" k/ @, F upp_interrupt_count++;3 a' L; n: U, B W
#if UPP_DIR_QI==1
. o' K; k2 g, T0 E7 v8 a3 F) M' h, i" t upp_dma_receivestart();. |2 U1 B$ J; `9 l
ret=1;
7 Q, ~0 X7 c$ v' Q- a0 V#endif) a0 K# n. T6 @: ^' n: f( z
}9 q" W! w; l. q3 P9 h
7 k, ~, K( r2 }' K3 Z' F0 \
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)4 E Z8 g" ?* H$ n
{
5 ]& e0 Z' q2 W. W9 S& |) j, K/ P Log_print0(Diags_INFO,"errq.\n");: R5 T; i$ q$ d/ S
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
& @1 B& s4 }' w F+ } upp_error_count++;# `1 Q, Y; c# P' D1 L
}1 i: E6 H9 W) l) Y' r7 X" ~) n0 Z# g
( m1 C8 `- ]; y
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)& r, V- I! b3 r8 f" y
{ ~3 R5 O! ?! J2 |
Log_print0(Diags_INFO,"uorq.\n");
) P6 a0 A3 F/ i' S, K upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
8 U2 z2 D# M* ]( o- o9 N0 c& W" R upp_error_count++;5 C; [2 _2 E& Z% j1 L8 S
}- [- c S6 v: m* M
/ a6 m( _! B# N+ c if (intr_status & CSL_UPP_UPISR_DPEQ_MASK) G. u L5 Z8 ?
{0 J8 n& K2 X* ~) Z
Log_print0(Diags_INFO,"dpeq.\n");& a) I& |9 V7 K4 t: p
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
1 @/ F! V. r1 N* E& |; C upp_error_count++;
& P0 c3 F9 N( |& I% J m }/ I' \1 U6 [- S
( s. f' o( }$ Q! V
// make sure all interrupts are handled3 ^. ` x* \- B! ^! i( P. ]4 p
intr_status = upp_reg_hdl->UPIER;) W" U- j# Z8 f+ g
}
0 c6 { K! n; { h. d
2 a) i6 N$ ~9 D' E // finally: write 0 to EOI register
2 v( n3 [* P" k. _) w9 u upp_reg_hdl->UPEOI = 0;7 [' }& g6 q0 h0 `
return ret;
( s2 ~( t: D# C' d8 w; Q) n}5 f! K# Z5 I; h( L) j
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):9 \: [. }+ m- u! ^! c" v8 ^
#define upp_dma_sendstartQI(x) {\5 ~( V' B: _8 L% i; B0 W
Wait_upp_SendReadyQI(x); \
* |6 H9 a$ {& p: j8 w3 E. b upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \# D. Q l* q4 [: t0 j% u2 e2 z- {1 z
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
, W* L4 i7 J' [- e upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\- T0 B O2 v, ^8 r. K
}
4 X, d# _6 Y! X- s. j2 `- G! k* Y$ Y, R
8 B# _* y6 k# m: ]1 S" Z+ V#define upp_dma_sendstart() upp_dma_sendstartQI(I) c: z' r% g' _
0 w, L" N8 R; t
. f; f; u0 M3 \想知道uori错误是在什么情况下面出现的,好做出修改。* s M; w; I$ q3 |( d+ O
. z2 h8 I! u% E: x
2 w7 Y( `" C! c; M |
|