嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: |# ^" n2 \; P7 N9 `! x8 I* r
#define PING_PONG_ACNT 1
/ s5 k, l0 G$ d
#define PING_PONG_BCNT 8*32*40
4 s Q6 r0 d( M' _1 V6 m. q, t
//#define PING_PONG_BCNT 1
9 O g2 m( D( Z! [7 ^6 z
#define PING_PONG_CCNT 1
6 q7 i7 e% ~; D. z1 l
#define MCASP_BASEADDR 0x01D00000
& p; q0 V5 Z2 n+ c# X5 H
#define Mcasp_RXEVENTQUE (0u)
$ i* F; C4 J! ]* C' }. L% }. a
; J- v9 {/ g" O6 W& V
/* OPT Field specific defines */
z8 L8 U# U- {* H% U( l
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 d, G1 F* ^6 T n( _
#define OPT_TCC_MASK (0x0003F000u)
' _+ N8 j; h1 l
#define OPT_TCC_SHIFT (0x0000000Cu)
/ J' E* P2 r. B$ x' A" Y1 a
#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 x! G {, d" m" T
#define OPT_TCINTEN_SHIFT (0x00000014u)
: B) l6 d0 |( `1 k# P4 h; @
/ S# h* r; Y- {1 k
char ping_buffer[PING_PONG_BCNT];
' z) N. j4 y6 F4 N
char pong_buffer[PING_PONG_BCNT];
; d: r( r) O H, y
& p( {; N" F6 P& C
' x- a% f( |2 U) k' t) {
}7 Q5 Q! {) h6 u
& u* e5 [6 a1 P% d
static void ys_edma3_init()
: S/ o' v4 N: [' i; E
{
1 _" G+ F# T( w% w0 E* \) m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 t4 r3 ?7 ?) B% a8 P: G+ F( C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ g$ P( D/ W4 {8 J1 |+ F! i
EDMA3_DRV_Handle hEdma;
M1 J" y2 V" `3 u& @! p
uint32_t chId = 0;
; B& n9 _1 ~% P/ }* f2 _
uint32_t tcc = 0;
) E' j M) @! @1 T1 i2 V
. u2 y t/ B$ k6 u( T
print2arm("edma3 driver init...",0);
" H! k# _. W4 `7 n
; }) o2 V$ K6 \$ r4 Y+ p
hEdma = edma3init(0,&result);
% S1 v( x" X6 n$ q9 v8 ?, B
if(hEdma)
4 m5 ^7 ~. b- U: S5 n3 z
{
: o& U |" {) E! s1 o e+ g+ x
print2arm("edma3init() Passed.",0);
5 z$ N. L4 O, T8 h
}
- |0 [% d; P9 |/ b, {( D7 V
else
9 e* T+ g/ `$ a( r
{
* D& n0 v: C( {- L+ n
print2arm("edma3init() Failed.",0);
- a$ |6 b [/ @1 d' n4 Z
}
( [6 M/ e7 E, A% L9 L
2 V- g4 D( m3 X
if (result == EDMA3_DRV_SOK)
7 N. p: c! Y9 u, J" E
{
' b; ~# N) b4 ]+ }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 H' v/ O2 ?4 y
(EDMA3_RM_EventQueue)0,
5 J: i9 p9 d" W( m- i
&edma3_isr, NULL);
" S* t, M" f/ W' `3 Q
}
8 D% B. n }/ ^# n
# B" M$ \: _7 v+ q. r
if(result == EDMA3_DRV_SOK)
5 T! E8 ~- u1 s' Y4 {2 ~$ w- T- [5 ^
{
* y# C- E) N* m" e& C
paramSet.srcBIdx = 0;
' n9 Y6 a# K1 O+ Y: C- `7 t. ]2 W
paramSet.destBIdx = 1;
I# E& `! j3 Z
paramSet.srcCIdx = 0;
2 a- u1 o, R' T
paramSet.destCIdx = 0;
& k8 C- m2 F8 n* k5 j- ]
paramSet.aCnt = PING_PONG_ACNT;
; O- _5 }2 J8 s0 W8 d8 y. t
paramSet.bCnt = PING_PONG_BCNT;
+ S0 q; [% V [% j
paramSet.cCnt = PING_PONG_CCNT;
1 R, @+ M8 w1 p" }
0 j2 c" g# U( t4 E) e7 T- b
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 T. l( K; n6 E7 X+ }% g! x
paramSet.bCntReload = PING_PONG_BCNT;
/ X% Z* V+ t9 Z' c
. M9 G" }, U" ]( c" w/ o9 [8 ]
/* Src in constant mode Dest in INCR modes */
) ]) \* e0 B& p/ G( D
paramSet.opt &= 0xFFFFFFFDu;
& K6 m. J2 c- ?) M+ }
//paramSet.opt &= 0xFFFFFFFCu;
1 ~% r3 L) f5 d! {& `4 G6 X3 `
0 n" I' m9 M! X# G! [
/* Program the TCC */
- U. {; n: G: F
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. O. a% b- g4 f
7 g8 a: L* s2 \; V& R( K
/* Enable Intermediate & Final transfer completion interrupt */
7 G$ X9 E7 I) z8 H! j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; L! I3 ~- m" @# b! t1 j8 z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 j+ ~! b( }* |$ O. v
5 Y" t$ r& K; {% S6 k1 e' r2 |+ U
/* AB Sync Transfer Mode */
: y8 A2 B% `8 ~% e6 ^
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 k/ ^5 b7 Q. m) K9 d( ` m# f$ F
U, v9 b" d! Z4 y) ^# N+ }
/* Program the source and dest addresses for master DMA channel */
; N$ q5 z. ]0 z* t9 C% W" i
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! S& ~/ b6 D& K8 @6 A" h
paramSet.destAddr = (uint32_t)(ping_buffer);
/ A5 z! F; b# W* k4 v
, o- z4 p! F. G4 u( ]9 q$ [( {
/* Write to the master DMA channel first. */
8 {& i1 b1 p# L' P, @
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 m6 J) e5 L8 z
}
" f4 W, z$ A) u! o! F
# F: f! {( ]# L2 L! Q( ?( h0 [2 y9 d
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 E4 o, q# ]0 A0 n$ C0 b# D
, R P: ~- r/ M' d2 _* D
if(result == EDMA3_DRV_SOK)
" U3 S% N2 g! i9 }0 |+ S
{
' y% T5 G) ^( m8 Z; z) ~0 p9 Y9 ~
print2arm("edma3 driver init success.",0);
. _9 n7 Y+ ^4 g
}
8 G1 L1 z, B* g X
}
: P8 k& ] O9 a- Q6 r: p- Y
0 P8 `/ ~! x7 S0 K8 I
$ n0 Q* v9 t3 l4 }9 }
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( c+ j( S9 V& ^* d( C* q( w
$ }9 v; j3 K' r" n: |
, l: h/ V% A& F. \
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) N9 A( a+ ?4 K2 n+ L. F: E
每次DMA传输完成后都要再次使能传输
) j3 C! j2 U$ O' z n# l
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4