嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 Z0 ^7 H3 {6 B& G6 n
#define PING_PONG_ACNT 1
8 Z* U! G( x. s( |: a( N
#define PING_PONG_BCNT 8*32*40
/ k) U8 z* i6 Q1 ~
//#define PING_PONG_BCNT 1
( w. r0 ]. ?, k( q, M* d: P
#define PING_PONG_CCNT 1
+ v" e& M e; K9 F4 j
#define MCASP_BASEADDR 0x01D00000
! B3 {0 R7 ^3 b9 e: ?( k- D
#define Mcasp_RXEVENTQUE (0u)
) K" V. }0 U- y& p# B8 e" {: |1 N8 T& ?
1 m) t. l; y8 r' {5 O9 X" W
/* OPT Field specific defines */
2 a: e3 A0 P2 b. D4 Q1 \/ P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( N- ~! @# ?' H: {- t
#define OPT_TCC_MASK (0x0003F000u)
; D; i: u8 j7 Z- v
#define OPT_TCC_SHIFT (0x0000000Cu)
( C) Z x! S. W+ a7 f
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. C4 `: P2 `' j
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 e$ w* r; Y6 f& d" W
( b# b% [! S: M5 `& s2 T
char ping_buffer[PING_PONG_BCNT];
: X( O2 Z$ E: O9 P2 Z
char pong_buffer[PING_PONG_BCNT];
& p$ E- j4 p& n' [% g, P
+ `2 S5 C8 Q) q6 N: z% Y
) M; N& i. T( X& p& d5 o; j
5 ^4 Z" c6 z+ S ?7 T0 q. g2 k
6 [0 h) G( @+ f' @ a8 O
static void ys_edma3_init()
1 Y* Y$ U& b' A1 h
{
I5 N4 M# v P2 b
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 A6 ^6 c' ~" B8 L; D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* W1 U) i, V7 P: X
EDMA3_DRV_Handle hEdma;
% c/ \; G) l9 v# I* H" y, {0 k
uint32_t chId = 0;
- c" w# H/ X+ _6 j+ \6 J- T0 A
uint32_t tcc = 0;
- f2 C4 f+ k. o7 y
% L+ I k! X8 l2 F( t
print2arm("edma3 driver init...",0);
% D1 X" e% d9 w$ ]* W; {
9 P& I$ E& g7 ~2 r% G7 @
hEdma = edma3init(0,&result);
$ H3 s! {. S1 U! G9 T
if(hEdma)
' s$ A/ U; J7 f
{
3 l y* `# X! H4 R3 P0 G% g, m8 W
print2arm("edma3init() Passed.",0);
2 _% I" e' v# s6 h5 W; H
}
- |& c: l# Q! w$ ? ?5 j0 s6 {2 G
else
. \0 u1 Y/ Z8 W4 x
{
% V9 _" p5 z' c0 R2 Q
print2arm("edma3init() Failed.",0);
g/ M. O9 G7 |8 K
}
& Z* x6 k: k s+ V4 ~
5 r4 g6 W, Z/ N
if (result == EDMA3_DRV_SOK)
0 Q! g# t j' n' _5 x. }
{
]+ C9 ~' s% l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' k( k# f! \2 h, F" }" @4 E- I4 }+ L
(EDMA3_RM_EventQueue)0,
6 \/ d. a, T9 S2 Q7 m# c# ?2 k
&edma3_isr, NULL);
+ I5 z! u2 s) M9 ?; E( ~7 O5 W: @8 @/ W
}
* D/ I x: W0 k; F3 A
' x4 e0 ` T. D* `5 Y/ A
if(result == EDMA3_DRV_SOK)
& x, ?& P5 j" g5 D
{
- G: ?8 ~* I$ G8 q" ~ R
paramSet.srcBIdx = 0;
8 g$ g5 D$ q: V
paramSet.destBIdx = 1;
. s2 t' D% o9 X* j+ \1 \( Y
paramSet.srcCIdx = 0;
' U1 z( f6 J7 Z/ t
paramSet.destCIdx = 0;
2 g" J- n$ y7 h/ N5 L* g
paramSet.aCnt = PING_PONG_ACNT;
* R! V5 X; C9 T. V2 b
paramSet.bCnt = PING_PONG_BCNT;
5 E; m$ D# Y& B
paramSet.cCnt = PING_PONG_CCNT;
& h# r$ M) ]! P
! O' d+ a4 x( X0 v1 W; b
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 \/ W8 }2 w0 g: I) K
paramSet.bCntReload = PING_PONG_BCNT;
+ O8 H8 l8 T! c- u' F& o$ ?) \
$ W. D( M7 x* Z y9 U2 M
/* Src in constant mode Dest in INCR modes */
* j% B I0 N! @; _- n7 `/ S! {2 Y
paramSet.opt &= 0xFFFFFFFDu;
$ O7 V8 J; w& L! a# B+ O7 X
//paramSet.opt &= 0xFFFFFFFCu;
2 Q) T; n3 L V3 w6 J
" E* Z, b: ]4 @& Q
/* Program the TCC */
2 E2 E9 y7 G/ Z% m1 j9 I4 {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 O+ h8 N( T0 y8 G" S% @ x) n
+ |$ M& S' w& }- v
/* Enable Intermediate & Final transfer completion interrupt */
$ p7 e' e' r, A8 ~* b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: ^) d! G( _' t4 w+ `) `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 ?& h1 `7 k8 B) a3 X h
) p; q4 Z- `( w) F( `
/* AB Sync Transfer Mode */
# R: M P# n$ V4 v
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 h+ M8 p2 `: u/ i! S( {
3 g# _/ U) h9 u% k1 W& R& C
/* Program the source and dest addresses for master DMA channel */
+ e9 X, G# U/ s B9 t& y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. E; B7 i' L& u& f* l
paramSet.destAddr = (uint32_t)(ping_buffer);
4 O6 ?) Y; h, O% A
5 V. @$ `( b! I
/* Write to the master DMA channel first. */
* T, N3 S* x k* O2 p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( P. a. A8 U% S2 T0 Z/ @& ?
}
& e/ M y) w6 s
1 e+ q* D4 w, D2 F7 j/ M# k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 `, p0 p% G3 e% S8 Z4 d4 h
" X ^& k- G9 e) h# b y
if(result == EDMA3_DRV_SOK)
+ `, e3 a) e2 m5 s) b7 t8 b
{
/ Z0 S1 A% w! M& `2 ]
print2arm("edma3 driver init success.",0);
- ?2 p0 M0 ^% E
}
2 Q7 A! j2 x( I7 s' z$ l
}
! E M. W( Y2 H3 H3 L" ]
4 C+ ?+ O5 ?* T* p
- u" s B5 Z: n D; z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 z+ ^- S0 r6 o: y% r
; N2 `4 \+ @' L `+ O
# H/ R* }& [. H! Z* ^2 _. e; t1 m+ D
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
O8 v# x! [0 d; o* }
每次DMA传输完成后都要再次使能传输
4 w; d9 w* E0 b- B( h8 ~. M* Z1 F$ U
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4