嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( }0 x V- a9 b* P/ j; Q0 ~
#define PING_PONG_ACNT 1
+ t- e! Q) |9 {! b- n. x0 l* l
#define PING_PONG_BCNT 8*32*40
3 X4 l; }% ]/ a0 i* r' n
//#define PING_PONG_BCNT 1
) S' H3 p- N% N( m' |( h
#define PING_PONG_CCNT 1
8 Q. {# l4 M2 ]+ N
#define MCASP_BASEADDR 0x01D00000
' ~ q' _1 S! E+ y
#define Mcasp_RXEVENTQUE (0u)
+ U3 u1 n" v% i* p
, x, c3 g5 B9 o
/* OPT Field specific defines */
5 }5 |8 V8 J" A8 t$ f
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 z7 V# y% N2 G# Q) e: X8 e, ]& C
#define OPT_TCC_MASK (0x0003F000u)
9 t$ ?1 C) e8 D) S( Q; R* F; l, a( y
#define OPT_TCC_SHIFT (0x0000000Cu)
# m: \7 d% J1 S# r' Y. z& Z& p! n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 Z, [4 ~ K5 p2 x+ x. u4 o
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ g5 q$ e! ?% q
, Z2 \, h$ k& w; ?9 t. O
char ping_buffer[PING_PONG_BCNT];
$ L# w. R7 g4 K
char pong_buffer[PING_PONG_BCNT];
- A/ q- f* ?% L- H
; M# }6 g \8 H) [
3 n4 M- z' e T$ Q9 G' C# C$ p
# n c- F+ d0 t7 l. g* m
O( ?6 X: H. R0 s) r
static void ys_edma3_init()
0 B( `% l2 `6 l. a( g; |: u/ J
{
2 ^" e1 _! X7 Y& B2 M3 R" ~& d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; a/ W* }1 }# _6 ]- a- Z1 c: v, z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ \9 ^& ~( c) Q# u! K6 B. [
EDMA3_DRV_Handle hEdma;
6 R* ]. U" m/ [/ N5 c: S
uint32_t chId = 0;
* t% o# v0 f( \5 m' `1 B
uint32_t tcc = 0;
# D" c( U& S' {3 c; D6 A# W
8 U, `5 k2 E2 D. J) B" f( B+ A2 W; C
print2arm("edma3 driver init...",0);
2 q8 e( K) w: {& x' u) T# ~
" t. ~6 f$ n8 K( k6 p+ D" O/ i1 g
hEdma = edma3init(0,&result);
" z+ W" g% Y8 r+ Z, L) }
if(hEdma)
; Z0 f" k. S; e' g5 ?+ F
{
6 [; J1 z9 [, G( F+ e( Q6 q( I! t
print2arm("edma3init() Passed.",0);
5 y$ p$ q- M3 x! F
}
9 ~# c- }' X4 J1 C8 a" g- q4 O& D
else
# ?5 Y: k0 w; |. K V
{
2 h& L6 [7 b9 v4 Q9 j0 e: k
print2arm("edma3init() Failed.",0);
% {% P- A4 H( m! ?3 n
}
+ U, ?( d9 _$ t6 z0 p* k
6 e7 s! e3 `( _% ^# |' V' g2 x5 z
if (result == EDMA3_DRV_SOK)
w: @+ g- ?9 D& i+ t
{
7 d0 ]& H) Z" l: \6 f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. ~3 F" {$ u7 \2 Z2 m
(EDMA3_RM_EventQueue)0,
4 w& }, P' B+ \5 ^, V& h
&edma3_isr, NULL);
7 y$ `- d0 Q6 |
}
& }2 Y4 r1 c' D" o/ n
0 _$ P0 w4 g4 m3 {5 O4 Q* ]" a
if(result == EDMA3_DRV_SOK)
% U3 _& Y# ^ k+ I: Q, _
{
2 D- x3 C" Z8 s
paramSet.srcBIdx = 0;
% M, F& |9 m% h2 k8 n
paramSet.destBIdx = 1;
% F: d# R* ?& O
paramSet.srcCIdx = 0;
x: K% ]( N6 ^5 K) _) M
paramSet.destCIdx = 0;
3 }% T: s2 F. O A" t: \/ k4 l0 N
paramSet.aCnt = PING_PONG_ACNT;
2 [" ~% y: g( q( X: ?
paramSet.bCnt = PING_PONG_BCNT;
( v- q* m( ]+ g! u
paramSet.cCnt = PING_PONG_CCNT;
: S, W; O3 i, [1 `- i A$ V
5 F' e; d r5 L8 a9 u
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 d& k: k: _4 ]: C& S# F* }1 J( r
paramSet.bCntReload = PING_PONG_BCNT;
: q& P& P$ w M. F( ]
& Z! Z2 a7 K' I4 P+ ~
/* Src in constant mode Dest in INCR modes */
) p! Y6 H- ]3 |
paramSet.opt &= 0xFFFFFFFDu;
4 x: n* t. I) b5 |7 p& ~
//paramSet.opt &= 0xFFFFFFFCu;
& E! l- ^# ~$ j& }' {' Q
. H& ~! B: R# L0 g
/* Program the TCC */
a7 z [$ a( E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" \& I# t" N3 u" W9 Z7 G
" r6 g: j3 g: j. D0 {; M1 O- W1 t3 K! D
/* Enable Intermediate & Final transfer completion interrupt */
2 X' S6 | C9 p- S, ^( | m$ g
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 N" J; I2 u/ o& J( z6 ]9 p
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
^ b3 s5 `7 Q6 A( G
/ u/ w3 {# j# N5 K/ n! \5 J8 ?, y
/* AB Sync Transfer Mode */
' L# _4 S" l. B1 r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 h f: \$ q. k& R0 k
2 C& |# E8 e( V9 b K+ L0 |$ i. K
/* Program the source and dest addresses for master DMA channel */
- g9 N L# p; H' M0 k
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 R5 ~* n5 k' {
paramSet.destAddr = (uint32_t)(ping_buffer);
: R3 D, N u7 ^" m, P9 T9 ?, i
, {' U( H$ A+ W! D8 n
/* Write to the master DMA channel first. */
' E8 [/ V9 S5 v; A7 Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 r# E7 P0 G8 l
}
2 {9 t; N& A# N' }
8 s% K, `" f) u2 n4 ]
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& z' s9 @7 m" z/ H
, K$ X1 m- s. N: Y8 v4 C
if(result == EDMA3_DRV_SOK)
. u- M% B& a+ ^5 p- @
{
; u0 ~' ~2 t, |
print2arm("edma3 driver init success.",0);
( T# D$ V2 f3 ]0 i7 `% }$ T
}
5 M- R b4 \7 g& h- k% Y4 k6 [
}
0 T# ~/ U, }' F8 g' r1 v' c
1 i8 @2 ~, E* I( ~
: r: V+ v. t# ^) E- U; | T6 v2 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ [! w1 v; Y* s+ Y8 @% K1 `
1 J% ~) q/ W$ Q) C3 @
# P# I3 e3 P" ? M+ ^
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( h- m* j# k% M; W5 }' t: s
每次DMA传输完成后都要再次使能传输
) @" [" r3 p _- W ~: F0 c G" c
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4