|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?& ~( U* |# I# q, m! q+ e
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
5 t* A; e, ^. \; w( K- vu32 UPP_Isr()
6 O% I# |$ x, C{; h' s- E# h$ u5 c2 U& N! i& R
Uint32 intr_status = upp_reg_hdl->UPIER;
* n; D/ p3 I+ u ? upp_reg_hdl->UPIER = intr_status;//clear$ z' s3 r% T( X! S; x' A# O
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
& [& ^2 \" H$ \1 t- K! S" c# Q u32 ret=0;) k/ e. a4 ~. x( X* H' ^* q
& t. j) H: Y0 p; V6 v // inline functions
) ~! }7 f& ?5 |1 c while (intr_status != 0)" ~2 n4 k' b- c9 B' {. F5 {
{5 j) m& [0 p! L* Z! f! |6 P
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
" D( n9 f2 _( l8 D1 V6 y1 m- | { m. @# P, P: l# l0 I
// Log_print0(Diags_INFO,"eoli.\n");
3 a* y5 \" Z1 ]) j# X" \ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
( C8 r" v) j" R& \+ P3 O; w3 i }" x( _( c* r R) W
# R- C9 n% g1 m2 q if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件( C) g* G: ~) D* }6 p7 q6 m, ~
{
2 P) w# W$ l2 K Log_print0(Diags_INFO,"eowi.\n");1 D [* y- c5 X6 R/ ?
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);( i8 O9 D1 ~9 T
upp_interrupt_count++;
9 W9 e8 X. o* i5 n: U L2 f% } upp_interrupt_eowi_count++;8 k; ~( Y$ p( j1 j) k/ @
' S4 L o6 B. t#if UPP_DIR_QI==0$ y( @0 s$ | a* B% m
upp_dma_receivestart();
# z3 P) x! n6 c4 p4 x. Q ret=1;* A K/ y- b% g( N7 U5 _" y
#endif( Y) K' i E/ l! h' Z
}
U9 |5 C4 T2 P$ q1 w X+ L$ z3 P! w7 H1 p3 f8 U- W; S% |" R' z
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
* l* G7 Z( s. m# h {
' C- u7 R- T: [3 s- `- L' B Log_print0(Diags_INFO,"erri.\n");0 |$ A; ]3 B' R, O4 y% p3 H
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);* e- [+ ]( @& Y; ~" n8 [
upp_error_count++;
: \1 Z% m* o( s }$ Z( e1 w5 n7 o+ a* j( a( }- [
0 W) j7 R' W- K W. ~
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
4 Y6 o! W4 X0 T2 @: h3 ] B {. H) n) v, Y8 ~4 o4 G8 n
Log_print0(Diags_INFO,"uori.\n");
+ n# ^- _# g' N# d+ v upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);( W% u* [- U' A/ `7 i% p
upp_error_count++;, z5 T4 z* P$ ~) q8 Z' O' E+ H
}
' t$ {2 s+ M" X5 O; S5 ~6 S( Z, Z" u
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件; P7 e; w" v n S2 j
{
; g6 d! g4 m+ L" c Log_print0(Diags_INFO,"dpei.\n");
0 M5 u) B' }" c9 B( T# Q5 J5 y upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
0 f9 T& ?. s5 b' }6 @2 O upp_error_count++;* a' M7 n; p& l$ F p( A j
}
; J# S2 @6 a2 a2 B) B6 o6 Y/ u* b% z4 b
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
- X+ O e. D/ K9 ]* s {
# O9 y2 w1 x0 h! d+ C: |// Log_print0(Diags_INFO,"eolq.\n");
0 |& ?+ Y0 a5 I3 n" h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
. s5 N% a' p+ d L }
( ~6 M; T# ^* u3 d. m. `$ q& K3 Z* z3 E; f# }4 H% D
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
. B& |3 F. H. ?$ ?" S" E+ G6 S {
7 X: W/ y r. p6 l, Y6 H// Log_print0(Diags_INFO,"eowq.\n"); p, C6 M2 e8 r
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
( [! |( V7 F; K. K& X upp_interrupt_count++;
3 A& V o5 e% T' q* d- Y; D/ k#if UPP_DIR_QI==1: O# C: g! a/ f( Q% l
upp_dma_receivestart(); @; B# Q( O5 S4 z8 K% ^
ret=1;
, S# ^0 P) D0 [' I* G9 y: E#endif
( a% Y4 W+ f; E) b9 w0 ?3 U. I }
7 V# G+ e4 \9 }' j: W H0 S- d: I! P1 `% Z6 L
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)' j) @9 P( G3 W
{
+ O/ @) b H. {. ?1 p4 C Log_print0(Diags_INFO,"errq.\n");
* f7 d8 G0 K: T$ d! ` upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);3 U1 o. T) ~* |) r
upp_error_count++;9 w" A7 q- j, d. ]$ O! h' o
}
* G( [; b9 Y& b8 _; ?* ]3 A& v/ k5 L# p: i' F
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)5 v- Y3 t: r+ a/ o0 B$ ^
{" ?3 d. z, G) z
Log_print0(Diags_INFO,"uorq.\n");
, i4 ?7 Z/ W. U( F upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
4 S6 N- k- u4 d. f6 H" y) Z upp_error_count++;/ ?* R( W3 _6 K+ f
}
- b: ~- y8 Z2 x: S! @' L/ ]! ~( S
+ Z- L! y1 `/ v* N I; l6 ?/ s if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)% H- g& B5 m: Y5 E/ M; Q
{
# | `0 {) n/ A$ X% } Log_print0(Diags_INFO,"dpeq.\n");1 p" N- N$ }" A
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);' p; F+ E% I7 u
upp_error_count++; ^ j' E/ m+ Z9 \+ d
}
# s9 n4 l9 c- p0 h/ b2 o% s
b' R' D/ I3 M( u9 B" ^# K // make sure all interrupts are handled9 J" v" S% Q% f4 ~( c# J2 k
intr_status = upp_reg_hdl->UPIER;
9 w: E* S0 f6 [5 Y. {, m }( R; y- y5 N ^7 h
/ H, j0 L/ w5 g3 Z& ], U- @
// finally: write 0 to EOI register
/ ~2 B' b' S9 l2 x$ j0 D upp_reg_hdl->UPEOI = 0;
+ z0 B7 q$ w. I' o! ?8 d, B- } return ret;
0 i0 L" g6 u8 A4 s}
9 m+ _( @$ f9 y3 L G- C$ idsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):+ s1 |, x; m! l0 y1 a# N) P
#define upp_dma_sendstartQI(x) {\
: W; o1 l0 M3 M- | Wait_upp_SendReadyQI(x); \" s- {8 J$ }/ E6 S; n" `
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \) W% b8 J6 H4 H0 K! Z2 ~
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \: Z- [- A7 R- d2 ^
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\& d. e! l, p0 s1 b2 b* I% W2 G
}
! T* Q5 l' F, W: p% D3 H2 }6 _0 r5 \& K; e5 M
& M+ L' B, Y V0 P2 k#define upp_dma_sendstart() upp_dma_sendstartQI(I)
7 ~: J/ M( K* W. @( Z" l8 U5 r, U/ ~4 E8 @1 O' {
) |6 Z K( z, z; ?. k( l
想知道uori错误是在什么情况下面出现的,好做出修改。
6 A) W3 B) q* I# ~( f8 A5 ]8 l: m, M2 c5 Y2 }8 ` i8 @( n
4 _; M! U$ L$ x: W |
|