嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" I0 l& _; i* J) E5 U
#define PING_PONG_ACNT 1
: b. o8 W, R4 w
#define PING_PONG_BCNT 8*32*40
5 \2 k: a# j1 Q+ x
//#define PING_PONG_BCNT 1
+ Y- a% E' u& }% i( _& @( k8 I9 H9 [1 b
#define PING_PONG_CCNT 1
# b1 h# X% y1 [: \8 h
#define MCASP_BASEADDR 0x01D00000
/ }' a& C/ V# Y" s4 a9 @& H
#define Mcasp_RXEVENTQUE (0u)
" h7 i8 g6 l U( f+ v
7 w: \: X, J! Y% e& _8 J6 H8 _
/* OPT Field specific defines */
- K' k) v9 ?& A( V; T! ?- f" U) C5 r# g
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" n8 [" O; j( r' a# R$ C% ~
#define OPT_TCC_MASK (0x0003F000u)
# `0 _9 K" T7 F& R% l- F
#define OPT_TCC_SHIFT (0x0000000Cu)
/ X* s- {+ L' c1 `# z6 h1 c
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 U$ b0 A4 m& X' [! F: m$ f
#define OPT_TCINTEN_SHIFT (0x00000014u)
# Z, z4 V) s i) R* }
6 Z- N5 I, J1 m6 a$ U1 Q
char ping_buffer[PING_PONG_BCNT];
: Z$ v% E8 @1 K5 S1 H# v
char pong_buffer[PING_PONG_BCNT];
- I# r5 \2 H+ w1 v4 K
/ M5 \ i w8 M" N! |- f8 g3 t
* @% u+ R. |- s( n4 U8 I; u
6 t: `8 G( v+ P: O; q Q$ d
! C& M5 k" l7 P3 `! ^
static void ys_edma3_init()
2 D% l$ H ~* }' X
{
7 p0 n/ T: c) p% o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ @3 o! T; T1 A! N
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ q9 t2 `3 a2 i
EDMA3_DRV_Handle hEdma;
6 O- k( d; m. B8 f" \3 K
uint32_t chId = 0;
3 J, t- `: v! w1 F7 j
uint32_t tcc = 0;
% E! w. J" S# `3 b1 P
: h; w0 }+ S7 H
print2arm("edma3 driver init...",0);
8 x' `3 v; C. s# h% F$ x
( H+ @: b' E" c- o2 B
hEdma = edma3init(0,&result);
5 g) s( G" @4 ~9 F! r
if(hEdma)
7 a, W9 ^8 h* x, U G' {& N# i: _
{
; X- h6 `) h: h2 K
print2arm("edma3init() Passed.",0);
% H" w/ k H. Y9 M2 P8 e* u
}
4 ?1 r+ r8 b3 a3 ?- q
else
1 H9 Y' p0 m$ E0 z% B
{
& M7 h, F4 @- h( Y. M4 K
print2arm("edma3init() Failed.",0);
2 R' `+ w. Q% f, d
}
! K( n' Z& @+ J: L
: v- v9 j6 @; h" w& b! V! H' p
if (result == EDMA3_DRV_SOK)
6 |# F% O% y, I3 A( U( `9 Z; k
{
1 Z$ f$ Q* z Q5 a2 `0 e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* {9 o2 B' f9 b9 {
(EDMA3_RM_EventQueue)0,
" G0 l1 R* x: N, C" |
&edma3_isr, NULL);
6 [/ p/ T8 t* D
}
) C5 a* [5 T6 W5 S
b) p6 b8 M& \
if(result == EDMA3_DRV_SOK)
3 c( h5 I! z1 c: u+ g8 \' T& c4 D
{
) J8 P8 D3 b( \" j# E$ G8 s1 F4 ?
paramSet.srcBIdx = 0;
& B. d5 _) E* u+ t
paramSet.destBIdx = 1;
& m, X$ w1 J1 j. T6 a
paramSet.srcCIdx = 0;
5 u, n6 C6 w8 k
paramSet.destCIdx = 0;
( Q9 X2 c6 ~* r, c
paramSet.aCnt = PING_PONG_ACNT;
+ r- o& n9 g# P* }( C7 @
paramSet.bCnt = PING_PONG_BCNT;
1 O6 S8 a* E5 E7 [
paramSet.cCnt = PING_PONG_CCNT;
& H: L( b" }' G, L: i8 ^3 r' ]
! P+ l& ]8 o0 @. g( u
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 ]$ ^( B8 `% m
paramSet.bCntReload = PING_PONG_BCNT;
" ~/ J9 }" u: g1 [% ^8 w2 D6 F
5 B3 U3 z7 d" w6 k! h
/* Src in constant mode Dest in INCR modes */
5 e4 N6 w& ?6 C
paramSet.opt &= 0xFFFFFFFDu;
/ G5 P3 C$ p/ _) k8 O( B) I
//paramSet.opt &= 0xFFFFFFFCu;
2 e. p. s/ u9 c" R/ e
& E# ~! b+ f+ R- {9 X5 e7 F9 z7 X5 ^
/* Program the TCC */
4 P% h8 a9 O, f- X9 O# k) q5 L+ R
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! s7 v% y8 @) ^: [, d$ G
: K/ n5 P& f8 Z; r& `- s4 N
/* Enable Intermediate & Final transfer completion interrupt */
) s% W6 p* J, Z: Y6 K
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, V! t, ~0 [! M# L$ z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, X4 V$ @" `) ~/ n3 N
% ?" K2 W3 N' N) r
/* AB Sync Transfer Mode */
5 U: j& R: [+ J$ V' ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ k6 i# Y: T! O; B5 O
3 q/ Y9 v p, @& L: G' f5 q$ t7 o
/* Program the source and dest addresses for master DMA channel */
! j% Q# ^( W% ]9 }
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 `8 m- |5 M' ^( @+ W5 m: z
paramSet.destAddr = (uint32_t)(ping_buffer);
1 g5 N1 _: L3 y h: _
" F. F6 T- k* L
/* Write to the master DMA channel first. */
t5 ?2 k& L& `4 w, K
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 ?/ }3 x- M5 I6 E; ~8 Z( p& o8 |
}
5 b* r0 G# V/ _$ \ q8 t
( T+ I- c/ ]# \2 }- L3 E
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" g F# P- r; f) ^
# c* B. r1 c h& W" X7 [
if(result == EDMA3_DRV_SOK)
2 Q+ q, K) U, Y1 t- |
{
* d0 m* h6 m. Z3 \4 z
print2arm("edma3 driver init success.",0);
7 [8 }4 a7 g; h& _" T, t- D
}
# l6 e* Z# M% e5 q3 \: Q4 y
}
5 _1 |3 A7 ~, X
. R; E9 s8 m2 y2 ^7 R _, k: d( k) J* O
: Y2 Y" j* o0 P; j, ~3 Q' P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 q5 Y5 R8 L/ |, s) S
& `# b9 Y0 `7 @* N4 m4 F* G
% P9 Q: {( W9 Z* m! x
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. E" i4 S/ x0 C2 I; @1 z
每次DMA传输完成后都要再次使能传输
% b% D+ d1 `" ?% N" }0 O3 @
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4