嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 w1 W2 j. t H) R5 k, M
#define PING_PONG_ACNT 1
% L( u, V \* @; Q- ?$ `
#define PING_PONG_BCNT 8*32*40
2 @/ [2 W5 @* x
//#define PING_PONG_BCNT 1
: |# l/ e# G" y7 u2 E o Z B# s1 V
#define PING_PONG_CCNT 1
, ^# N* i/ o' z r! v2 o
#define MCASP_BASEADDR 0x01D00000
9 C+ v1 b2 p: d' R& Q8 J
#define Mcasp_RXEVENTQUE (0u)
" W% D2 J, N& |. |
1 Q7 `' v- g1 y+ c- G( u9 z% w
/* OPT Field specific defines */
; R: Q. m* i3 t& R, ?. G
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 T/ Z" q( r6 n f2 q& L
#define OPT_TCC_MASK (0x0003F000u)
+ Y/ R- w: t. u# m* ^( w
#define OPT_TCC_SHIFT (0x0000000Cu)
8 I- c q+ T3 b% P
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# P e, Q: X0 n
#define OPT_TCINTEN_SHIFT (0x00000014u)
Q* t- z; J0 h. b; o$ v/ _ `" w. `
& M) c" W: m3 p' X% J
char ping_buffer[PING_PONG_BCNT];
* \! f7 Q% X( }" Q) V
char pong_buffer[PING_PONG_BCNT];
. l- ^7 t2 K! ]9 O3 }
. n) f5 z; z* m8 e
5 d# P4 f v. G2 D( H
: B: F @ J' H# d# f+ R% a
- O: ?) h( k7 c) f
static void ys_edma3_init()
_/ j1 V: \ _# r" n. H1 Z4 p
{
6 |' H% \$ Z) Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- n/ Y+ Y2 Q% b) M ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ t/ J+ s( N* d) W" V! b; a
EDMA3_DRV_Handle hEdma;
+ W5 S1 M" O( k. [7 y
uint32_t chId = 0;
5 K% u! m! \# [7 S4 ?5 l2 j
uint32_t tcc = 0;
/ k, D8 p' Y* u: {8 ~! `
- ~9 R R' \5 `% W! H
print2arm("edma3 driver init...",0);
( E) \( D Z- e
7 }* ]) R- {; ]3 u' j
hEdma = edma3init(0,&result);
8 ^9 `2 w8 I+ Q' F2 o# f
if(hEdma)
0 B0 L9 D1 _1 ~8 l7 j' [0 ^0 _
{
" z8 l& {; p) [/ p' W
print2arm("edma3init() Passed.",0);
4 D( M6 F7 j/ Z) `! {8 h
}
; A& I+ _( @8 Z/ P- R
else
: \8 k* P8 J" D5 f) W( z
{
8 \2 `9 i+ Z. b/ n0 O& L
print2arm("edma3init() Failed.",0);
# U+ A- q' l% Z( y$ t! S
}
" g- y9 i4 g+ v1 \. N
+ a5 M/ {' Z8 ~0 W/ z
if (result == EDMA3_DRV_SOK)
) b& @$ y6 K& [- G2 i1 ~
{
6 _4 [- L- ~, p' Z9 C+ w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; z. [0 G4 G% W- J0 G
(EDMA3_RM_EventQueue)0,
7 b3 ]- p# {7 d ^, z2 W2 x
&edma3_isr, NULL);
$ A' S7 F/ I: }% U: K* x0 q) b
}
% |0 n3 X" k) f4 y# z5 W: X
* Y5 B, b. w M/ M2 \5 s8 E4 s: F
if(result == EDMA3_DRV_SOK)
/ l! i3 R8 x/ S9 x- p
{
' r0 f1 W8 {5 o* G5 l9 a
paramSet.srcBIdx = 0;
/ ]- O, h" `/ F$ Q
paramSet.destBIdx = 1;
, ?2 r8 Q1 H/ C) I# d7 N, f
paramSet.srcCIdx = 0;
: o( B6 t: V7 W" P7 V3 t a2 f, X0 l
paramSet.destCIdx = 0;
; f2 d+ d# O$ i! [& a
paramSet.aCnt = PING_PONG_ACNT;
* G) n4 A( h" t5 K8 z7 Q" b% m6 ]: x( t
paramSet.bCnt = PING_PONG_BCNT;
M Y' O0 c9 M0 V5 N* U- ~3 r
paramSet.cCnt = PING_PONG_CCNT;
' U! h% P" E; Y$ V6 _3 x
& ^0 i& r- Y$ d. x1 `
/* For AB-synchronized transfers, BCNTRLD is not used. */
- Y; r7 @, V, B& U8 w( |5 M
paramSet.bCntReload = PING_PONG_BCNT;
( S2 n! V1 A! V: E
. f: L, g$ H4 T" K, U z
/* Src in constant mode Dest in INCR modes */
" b m/ u! C+ l& F: q
paramSet.opt &= 0xFFFFFFFDu;
9 f; S! q. L, Z2 k
//paramSet.opt &= 0xFFFFFFFCu;
/ B( P. p {( O1 `, n
* n T; [: a" g
/* Program the TCC */
, L* ?( I, k/ n, e7 y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 T( }- |/ H7 W6 i$ I
( b. Y: Y) B. V5 _8 ?$ S8 M" n0 U
/* Enable Intermediate & Final transfer completion interrupt */
$ h! I0 k. n5 K8 q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
r) @9 i( |9 H; t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 }8 E( o5 x& L9 l/ O- o8 V4 M
' }# `8 A. ?: `3 V4 O9 m
/* AB Sync Transfer Mode */
2 W* V9 Y/ l1 e: L6 z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ n# `* B$ d/ T+ p# u5 d$ m
. a9 g: `! c8 x8 ^% p; [
/* Program the source and dest addresses for master DMA channel */
6 ?4 w- l5 z8 `( l, C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' ?- U$ B1 V/ B9 d6 B, p; u
paramSet.destAddr = (uint32_t)(ping_buffer);
" m& N0 Y' X$ |' X) `
! n* h0 j0 |7 g8 U
/* Write to the master DMA channel first. */
7 u0 D% }3 r0 t' U0 p* R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
L4 m" {' z) s4 V' L
}
4 a0 ^% V5 u& Y3 C6 @: _0 W
M4 r7 ^, v, y o- ]! D0 l+ D: Z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 w6 r% I0 d, n+ a) S0 _1 d
: z$ E9 Z# R) @$ J/ M
if(result == EDMA3_DRV_SOK)
/ p+ g+ t! A3 R8 u X6 b. T g
{
$ i+ R' {3 s% T# d9 C3 }0 m6 {& l- S% v
print2arm("edma3 driver init success.",0);
8 p' T$ U2 A/ y* n, b8 v
}
9 t4 j2 e4 m. V
}
1 l$ V5 I' x; l ~, {
: h: w2 p8 Z! I9 y
3 c) E( N& t! _ S, a: K8 e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. A9 |2 [, b/ p6 I
' j& A- T+ F1 \, B; |, J6 }6 g0 l; b H
2 x) d' M( i" m5 r' C7 f& i* [
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% f) n1 k& C) K9 e! G- z7 z$ Q3 s
每次DMA传输完成后都要再次使能传输
, b4 ^1 J# i3 t. [$ `
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4