嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& Q8 @" w1 t: ]2 y' q g
#define PING_PONG_ACNT 1
$ X9 M$ H3 W* U+ P/ v8 ]$ _# n
#define PING_PONG_BCNT 8*32*40
% P( V9 m. V, P* L
//#define PING_PONG_BCNT 1
- ` v. \! K8 [$ z3 |( n
#define PING_PONG_CCNT 1
5 h' M/ e9 R5 D G! w3 @6 W
#define MCASP_BASEADDR 0x01D00000
0 m! g; o+ ^/ _1 L+ E
#define Mcasp_RXEVENTQUE (0u)
3 O+ z9 [( Y* L5 I6 {6 _
; \0 _; y' t& a+ e/ D0 q
/* OPT Field specific defines */
! j( C1 E5 c3 `0 x4 q0 z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, Y9 j+ u' q+ I
#define OPT_TCC_MASK (0x0003F000u)
6 L( S9 h" a" E( `1 X3 ?& X$ Q L
#define OPT_TCC_SHIFT (0x0000000Cu)
0 ?1 R' s$ N/ R& [- f: K( x/ V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ d6 C4 {. M/ c" i m6 F3 N
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 p/ J4 A: i* {- p- t9 {6 o7 @ z
9 E' y7 G9 t! Z8 C5 X% C: ]
char ping_buffer[PING_PONG_BCNT];
: n: T3 A9 e* C' X" q/ P
char pong_buffer[PING_PONG_BCNT];
7 F& @4 U, @2 k& N% o( \% g& j7 S: d
- o+ n/ c+ K; j2 i$ Q8 ]; {7 B
& s) [0 ~! W8 c; \$ ~
- M& L6 @% Z5 g; d6 l
$ Q! y( Y+ T, }/ R$ Q
static void ys_edma3_init()
5 }) Q/ A. X$ ` T* q! v+ J
{
, s( a. u4 `/ `: Q1 j# P8 g3 J
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' K% b- P/ u* B% c0 I$ l$ s8 } {9 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: a' `# t0 ]% Y0 `0 h4 U
EDMA3_DRV_Handle hEdma;
( d# _- j% \# ] o0 e* H
uint32_t chId = 0;
' k+ f& ] T2 h: N5 Q7 Y9 l
uint32_t tcc = 0;
8 g5 V3 g5 E1 t$ r' t5 R# p5 t% k
" o; t E5 Y) b3 A
print2arm("edma3 driver init...",0);
1 [2 L' G) O1 L6 r
0 Z. M2 x" s& g7 H# T4 ]7 ~
hEdma = edma3init(0,&result);
# F: {: u1 n+ o2 X }
if(hEdma)
2 Z+ \. b2 s ~9 I
{
: A0 G" F( O5 U$ S, Q) B& {
print2arm("edma3init() Passed.",0);
) N. L+ M2 z w: t
}
3 O4 M3 ?: ?7 S3 B
else
* S. r/ c x' h0 H! z6 U% i1 D
{
4 D" |# `. k; L0 Y. X/ a @0 H# j7 v
print2arm("edma3init() Failed.",0);
5 _3 |5 v p* W
}
6 @1 _) G. E9 U/ p/ m
4 ?1 D2 _. Y$ S- L1 s
if (result == EDMA3_DRV_SOK)
2 p3 C" L6 g% M7 a2 N- B [( u
{
8 E h e! g6 _) N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" @3 U8 F7 j/ h; C6 e
(EDMA3_RM_EventQueue)0,
+ w* d! G* |; v a
&edma3_isr, NULL);
4 w3 q) Z: g5 e7 e) t% Q0 U
}
( {. S. J8 M4 W, y# |; C
1 v4 U8 S3 c3 r
if(result == EDMA3_DRV_SOK)
& I# z3 ^8 D# N) f: S
{
3 D! T, w' F# P
paramSet.srcBIdx = 0;
# I* e, Q" {: E* R
paramSet.destBIdx = 1;
8 E( m- w& z' ~8 d7 T% Y" x
paramSet.srcCIdx = 0;
% v. F; }2 g" i+ K- D
paramSet.destCIdx = 0;
, r: K7 S. |' ]; ^0 H' D7 x
paramSet.aCnt = PING_PONG_ACNT;
5 [; Y- r- g3 a* _$ g- \# F. v
paramSet.bCnt = PING_PONG_BCNT;
9 M! s1 U5 x: Q2 e5 t$ o
paramSet.cCnt = PING_PONG_CCNT;
- r$ {0 a3 q) g6 j0 |. `
1 U6 o+ E" d. Q/ f/ J
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 `6 |8 B' A8 ?
paramSet.bCntReload = PING_PONG_BCNT;
0 |' e" ]8 h7 S8 k. R/ y
( }) T0 L$ [1 d
/* Src in constant mode Dest in INCR modes */
, K0 V7 h& F: m: P
paramSet.opt &= 0xFFFFFFFDu;
7 S) V G/ V( v. H( N0 _8 L' r
//paramSet.opt &= 0xFFFFFFFCu;
# c. s5 ]3 J! W& r; T- u
. v7 r S! P, B! D% B5 K
/* Program the TCC */
% w6 j) {2 h& f. {/ `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# r% l2 h; F% n0 ^8 H
7 u9 e( ~- S- ]5 `5 a2 {3 e; _6 V
/* Enable Intermediate & Final transfer completion interrupt */
$ Q- ^' X" I: j, Q; N: a
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* s# i( C* o4 C. z- u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. u+ n' `2 T& a
+ d q8 [* f2 e! J3 Q0 @
/* AB Sync Transfer Mode */
/ d$ z0 @) O& f4 U! ~; |
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- L& e' X5 n% b5 t0 b
6 a, N, }# x- n: G8 i7 ~
/* Program the source and dest addresses for master DMA channel */
! U' M5 G( B# t
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
f# N7 w+ h* R& Y o
paramSet.destAddr = (uint32_t)(ping_buffer);
0 o' z( x0 f/ o# @8 Z8 f, n3 z% V
. v! t- ]$ Z* ^" }
/* Write to the master DMA channel first. */
! l, x4 d* L8 o- }0 H
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! q+ A4 \+ A, G J$ `6 w
}
6 f$ X% v* S- |" q* g
% j+ V; i- }- q P8 Z0 a$ B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 A8 r. n7 L4 w- B
, [+ e1 X- c8 D6 Y8 |( X- m+ J+ M
if(result == EDMA3_DRV_SOK)
) g; }' u) }% e2 m C" `
{
; U9 i+ N+ V3 A6 R J k) r
print2arm("edma3 driver init success.",0);
( O) Z0 D2 j7 \% x$ i: | D, n
}
! ~: y. q5 G) W$ X2 v' u+ M
}
: h# J/ ^. C+ Y% c! ^5 {) B
, b, Q4 u! s v
% z! M3 i7 `, U( O' {3 u! ^' R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% Z( s3 p* Q0 X6 c
5 Y [, {. D% e4 g9 c! N
4 t" y9 s3 u5 E% f0 ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, g% S( P, u8 v
每次DMA传输完成后都要再次使能传输
8 R$ I* ~ e0 t. r
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4