|
|
FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?+ h4 X5 _+ z) |+ g+ |
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
4 Y0 P0 ~' d5 @u32 UPP_Isr()
+ B* Q9 T8 [5 X; Y{6 I$ B. s5 w/ W, `
Uint32 intr_status = upp_reg_hdl->UPIER;- p1 d7 ]& n/ s% |% m
upp_reg_hdl->UPIER = intr_status;//clear
8 p! D. ]% l, u; a9 I// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
! d% _4 W1 k6 {1 ~- O7 y u32 ret=0;
4 b0 v( V" | H5 s# C7 W' z8 e; E) m; K4 F! S# {. o& o
// inline functions
7 @: d" i1 E* n* ?0 L: s" y* l while (intr_status != 0)
7 Z6 q8 e, g- Z- g, b: m b {0 m, k! N. a1 B7 M. w
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件. l4 _! ^. g8 c; N2 C5 P. ?
{7 L& u9 T& Q9 I; ~) g6 K
// Log_print0(Diags_INFO,"eoli.\n");
& Y% L; m V# y0 E upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
+ N4 B" d3 V, s0 U }
4 G3 W8 h+ m' ]- ?1 P% R
6 K$ n& Z e. ?3 y! W L if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
4 {: c% n$ Q* k {) h: P: f( b/ {* V2 E8 H0 B% z
Log_print0(Diags_INFO,"eowi.\n");$ d, c {) H. n% q, ^
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);8 M5 m; {& B3 n1 t$ _: o8 G
upp_interrupt_count++;
* D. ~9 N# F4 D6 n3 ~* f% \- d upp_interrupt_eowi_count++;+ n+ I0 Z! s" c7 o) ?+ `
1 b1 l# O2 z' G. ^& y
#if UPP_DIR_QI==0
% A# Z- I) {4 u9 z" ]% i/ b% ^# a upp_dma_receivestart();
# Y* J! m' n! n+ n) R8 p9 r* { ret=1;4 c1 @: q# v. Z' U. z' W
#endif
* g7 a0 c) B6 ~7 u) m6 N& O }' l: e- _4 r4 B) k
l: }7 c% f1 E8 |1 F+ R if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
5 W M4 j5 a6 }8 m9 s {
' K( o- \5 _. O9 T$ x& \ Log_print0(Diags_INFO,"erri.\n");
/ }3 Y9 @ ]& D8 | upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);, `2 ?, y) b+ ]% Z4 _
upp_error_count++;
6 S n/ C+ O+ s }
" s3 h/ v% H9 v' @# z4 N4 T7 r% u5 z) |4 a. D9 R
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
2 o, l" W0 \( {& |7 | {1 S. h2 }( k6 ]$ v$ p
Log_print0(Diags_INFO,"uori.\n");
4 `& B# ~7 ^+ p( ^$ C upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);* I" E( a' h8 B. R
upp_error_count++;$ ]! L- q8 ]8 H \8 \' ?/ o
}# V% z$ ?) `! E( g/ R/ L
* v: D+ U1 ~. o3 N/ @ if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件" _$ }5 @( R7 {. `
{4 s: F2 u# p. y
Log_print0(Diags_INFO,"dpei.\n");4 v2 o( I1 w5 {3 G) V
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);" s d9 X2 `% L' t7 S) N
upp_error_count++;
; F, m& r$ I& r* ?; n) Q/ @% E }
0 X7 [( C6 ^' q- ]1 h+ K# z6 \/ _; }
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
3 r4 E" B0 u0 Z' g& a {8 `- @& s2 e" i. [
// Log_print0(Diags_INFO,"eolq.\n");
% {7 r9 E/ C7 I/ v1 z% D: t upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);# r1 x7 }6 r3 I9 p
}
( c3 O9 s2 R' H* E; g" J9 m" z% |: g4 J
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
/ D8 M- `4 n" [ {" Z# M$ Z: {! |: ], t7 X; f
// Log_print0(Diags_INFO,"eowq.\n");
6 X3 }4 d0 l- }. [ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
$ _- J; ^" }5 S3 q8 s/ e upp_interrupt_count++;( ]( c+ s0 c; _2 z- v3 T) S
#if UPP_DIR_QI==1
2 E6 }% v3 g' C upp_dma_receivestart();
7 k2 }) A$ [. i! O; P ret=1;2 u7 X: M* Q. g4 t& Z
#endif' S9 h' W# f$ f
}
2 h2 ? a/ b( k% b2 ?3 }
! J/ Y- B; w1 q. R7 P if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
6 k' R3 d# i. ?+ q' r3 Q" j {; E8 _0 V3 Z( j. `, ]% N
Log_print0(Diags_INFO,"errq.\n");
; b8 }4 }# O$ b5 e7 X+ O: ~ upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);* A- ~1 g; r5 z& \0 ?& }: h' h
upp_error_count++;' d4 g* g \7 ` V/ u. }, S
}# w( I! \; J1 S/ u3 g8 N8 J
7 y5 z( Q2 m7 ~$ V; i7 v' [ if (intr_status & CSL_UPP_UPISR_UORQ_MASK)7 b5 X7 k# C+ `& g0 B+ \+ o& M( ~
{
: Y' \4 ^0 n' t: J2 j. {, | Log_print0(Diags_INFO,"uorq.\n");
9 g& K4 o2 |5 }' F2 h upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
) g. F) L% L) f( k( i$ f- I) s x upp_error_count++;; A, i6 H) s- @: {; O, V2 l9 [
}
+ ~4 t$ z7 J' f% A" D, Z1 {
* g" o6 u! H0 v- Q0 E if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
) W) m8 g; t& I- A {% d/ \! S" ]4 t5 n! T7 B5 A
Log_print0(Diags_INFO,"dpeq.\n");% h+ Z7 k* |" G8 y" z# f7 {3 j! \
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
2 s. L8 _, E% S- {4 S0 _7 ^ upp_error_count++;
1 W' s* d6 i. v* p9 x% P }& O1 H' b4 j+ w1 U- {" c
/ ], Z0 s- p' [* j" l; `7 K // make sure all interrupts are handled
5 O7 `0 q$ B. A intr_status = upp_reg_hdl->UPIER;
' P8 F6 w1 {9 J' u }$ A; \ }
6 H7 B* w U- ^1 L% }7 U+ v" B5 i ]! x
// finally: write 0 to EOI register" h% q- G0 |; g. U: F& x
upp_reg_hdl->UPEOI = 0;/ `6 |) x; Z* s# D* @. ~
return ret;
2 ~- n! V' [0 r. c9 |9 V5 Y}* d- _2 k/ l2 b& \4 w
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
& e2 i( _6 f# M: S1 r5 \6 \: a#define upp_dma_sendstartQI(x) {\
: n8 D) @" a3 Z, @# z' e( h Wait_upp_SendReadyQI(x); \
7 N5 X2 I% ?# N } upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \- L w( A7 U, ?
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \8 W$ m+ t7 _7 K- ^- K; B0 I
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\8 x0 w7 _8 C8 J w- t. Y
}6 m$ d9 ]+ Y& v
o& }& p, V8 F2 K- [/ X" f* W) i% I$ |& j/ L6 B/ l3 A- Q9 X
#define upp_dma_sendstart() upp_dma_sendstartQI(I)# r! [2 w G% U
; n0 u$ H, \$ l5 k; z! h' g1 n
/ \$ C, z3 U) n6 Q$ ^% Y& r& u% k( u; u E想知道uori错误是在什么情况下面出现的,好做出修改。
/ \4 r; v6 [/ J' V+ E4 C. V/ F4 V( h& |$ P5 M/ f) O3 i! ]) V+ R
# V- D" ~+ m8 a |
|