嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ f0 u" U# M& `+ q) ]: o. X
#define PING_PONG_ACNT 1
8 S2 l! k1 |2 W' \
#define PING_PONG_BCNT 8*32*40
9 q, ]$ `+ X! m) M' M+ U. O
//#define PING_PONG_BCNT 1
" z7 Y H; z& ^6 ^+ j& a0 d
#define PING_PONG_CCNT 1
4 R: R5 a& L) b; Z$ C
#define MCASP_BASEADDR 0x01D00000
s0 \9 j3 f8 } @7 j$ P+ d
#define Mcasp_RXEVENTQUE (0u)
% I7 P' Y9 b5 S' b; C
8 }' y N* Y! E
/* OPT Field specific defines */
7 W+ o' T& d7 r/ o8 x# p7 Z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 k! Z8 ~) \! N% j. G& D
#define OPT_TCC_MASK (0x0003F000u)
9 Q- R8 }9 g; K) k! {
#define OPT_TCC_SHIFT (0x0000000Cu)
; K. r: ^! ]$ Y4 [; V2 W$ d; R- F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, d" }2 z- O. G$ h+ f/ u- ]
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 I% l% Z2 y! a- @7 A$ m4 o
8 B9 q! b) j5 v7 R
char ping_buffer[PING_PONG_BCNT];
% V6 z2 B5 E Y
char pong_buffer[PING_PONG_BCNT];
6 t4 i7 v# r# U9 V" t* C) `& I, f. { a
. I: c' ]5 D4 d0 P" b& `3 o
/ M7 G# t2 x9 f
0 Z+ Y/ J1 y; l) M3 ~* T, ]
" O6 r7 \3 a( j' Z5 [* p+ d: |1 @
static void ys_edma3_init()
4 C" U0 b% @3 F4 k; d
{
4 e3 r. W; z6 `# Y- P4 i
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; ~3 A+ R: P4 f% S# @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# ?" j' K) _- I- X9 b/ f" r+ m9 Y
EDMA3_DRV_Handle hEdma;
& ]( K( v! R, n8 V! {" ^
uint32_t chId = 0;
$ H" a9 j# k8 N0 i# d
uint32_t tcc = 0;
2 H" R# Z5 k( S
. _, }8 s& `! y
print2arm("edma3 driver init...",0);
+ U; V0 q0 i& `2 ^
- I( F; k( D; q& _
hEdma = edma3init(0,&result);
3 c" k8 E3 G$ C" k" n1 T/ O
if(hEdma)
$ B/ R g, j/ [# `
{
# Z3 B; l- Y' q2 p q# a
print2arm("edma3init() Passed.",0);
. X' J) F# r0 d* c: ]) ?
}
8 R. x, W. {. ~3 `
else
7 L% Z7 G- ^) H. O2 I4 b+ T4 z! m
{
% Z& T# X Y. n! o: j# X
print2arm("edma3init() Failed.",0);
0 z* B, T; y' k R6 m
}
. t5 l' v- G7 U4 }% I
! X# Y/ \7 ^1 p+ D& V) x0 l, {
if (result == EDMA3_DRV_SOK)
: |' y. q, u/ q3 {) B$ _
{
, r1 ^+ T( t$ b( h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 I( y) u+ o! Y8 s& e
(EDMA3_RM_EventQueue)0,
9 X& E0 t8 e% Z" I7 G( ~
&edma3_isr, NULL);
- t" A! l# p& N) {
}
4 R$ Z7 |; R9 `) A4 U( E7 P% k3 [
+ L& ^. p b2 P. k3 I; `( y' [
if(result == EDMA3_DRV_SOK)
4 N8 G1 D# H5 S9 e4 p
{
: ?# K8 x6 d* n( }1 [4 A7 Z6 K3 ]
paramSet.srcBIdx = 0;
% B0 Q7 i) A# v) m0 |+ T$ Y
paramSet.destBIdx = 1;
1 z! z+ B1 w$ O: c- @
paramSet.srcCIdx = 0;
/ M1 A6 D. r& ]) n( N# }( l
paramSet.destCIdx = 0;
: J$ V: o9 B, g2 l! F
paramSet.aCnt = PING_PONG_ACNT;
- s7 ?; c0 H8 K- z/ G7 V
paramSet.bCnt = PING_PONG_BCNT;
. q/ f; s4 a, _! p' O5 v
paramSet.cCnt = PING_PONG_CCNT;
) V2 x& _9 v3 u% [) w5 }% i
6 R1 f, y( `0 i/ O' r% M! Y, e
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 _) K3 N* A7 {1 N7 N3 N& I
paramSet.bCntReload = PING_PONG_BCNT;
. n, Z; b* l* A. A$ ?
p# H5 z) h, U
/* Src in constant mode Dest in INCR modes */
8 Z- V: D! N7 J/ R& `5 Z9 Q! ^
paramSet.opt &= 0xFFFFFFFDu;
4 }8 T) |% h7 f
//paramSet.opt &= 0xFFFFFFFCu;
( L& G, p6 K0 Z& ?4 G
/ T/ f, l- L' u) C
/* Program the TCC */
+ f5 h3 i1 J" B& \% u( u
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ N. m* w3 V0 g0 p! D' H
* |' T" D1 I# M/ N: c: \. A
/* Enable Intermediate & Final transfer completion interrupt */
9 {. O$ e7 g; p
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 _9 Q1 ]: d; ], a) w V" Y! o
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 E& ~0 \! P6 `( E
+ R" Y E6 O3 ?& f* a4 x/ ~
/* AB Sync Transfer Mode */
% S4 m& c2 g' j( {9 k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 w. }6 J8 a' ^8 R: K3 O
( B6 E( {3 z ^! K% Z- P0 T0 W
/* Program the source and dest addresses for master DMA channel */
8 W1 R+ w4 C7 v" [# P$ B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ a$ j. b3 P) t- X3 K) B: [
paramSet.destAddr = (uint32_t)(ping_buffer);
4 i- l$ ^8 d& w( h
4 ?2 a$ D% l$ }$ N
/* Write to the master DMA channel first. */
5 G5 H- k% b+ w& O- V2 N. ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 F# h' E) K- H5 i2 Q- P
}
0 z& ~" D- f- M5 Z9 ?6 @% v6 e2 J! n
5 ]- Q0 {/ U) _% U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) D* Z/ @# u% h5 x$ r
3 i7 z! a8 K) U& D
if(result == EDMA3_DRV_SOK)
5 h; ?6 n, N7 p. s
{
5 F, H R. X7 L
print2arm("edma3 driver init success.",0);
! i* F) }, ~2 d; J( _
}
3 m. R2 ?, K# ]6 {6 Z3 E
}
/ }( P v2 h* {$ W
' s5 x4 `. T; \# b* f) N7 I! v
m! ^2 j+ j. U' g- S7 O G7 m, c$ a4 U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" K& d- y- n6 B+ ]/ Y" D
* ~* C. N4 C/ I
1 t& \% w. K+ Q/ ?( i
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ G' |7 F F% \# R( o2 m
每次DMA传输完成后都要再次使能传输
4 @% {1 S2 U8 k) j
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4