嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 u# z* ^& i; B0 a9 M0 T
#define PING_PONG_ACNT 1
P7 I& b% Y: R. r
#define PING_PONG_BCNT 8*32*40
8 U. K$ I' u- h1 A' K5 v2 O
//#define PING_PONG_BCNT 1
' z8 I. H) R9 T2 W% _
#define PING_PONG_CCNT 1
6 V! T3 R+ n$ ?
#define MCASP_BASEADDR 0x01D00000
+ Q) v/ q6 @. x* [, C
#define Mcasp_RXEVENTQUE (0u)
" k% J- l2 T1 R/ V+ ]2 W
" T( h [ k# K3 F6 H* o0 R6 l2 ~
/* OPT Field specific defines */
: s- n1 ~+ K/ P1 V1 e" Y: M
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, Q) }; e3 P/ L, H% d1 E0 m2 }
#define OPT_TCC_MASK (0x0003F000u)
8 L- q6 ^ z2 k: Z' @
#define OPT_TCC_SHIFT (0x0000000Cu)
a! W N% V2 r: v$ k
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! @9 H4 v! @+ t) [. n
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ E' V. K% G" z: I
. Z% A7 C4 ~6 n+ Q! j; y
char ping_buffer[PING_PONG_BCNT];
6 C& c$ n _! R3 k+ H" p
char pong_buffer[PING_PONG_BCNT];
- j) }! L. y) J7 _2 P6 i
- G" F+ _" z0 u' {+ }$ `
' g$ ^) ~% J9 z
, C, s1 b* _, x$ |; A* x3 D
w& u4 b: X% s7 H r4 R8 i4 F( ?
static void ys_edma3_init()
6 @* K: Q9 r( e; t
{
" Z# Z5 @) Y9 V: W9 s9 u" V* Q) V: k
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! \3 K/ y @' r) x7 b) w* A# w
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 J* I! j; k; _8 ?/ b
EDMA3_DRV_Handle hEdma;
' `6 P; z* M$ G3 `. n8 a. w
uint32_t chId = 0;
& R! H4 F T# w1 [
uint32_t tcc = 0;
5 J. V8 v" `- P. O1 I4 c% `8 B! Y- u) X
# R# P' F9 R2 z4 l8 e
print2arm("edma3 driver init...",0);
5 ~( w+ M9 Q# }3 a! a! I$ Y
5 J$ i# _% I: H, M+ e8 y; p. T7 Q
hEdma = edma3init(0,&result);
7 [9 ~: s9 Y4 Y1 W8 J
if(hEdma)
1 ^/ H. v$ f) ?+ {8 h4 C b$ j9 o
{
+ F$ j1 }9 p/ K4 x
print2arm("edma3init() Passed.",0);
* n/ @. k! v& {( ~" w( I
}
* }& R& u7 L" |
else
. y. x6 X- g4 v" s; }1 U( ?
{
# S1 M2 f. r0 w( y% K
print2arm("edma3init() Failed.",0);
* G! \# N9 r, _/ q% [! C
}
( m/ c) e; R8 g" P, X S$ a5 B
5 ^; U$ X9 `5 {4 p: | b
if (result == EDMA3_DRV_SOK)
; \3 | s) E4 G0 ^5 S8 M; v
{
& v- o% c; q0 @4 D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 Y1 h# {( h8 w' P: v- M
(EDMA3_RM_EventQueue)0,
7 g/ H, {, U& Z
&edma3_isr, NULL);
v( ^% \& b) |, Y; O& J
}
% C+ y. Z$ X" z1 ]. L# w
+ n0 b0 j# |; @
if(result == EDMA3_DRV_SOK)
& W; T8 x8 e. P6 x% E. `- h% C8 O1 v
{
5 m3 J" {9 v4 \- R4 J# z
paramSet.srcBIdx = 0;
# M3 d; j# T$ a
paramSet.destBIdx = 1;
( D: ^# B+ d" [) X
paramSet.srcCIdx = 0;
3 z3 }$ L9 `3 Y( [
paramSet.destCIdx = 0;
* s$ h. T! f* M, |. _+ m/ c
paramSet.aCnt = PING_PONG_ACNT;
1 |, k/ W1 _! H) L9 M; f% X
paramSet.bCnt = PING_PONG_BCNT;
3 W% j! b1 V2 N$ P. |
paramSet.cCnt = PING_PONG_CCNT;
/ Q0 \8 L3 v* n* \! Z
5 Z h5 F( H# _ {; [& Y
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 W0 t) z5 S r% l
paramSet.bCntReload = PING_PONG_BCNT;
+ z. y$ K0 y3 A. \ d' m# e
9 t: [ a( {5 ~! `6 s& J
/* Src in constant mode Dest in INCR modes */
; ]) e; y4 `* d
paramSet.opt &= 0xFFFFFFFDu;
8 W! \ I2 M$ `/ Z0 {5 t$ W: z
//paramSet.opt &= 0xFFFFFFFCu;
7 O, ]6 r, O9 n3 a8 ~0 `
: I0 j: L, {7 b
/* Program the TCC */
% n2 X3 |' V0 f
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% Q+ K2 s0 p! n* c# `
- y- H0 j: H& Y
/* Enable Intermediate & Final transfer completion interrupt */
" _( \0 {. e, j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, T4 _) J0 `$ |1 ]1 R2 p* i% [
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# w0 Z: r5 L h' e. f
; Q$ W9 V: o: ~; a+ A5 p- q
/* AB Sync Transfer Mode */
% E* ?( p+ d0 N( n5 l* }+ R k% k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 P! Z+ V. J4 Q+ O2 k) T( W: ^+ R
* k' g* P; h! g3 U' c0 J* i3 V
/* Program the source and dest addresses for master DMA channel */
- j* H7 [6 @7 a: b4 k9 q9 V" _
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: c+ h4 H* Q+ m. V5 j( Q
paramSet.destAddr = (uint32_t)(ping_buffer);
1 _; ^) l# X& V% e+ w" X5 j
9 H. L0 O: }* ?+ ^/ ?
/* Write to the master DMA channel first. */
9 ^& U, I. j; l4 M. V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; k5 y! Q' g) S$ `" d, ?( `
}
' u* V8 G/ ]8 Z& L: U4 u/ G1 J
# T3 @7 H; d* O! P- x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# M; ~$ I4 s% x: B
* Y! {/ j# D) Q1 B/ @; Q
if(result == EDMA3_DRV_SOK)
/ ~& ?$ h( \/ B) s" r ~' F
{
6 a! ~) n. j, U& c
print2arm("edma3 driver init success.",0);
# n# C, W% T. e. L, w1 M6 M
}
) ]0 H! s9 P2 R& g, t. T
}
# z4 Q/ l9 B% h
- ]' H3 J0 e5 }/ u6 _; J
q: J0 v% D$ G& X! t/ x- }
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ E- h. N$ U) g/ C; ~: w
# }) g) {8 X* W% Y' a0 m0 b
: t/ f) Y( } @( x. B. R8 G H7 H
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
# r7 L- @9 ]$ ]1 M6 ~
每次DMA传输完成后都要再次使能传输
1 D$ q. x4 ~/ B* o# ^! S
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4