|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
( D3 e1 F" D! {; Z" j* W) kdsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:! V" [0 q" W0 d+ _1 x$ ^ v
u32 UPP_Isr()- J+ c; O, H! Z
{% L7 S1 ^2 b0 ~) c
Uint32 intr_status = upp_reg_hdl->UPIER;/ e' m; r$ ]6 }
upp_reg_hdl->UPIER = intr_status;//clear
* P6 o* S3 y' \# O x// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
# p N V7 F% \/ Q& \& }2 m6 v5 f u32 ret=0;
. _% [- h/ {2 N9 Y
) r, ]9 t: Z5 r. @8 w P // inline functions
- F. n' v: h+ b+ L8 i while (intr_status != 0)' a6 Z) W; t# ]9 p, ~. r
{9 ^$ I& T6 y$ ~6 ?; o
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件) S+ s6 `8 y7 q l1 A# j
{
1 J" |8 ^5 O5 Z9 H1 s// Log_print0(Diags_INFO,"eoli.\n");
3 F! h, b" B: j upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
9 s+ F ]; Q+ I# N* Y }
5 J/ Y" B& V, r' _+ T& C% ]- _# N* f# ?4 x% ]
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
0 A! R6 H4 n- t4 Q3 o {
4 b6 c* e" E8 b8 y9 h Log_print0(Diags_INFO,"eowi.\n");/ |4 ]( @) U+ C! I4 Z
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
, t) _+ Q9 G9 E# {5 n' E upp_interrupt_count++;
! h3 X7 |$ R8 P4 y T! E9 R4 H upp_interrupt_eowi_count++;
' e- @ B( l& R5 @: t" D' @+ x
4 @/ W# J. t' J* J( ^8 |' }0 o6 t#if UPP_DIR_QI==0
2 b6 E0 p: e% |% W( v+ k. b5 C upp_dma_receivestart();' b2 {1 w2 z3 u. p% o
ret=1;) k8 |& k; m' M5 e* G
#endif
$ v" | I4 R3 D* j }- K5 y; \$ V0 F% g& u+ z
_% Q: p3 p" x9 S3 i if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件+ \6 N) m7 w' u
{
( G9 M$ W3 {- m+ Z Log_print0(Diags_INFO,"erri.\n");
# T/ d. q$ i* \! h5 ]# P' | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);. ^; ?: _2 o; g9 M+ O
upp_error_count++;
& ]) U# B# g# f: D. s! l }
) ~3 b; ^* p' B8 k# q( r$ W6 C8 Q- ]) `5 ?/ ^! `
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
% z, ]& f: Q: h$ e {
! v# \+ ?3 ~/ L' c Log_print0(Diags_INFO,"uori.\n");
7 C6 H. R/ D- f9 R: f+ L+ f B' B( _ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);( K6 M. u0 l+ C, l, i; z
upp_error_count++;
. ]" |, n" _# D4 i) f w( U: Z }( k$ Q' S. e4 u. N) {
2 K9 _' {; T9 Q8 t( t& \, l0 ]+ I if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
& W- _$ ]" c; y0 p {
) f9 @# e. t3 V+ H6 g' [% W) m Log_print0(Diags_INFO,"dpei.\n");; W" g* x3 Y1 R0 t" _
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);* s* E7 M2 @2 Q8 z3 L
upp_error_count++;
+ f8 ?4 N \* w- V }& `+ F2 C1 T* l% n/ ?2 m9 @
3 D# ?* n4 ^5 I: e% M. h. r if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)# x& Q5 G8 l) |0 f* P" D. C8 u
{
' ]6 t$ r" A, N% Y3 D3 q' q// Log_print0(Diags_INFO,"eolq.\n");6 y8 l: u% W# R0 ?' S# G5 w* k
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
, c, }% I4 h' c+ c" S4 K }* [% v- u- O: c2 \4 ^' l$ r
) h& S7 s; j6 b) G& y w5 v% [ if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
! y+ h- j5 Z2 c z {
) B; d, ?- [; s! Y, h* D// Log_print0(Diags_INFO,"eowq.\n");' a& z# W9 b1 l7 x V l
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);- P! A/ N+ O7 d- \6 u k+ Q
upp_interrupt_count++;9 s* q( S/ D) A' I$ d( E, d
#if UPP_DIR_QI==1
- a, k* X: i5 t/ B9 v6 l3 S upp_dma_receivestart();* K0 m& `' z% K* L0 d2 ^
ret=1;
1 y/ H7 W7 Z6 q( {; r' X#endif$ x. ?' |: @" W/ e) E4 o8 s
}5 Z" X$ B0 I, S! n/ K
8 [8 G; S; o ]9 M' n* ^5 c4 Z- \
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
; V0 S$ A5 u/ b* E$ y {2 y& l( P) H+ e$ T" o
Log_print0(Diags_INFO,"errq.\n");
, B1 Q* x! Y1 Z( N0 o9 E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
% J! m. S+ z& v* U0 w2 D o9 m upp_error_count++;9 R# B, [4 R) j" m! A1 e
}1 H9 M: h2 X2 |8 w# i! I
- X2 K e) l( A! P if (intr_status & CSL_UPP_UPISR_UORQ_MASK)) S! `) F: b7 B
{
1 ?( t6 {5 k2 s5 s. z1 p4 Z/ y Log_print0(Diags_INFO,"uorq.\n");5 z, k' C8 Q. D( n" v0 M- U
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
8 X' Z( x1 r0 H" W) I; }- D upp_error_count++;( P4 |3 g# L- |) w! j% ^, S9 g6 z+ q
}3 A. v. q" @$ l% m
" u( E& y- X4 F- a/ T/ C
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
% g! n, |( s( g5 H s w {
. e7 i& N+ L f( a Log_print0(Diags_INFO,"dpeq.\n");
e. y! j7 l6 k( `) g4 Q upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
& y- h5 N) t- Q5 e5 w upp_error_count++;, R% m) k3 S" r) f2 K: Y2 M
}1 r5 \ h0 a3 _ _3 A g
1 s- x. ]$ u4 @& ?: k. j
// make sure all interrupts are handled% M0 w# K2 B2 _5 O
intr_status = upp_reg_hdl->UPIER;7 d3 k/ o# r' |; k
}/ F, v3 [ t% b g: Y
! ?1 q- S/ @. u // finally: write 0 to EOI register
# Q, Z! \% S. n9 V/ S. H upp_reg_hdl->UPEOI = 0;
a% k' k& u$ E7 s! G6 h3 j return ret;
0 P! ?8 B$ z* K% A0 C}0 y: [" d/ a J5 Z# [
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):6 C6 `" o/ z7 f# P! @. }1 n9 u+ L
#define upp_dma_sendstartQI(x) {\
0 S0 h2 F. \' q* L4 p0 L& K# g Wait_upp_SendReadyQI(x); \
- \$ T$ R, I* Q; W% _ upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
0 t* ]3 f" ~+ U. V# r3 \( [1 q upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
8 ~4 T3 [. o. D( A F upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\$ Z* b: b+ U, H& y
}6 d3 A% c6 t/ m3 h1 B0 V+ Y M
. u8 ^) A% L2 ]: L/ B2 j+ ?3 `( K
' ]( w; n' w/ w+ r9 a9 q0 ^. h5 N. ?
#define upp_dma_sendstart() upp_dma_sendstartQI(I)% s' R& p7 ^) {* s3 D
, u+ d1 m, A. I8 p: v
^' ?) Q0 E; @3 \( S! c0 O想知道uori错误是在什么情况下面出现的,好做出修改。
2 |0 q: o7 U, L& s- S4 C( q# n3 \( v8 k) z8 n$ U1 \: }
" u0 g e5 A4 s7 B |
|