嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, W. ^% P! l. B' M5 D9 n
#define PING_PONG_ACNT 1
6 [7 @/ }: H- Y; d
#define PING_PONG_BCNT 8*32*40
0 G1 ~7 `) \2 c
//#define PING_PONG_BCNT 1
P$ Y) Y k1 u; ?# }0 D
#define PING_PONG_CCNT 1
1 r- w5 L1 f% ]. z; T
#define MCASP_BASEADDR 0x01D00000
% }8 ^4 l0 @- K
#define Mcasp_RXEVENTQUE (0u)
" S: L8 x7 l4 e
. f- W9 w+ G3 V
/* OPT Field specific defines */
0 t8 T! j$ r5 k. Y! t$ y P$ L
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 o& G( z2 I S! O
#define OPT_TCC_MASK (0x0003F000u)
1 z5 Z3 H$ R, f/ @/ ~+ H
#define OPT_TCC_SHIFT (0x0000000Cu)
# I8 |8 u1 q1 x) Z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 O- d- T! z% _2 ~2 O+ F
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 V& r5 z* @: A7 J1 q' e0 ^) s$ z9 ^
7 R: l- L2 {: H) t+ D4 f
char ping_buffer[PING_PONG_BCNT];
" p; K8 b/ z& D# |" `* ]; g2 |" X( x7 R
char pong_buffer[PING_PONG_BCNT];
: S0 e7 D4 c$ T" p/ X
2 G( I l0 F3 x" {
) r7 \ C/ ? N- {( g9 U" Z. c7 y% A
1 v+ G1 q' `- `" b
, s7 t- w4 f! }7 s0 ~: C
static void ys_edma3_init()
+ r# D4 d: c) \; y, k k
{
* W' V) r; Z1 C5 D, l' c
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- v% _$ E, n o+ {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( ?8 g3 ~$ n. q% K: ~+ M
EDMA3_DRV_Handle hEdma;
1 j: [! X4 I9 h. h+ B% ?
uint32_t chId = 0;
+ U9 D' S; E' b0 k% w2 T
uint32_t tcc = 0;
5 `3 Z# x: g3 X4 U% F# V
9 u6 `7 X! R- h( K) @; G! L
print2arm("edma3 driver init...",0);
! ~+ C3 G( d/ O1 k! S$ |
8 T9 A9 z& `% ~; l
hEdma = edma3init(0,&result);
7 I1 D" E w1 `
if(hEdma)
0 @1 r2 S; I3 H( Z* i
{
, ~6 `* A4 n' b- {' F! r" I$ w
print2arm("edma3init() Passed.",0);
, X6 C$ {& j& B# K
}
( U+ ~" K2 F& v: q" }
else
5 H1 Z$ n/ _) r+ D) Y# Z
{
1 I' k1 I1 e9 ?5 `+ H& B% P
print2arm("edma3init() Failed.",0);
6 G. u( \# A4 l, j
}
( i4 H1 M$ n& w, P+ I& [
9 V: B% P% e G% K% x) @4 z
if (result == EDMA3_DRV_SOK)
; @) R7 L0 \, K$ \5 h
{
8 ^8 i7 d( X) U
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. P! F! y- e( w: X; C6 v
(EDMA3_RM_EventQueue)0,
4 T* v$ Y& {2 L" c4 f, n# s0 v
&edma3_isr, NULL);
! B0 n& D+ d* i7 p3 X, |- B
}
& M7 n" e/ e, \3 u/ e
4 t8 b) j2 o5 I) T
if(result == EDMA3_DRV_SOK)
3 M) Q' {8 C+ N2 v
{
5 }) [5 G0 ]2 W3 c( u1 |
paramSet.srcBIdx = 0;
' }( t: M5 o) ]6 [
paramSet.destBIdx = 1;
; x+ j* j2 N8 y k8 @
paramSet.srcCIdx = 0;
( Q) J/ {* g( G2 W
paramSet.destCIdx = 0;
! B: t; B! x7 W4 h) ^
paramSet.aCnt = PING_PONG_ACNT;
* s# S' N; j& [6 I
paramSet.bCnt = PING_PONG_BCNT;
3 L3 b3 I# c/ }* @$ I; x% X
paramSet.cCnt = PING_PONG_CCNT;
% I. L" ]% z; @* w
( v) x" ^+ o* ]3 o- m
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ Q7 N# C/ ^5 s) f. ^9 t1 [, t
paramSet.bCntReload = PING_PONG_BCNT;
3 c/ e! l3 U1 R7 k) N8 c! t
9 l5 _* J8 `7 v6 ^" Q$ Y
/* Src in constant mode Dest in INCR modes */
: z- ~/ u$ Z) \: l8 n W
paramSet.opt &= 0xFFFFFFFDu;
! ?3 D/ K( F n8 V: U# L5 w
//paramSet.opt &= 0xFFFFFFFCu;
T1 f) o& d7 S. w5 U# o/ A5 q
0 {. A9 r! ?+ Y5 D
/* Program the TCC */
/ W' r7 {$ r. X: r) g, F6 W# P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; j4 V( c, R0 K( ~. r& {* |2 s2 m
4 N- o! p; A$ n* j
/* Enable Intermediate & Final transfer completion interrupt */
8 f- q( f$ c# e5 Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ E# y* v9 M- @' [) \
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' j' A4 C `* ]
, G e; O1 i$ s! D+ x
/* AB Sync Transfer Mode */
9 p8 L3 d, P, E0 \- k" @6 ~# t/ B+ ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 ?, F7 e# `7 l! t4 k8 j4 s# O8 {
: z2 e+ K+ v1 b ~, u
/* Program the source and dest addresses for master DMA channel */
9 g5 |" L8 Y! |
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ N2 B6 B! O1 T: u6 ^- H+ _
paramSet.destAddr = (uint32_t)(ping_buffer);
2 A3 R! M/ M9 r& h0 B& e$ x; a
, q* e; K T' f. _- E
/* Write to the master DMA channel first. */
6 f$ }1 h5 z& F, }
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: _$ a5 P4 {8 e: E* L9 @
}
/ m; Q& ^* A5 V, `, [! ^/ x
0 @2 n4 J( w3 _8 N. \
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) V- z) Z, j% a7 W) `+ M
: K5 Y% ^& |3 f( f3 g1 f& O
if(result == EDMA3_DRV_SOK)
# ?. C! \" l$ ~2 l5 C7 a
{
; m7 r! e( G& M8 Y* I
print2arm("edma3 driver init success.",0);
( ~: A4 H: G; n. ?* z( I2 k! j
}
6 w: {( n+ f5 b" W0 P
}
; X. t: G9 \. X B$ W
2 b; w7 Y9 o* }: g: P3 ^& h, y& J
+ v9 ]0 O6 e) w b7 [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 H7 F! S" R9 p7 Y
( P( ^1 o a4 Y, k) X3 _
) Z+ S2 m* j9 C# W
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& @# O1 W- v3 @- S% Z
每次DMA传输完成后都要再次使能传输
! n3 m, |* T8 O* f# I$ U, _
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4