嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; y7 V9 E2 R% i, ^, C
#define PING_PONG_ACNT 1
6 i( p. f0 ?" O2 c
#define PING_PONG_BCNT 8*32*40
, I k2 `( b/ V, {2 s6 D
//#define PING_PONG_BCNT 1
# o/ a3 T5 U1 H T! I: u
#define PING_PONG_CCNT 1
! n# V8 |- D- v! h+ s
#define MCASP_BASEADDR 0x01D00000
6 @' r! @7 I. Q
#define Mcasp_RXEVENTQUE (0u)
$ X R4 t" K; x
! [ l- _: X. k0 S Q
/* OPT Field specific defines */
$ l/ u8 D$ B8 t4 f+ w @2 i6 m1 t5 I1 v
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% K* L( {4 E8 R% G* ?' i9 _
#define OPT_TCC_MASK (0x0003F000u)
6 }3 ~/ |2 _, ?1 x
#define OPT_TCC_SHIFT (0x0000000Cu)
8 {- x" r/ Y" p$ {; V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! ~7 U% f' V1 `2 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
2 O' n# |/ X* L% H1 x6 c
9 ?3 i1 c1 d: Y
char ping_buffer[PING_PONG_BCNT];
! i7 X5 ^+ m* d6 [
char pong_buffer[PING_PONG_BCNT];
1 x- y, e6 H2 r/ w1 V% H
( l" J; r \% n# c! @- d5 m/ z0 H
( {% t$ l$ X" ]( ?; r7 `5 e
4 {! Z$ I' W+ c, [
3 t4 }* X- m* Y( Q D* ]
static void ys_edma3_init()
2 o+ H# {" p1 @( r4 y# c( g1 o1 c: u2 T
{
' m7 `0 ^9 P. q+ X% B0 T7 A( k( z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& s% D7 I2 y! n' R% O3 c5 ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 G. R8 O& V$ W o
EDMA3_DRV_Handle hEdma;
( o7 I4 \( E9 L W
uint32_t chId = 0;
, N8 _5 z4 b. {
uint32_t tcc = 0;
' B+ I+ M, c- }
% ?! |* \$ N; [9 Z8 E6 j
print2arm("edma3 driver init...",0);
4 ]2 q y, a( t, l# K7 x- _( Q
7 Z% d6 K2 w! T) R
hEdma = edma3init(0,&result);
/ y$ Y, m- n. n9 y% d! V* N
if(hEdma)
5 G5 D/ {. ~; Y
{
$ E; P: W- N, I
print2arm("edma3init() Passed.",0);
5 k2 Y, K4 H0 ]( r# U
}
, Z( Y7 ?* y! ?! b4 w" Y
else
: V" t. `! Q$ n
{
1 K) G5 R% z4 _7 u9 _% j
print2arm("edma3init() Failed.",0);
+ a1 f% p% m8 U1 |8 W$ M2 I
}
7 w0 _3 t2 ]) d V) ~$ \
$ M; g( x& j) n
if (result == EDMA3_DRV_SOK)
6 l) c8 }! L9 ^8 d; Z
{
( z$ {% O2 I: k5 |" A; z) l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& ^* o5 f- D/ h+ K% K8 L
(EDMA3_RM_EventQueue)0,
5 ]* I4 ^% C& d/ n+ F* @4 h d7 i
&edma3_isr, NULL);
/ P! |6 F' s2 X; N8 @* M0 ^
}
9 c/ l# [7 v0 a" X/ j. Q2 r
# {* b! T, K- c' v
if(result == EDMA3_DRV_SOK)
: N. q2 @( J# U
{
: }, Z- j5 P' k+ Y6 ^& q+ M" x2 ^
paramSet.srcBIdx = 0;
- H) Z: u! F) u- I/ U
paramSet.destBIdx = 1;
$ e: n, v+ l, D
paramSet.srcCIdx = 0;
T; B5 @/ O" |
paramSet.destCIdx = 0;
9 i% a+ t& w3 i' H
paramSet.aCnt = PING_PONG_ACNT;
3 \9 ~/ H0 c6 n( j% @3 d
paramSet.bCnt = PING_PONG_BCNT;
8 o7 `7 W/ {6 G8 F" {& |
paramSet.cCnt = PING_PONG_CCNT;
! x- L! p: |. M5 I* W, ?
3 I6 S$ R) ]9 b8 b) i
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ m! i- c- S- G& c
paramSet.bCntReload = PING_PONG_BCNT;
E3 l8 v9 D: B! W% w
: g$ Y3 E$ C2 N
/* Src in constant mode Dest in INCR modes */
2 w t( q4 Z% T: b
paramSet.opt &= 0xFFFFFFFDu;
; R0 l1 ? U: M5 r) {
//paramSet.opt &= 0xFFFFFFFCu;
( f5 ?+ @) c. Y6 `% A
, i: f' T- h) M4 K2 p0 W% G7 ? S
/* Program the TCC */
- C$ A2 X! w( q2 e" F+ Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ H( ^$ O; n; y- p* ]5 o
# e9 Z$ b) w+ M/ R9 T4 r
/* Enable Intermediate & Final transfer completion interrupt */
' M$ T: r3 o1 s
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% _# W) w, t7 F8 \1 a9 ]6 x4 i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 J! p" e5 \3 P: s% `
: k5 d( r- x2 b: r
/* AB Sync Transfer Mode */
; I7 O' w2 q2 h0 J# r' ~2 }
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% t- \8 y; A/ s4 ?, c
. y, K6 ?6 s" m! s& w
/* Program the source and dest addresses for master DMA channel */
- ^ U/ Q. C5 }: J9 r# Y( |) i4 w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% `% n7 ^ e9 C
paramSet.destAddr = (uint32_t)(ping_buffer);
( M9 B( d" m" i
1 P/ c: j1 w0 x+ f
/* Write to the master DMA channel first. */
; W, d: A/ K, C% c, }6 w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% K2 j( [) y' o3 N& I$ U4 b/ d
}
) w* s% {% K% f
( i4 C- |* f/ }3 G" y$ R
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 z; T3 [9 h! [ l6 u j7 E# y
+ R1 y9 u. ^! J$ F. c8 v
if(result == EDMA3_DRV_SOK)
/ g7 S+ A# q, k( @+ M& k! B
{
# ^; D4 D# }+ n
print2arm("edma3 driver init success.",0);
; _: p- L: @+ Q/ J
}
' \. }& ^ a V! v9 ]
}
" D' O) D# I2 H9 K$ ~) |
. s, [) h$ K: }
1 t, ]+ S n! y7 p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" }/ B# u# O# [
6 p4 v& X+ c" v- s$ c
; S4 W# ?8 x6 } u3 f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 {( j" H, m9 d! r w' o! l2 N
每次DMA传输完成后都要再次使能传输
/ R* S; J) O( ?( V
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4