嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" t8 Q+ b; z2 i& M
#define PING_PONG_ACNT 1
4 V- w6 u& @# G' Z* e' w
#define PING_PONG_BCNT 8*32*40
9 [: _4 L. D5 X! Q" x- g$ b
//#define PING_PONG_BCNT 1
4 o$ [0 n* K* a+ }! s
#define PING_PONG_CCNT 1
- o2 I3 W0 h+ R& [6 ?6 R8 S
#define MCASP_BASEADDR 0x01D00000
" G7 U; L0 k0 y1 I: D) v! G4 ^" ] X
#define Mcasp_RXEVENTQUE (0u)
, L# j( y$ }; y0 L7 Q9 x% t: u: k" `
2 q$ }2 d# w. e8 x% e) {
/* OPT Field specific defines */
4 G+ u8 _* A7 w7 C* k- z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& g( F* y" ^2 |, [& I+ F& I
#define OPT_TCC_MASK (0x0003F000u)
5 p& X7 i* T8 B& L
#define OPT_TCC_SHIFT (0x0000000Cu)
. Q/ ], U5 t" b( v# A
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ f6 V, z+ a* q2 Z
#define OPT_TCINTEN_SHIFT (0x00000014u)
/ o5 O& S! S! z2 r
, \( P' y$ u) ]! Y. U+ f3 X) y3 h$ d: z
char ping_buffer[PING_PONG_BCNT];
, B" ^& A9 J5 s
char pong_buffer[PING_PONG_BCNT];
6 d3 ^0 L' F) f: ^* p
( J' y7 A4 Z% U- ^& z
/ A7 m! E" G! f. g
$ b/ \# z1 v0 ~0 m# I3 i6 N
9 e! F8 r) A" ~- c0 z& a" C
static void ys_edma3_init()
3 y8 f& W+ Q* ^ b2 x3 a) v7 W0 K
{
4 W Q3 K8 }5 t5 {( I& o* q( }9 U' f! H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 P& j8 g% f+ K+ O
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( y6 H1 T+ V5 E! ^/ d" O x
EDMA3_DRV_Handle hEdma;
' |, Y& B& [, a
uint32_t chId = 0;
5 R' V. h# O, y% M! C
uint32_t tcc = 0;
- {: s0 A1 C/ z9 S) c9 I$ G# I6 z/ P/ E
5 B( J0 j, [: C2 {
print2arm("edma3 driver init...",0);
4 ~6 P- Z+ \( p* }( n3 {
0 e* a; _! t/ T, B. l
hEdma = edma3init(0,&result);
/ i2 B" s% {( z
if(hEdma)
! @9 Q. j+ x5 f3 g( d
{
! w& l: f8 W. m5 M/ A+ @/ L
print2arm("edma3init() Passed.",0);
& r- \) Y5 ?" b
}
! S7 Q+ H; D9 t1 Y7 f: {
else
% \0 F2 r! s/ A& J2 C2 o( l( ~) `
{
- k; n: {; I' K' [+ C
print2arm("edma3init() Failed.",0);
; A* U) w8 I* ~; t; {4 b
}
( d1 X0 L# F6 q7 d% S% K
8 O0 ]+ i, m( ^
if (result == EDMA3_DRV_SOK)
! O1 f2 r" K, H7 ~6 u) M& u! d
{
( x) V; l( P7 X; H( |3 Z+ ^
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, p4 G3 L" i2 p- z9 `0 j1 V1 o
(EDMA3_RM_EventQueue)0,
2 e% h$ w7 g* N* z- t+ W3 G9 D
&edma3_isr, NULL);
! v) a! ^1 ?6 M6 R6 c2 U) A, n* {
}
( H" B0 b) D1 Y7 `8 x& R `
7 X- U/ d7 c" y; P, |
if(result == EDMA3_DRV_SOK)
, q" G) F; i' N0 ]2 Q% n
{
9 v3 ^/ x3 K2 r* |, k7 M5 H, z" \
paramSet.srcBIdx = 0;
: J6 Q& J0 C0 R6 F4 z
paramSet.destBIdx = 1;
2 A: Y! G' d! `
paramSet.srcCIdx = 0;
. S& M' h3 X9 v
paramSet.destCIdx = 0;
( V7 y( f/ V3 L! F0 ]: f
paramSet.aCnt = PING_PONG_ACNT;
% C8 z {7 e$ n8 o& U: e
paramSet.bCnt = PING_PONG_BCNT;
) e9 m" a, B& j/ c4 i: a
paramSet.cCnt = PING_PONG_CCNT;
: @/ ^! _7 Y! Y$ ^
( y, s) \0 T" Z3 v% n2 d
/* For AB-synchronized transfers, BCNTRLD is not used. */
& a. D6 p: X& j% H7 c% m' _
paramSet.bCntReload = PING_PONG_BCNT;
) P5 e5 t, K- h4 a
2 c v/ l9 z* K" ~1 _/ A% T
/* Src in constant mode Dest in INCR modes */
. r+ l) c. x& s
paramSet.opt &= 0xFFFFFFFDu;
4 h+ x+ c# R& m! t
//paramSet.opt &= 0xFFFFFFFCu;
6 m, \- `+ K# A$ M8 U: }
1 p y- F: ?" q
/* Program the TCC */
- Z8 i: x2 f# l
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' ~2 M+ L3 z: E; e' T3 b4 i
* P5 {& e8 y0 H6 e
/* Enable Intermediate & Final transfer completion interrupt */
6 e: D3 Q" e1 P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ L5 n8 T5 F( K3 t1 ?, U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ Q5 p" E7 h: E, e2 r8 K; G/ A
9 P8 t) x' K7 O4 u: q, H a
/* AB Sync Transfer Mode */
/ Z" H/ N+ @" J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. A! g8 ^& i: `' b& V& b6 y4 r
( x8 X: i1 x& p) |* K; x0 ?
/* Program the source and dest addresses for master DMA channel */
5 W u1 }, }& q5 o
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. z! B! ?/ E! [1 R
paramSet.destAddr = (uint32_t)(ping_buffer);
$ |2 o$ Z- _3 z2 ]
7 X8 U! S7 d% F& P' [
/* Write to the master DMA channel first. */
/ }7 o% [5 r0 f% `1 n
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 H3 Z: Y7 d8 |
}
* G- x; V1 T0 z4 X2 N$ f
B4 P; p0 ?( I7 X- a- {6 D
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# A" V8 j4 L- r! t8 R$ ?
^( z9 I7 }) o3 d+ j
if(result == EDMA3_DRV_SOK)
$ L& k* ~* K- s7 w* A3 ^' d
{
/ j, X) c5 Y$ Z9 V: J1 g9 N
print2arm("edma3 driver init success.",0);
5 Y! T) J8 Q" s# b/ F3 K/ r! x& O3 Y
}
- f( G; F J3 {- j% E
}
3 y- Z( \ f0 j3 Q( U) H
! A7 I* H' G! D0 {' `. c$ K
1 W, _% }% m* t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" m/ t( D8 C4 ~# T7 m
2 D% J8 l" O7 H9 ~. z' [
; O! X; B5 a3 Y
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, Z8 a4 h" s e8 ]) `4 x7 }
每次DMA传输完成后都要再次使能传输
; ^4 g& f% ~% K$ N1 s5 v
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4