嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. Y5 U6 e c. s5 y2 _
#define PING_PONG_ACNT 1
8 D, }, G1 X- Y- F( r
#define PING_PONG_BCNT 8*32*40
# @. v# R/ }( \! X& V
//#define PING_PONG_BCNT 1
9 t: `4 z6 q4 a0 j4 G; p( J
#define PING_PONG_CCNT 1
( _: c$ h6 x# e, i4 r
#define MCASP_BASEADDR 0x01D00000
& O3 m2 A8 `2 Y4 X* w+ v& N( j9 @
#define Mcasp_RXEVENTQUE (0u)
# q/ j1 @) X3 z% p. y6 x) Q" p
9 s+ k+ u1 j9 \6 h1 @6 S( H8 g; H
/* OPT Field specific defines */
1 Z# W+ M9 T8 j
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 S: ?) x% r1 S2 B$ G: B8 v; n$ v( r
#define OPT_TCC_MASK (0x0003F000u)
% q/ p6 l2 {$ @& E8 z8 W5 b
#define OPT_TCC_SHIFT (0x0000000Cu)
# y, J, @4 i( G& y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: K0 ^2 m7 ?& _+ k# n: M- z
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ s3 F7 Z1 i) P# j
' \; w) X2 J( v
char ping_buffer[PING_PONG_BCNT];
: n* x- E: c6 J3 @/ {6 ~
char pong_buffer[PING_PONG_BCNT];
y5 \ s- S. w& T [! L/ b
3 v- w! }2 J D* |6 T
' G( ?0 A4 v5 z# v0 V* J- r
6 @4 f8 T# M) k/ o' ~
' c/ n3 U& D$ V E: p" r9 |
static void ys_edma3_init()
. s& e7 u# Q1 q) J" ~9 X
{
4 x/ z: O4 ]" F7 U; ?' T
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' a( f4 p P, x: n+ X0 o- L: j4 G
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% u4 G! W3 e6 q* d$ `
EDMA3_DRV_Handle hEdma;
3 Y& A% Z- E7 w9 Z8 y; C$ T
uint32_t chId = 0;
. _7 U$ H4 ?) e3 @1 X8 y
uint32_t tcc = 0;
$ x. N$ o2 w( A" F5 l, q0 t
" T% m* I. x# K+ S6 d( u+ W7 v
print2arm("edma3 driver init...",0);
* Q1 k6 u4 i6 k
9 E# Z' y9 I4 G( l+ s, ~$ A
hEdma = edma3init(0,&result);
4 n) t9 [. ~* G R
if(hEdma)
% {% t; n/ H% J2 ?
{
5 w! F" ?# d& E; O, H& l8 D! j1 ?
print2arm("edma3init() Passed.",0);
l% b2 g! X- Q: Q, m+ k
}
$ D7 r: {# X9 u* D- q- Y
else
5 ]+ u8 C. ~- r. w E0 w: h
{
" p( p/ g6 e, i1 C- u
print2arm("edma3init() Failed.",0);
( I' X [" j8 L) P- b; R0 C. i4 r
}
; ]( f' A; Y" V
8 i! _# w9 X U8 ~4 p
if (result == EDMA3_DRV_SOK)
' F4 y6 F4 Y K
{
# O5 j5 Z3 J ?# Y/ R" R+ m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ h, b' G6 J3 r( f
(EDMA3_RM_EventQueue)0,
# k+ ~0 p7 X" D) p {
&edma3_isr, NULL);
; Y) w& \- u& H' r4 \
}
$ \. {' F: x4 l
- {; [% G/ Z' V( a* E3 n
if(result == EDMA3_DRV_SOK)
; {: [- u* z: Y% ?1 b- C
{
: h a4 s; G; l/ V. _. v
paramSet.srcBIdx = 0;
5 C3 z8 t; H* r+ C# B/ o8 w. K
paramSet.destBIdx = 1;
6 j6 a+ ^( f1 ^7 h/ M0 D
paramSet.srcCIdx = 0;
' _" P* g3 M* U
paramSet.destCIdx = 0;
& x% f4 J+ u% T) o
paramSet.aCnt = PING_PONG_ACNT;
. c4 y' t+ _8 D0 |
paramSet.bCnt = PING_PONG_BCNT;
& K! f4 x/ `- L+ g, e7 _, H' r& k
paramSet.cCnt = PING_PONG_CCNT;
V' A I! {2 {2 o) K5 T
9 I& U% Y4 m& C7 m# N* w
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 z, E# U1 y' e. d' ^
paramSet.bCntReload = PING_PONG_BCNT;
% J8 M" v8 L) m) u
; j7 D, \, n7 |) s. _, W5 O
/* Src in constant mode Dest in INCR modes */
$ ~- @2 V t- S
paramSet.opt &= 0xFFFFFFFDu;
; a v- A" F! Y+ U: b$ o+ C: U
//paramSet.opt &= 0xFFFFFFFCu;
) _: a, _: ?/ H( ~1 b3 K5 Y
* T" l3 S9 K, X& {/ e
/* Program the TCC */
( n3 p/ }' d' |5 I3 b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 F& S# v6 o0 r a3 U# N
6 K8 d! j; g3 A; T# l6 C; { Z- |
/* Enable Intermediate & Final transfer completion interrupt */
0 U- O# _3 ]' I) l2 x
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 \' d; z' f; j& l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 ~ U# |4 z% Y% h' j3 H4 q. Y5 I
4 T0 k( |0 x5 T& `/ l
/* AB Sync Transfer Mode */
$ B! K$ K& P3 r9 r6 H
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 o9 A! E8 n% a7 D* h% U
& Q: e5 ]# N) e' i( U. K
/* Program the source and dest addresses for master DMA channel */
" O* U: X- g- i& B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 a w3 `% D" _* \. O
paramSet.destAddr = (uint32_t)(ping_buffer);
7 f+ @/ \$ a- @! F
/ P) }! R6 e2 n) H4 [
/* Write to the master DMA channel first. */
4 k% b% A2 q6 B9 Y# s
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! s, L- F `) P% J/ z
}
" r/ W( j- t9 M0 @
3 R2 W* g" X8 U6 F1 l. y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 S: q6 q; i; t: f: b) Z, p# j
L6 A( k/ r# q, M' ?" Y
if(result == EDMA3_DRV_SOK)
8 u. G( [+ U: o/ |! l k5 H
{
; k3 X- G. n+ u) Y
print2arm("edma3 driver init success.",0);
% X" _6 z d- ?5 W' g3 [
}
% H5 @/ T+ n6 [5 {4 Z1 m8 _* p; F
}
( H/ ~3 w1 G" g# s: o j# F
* y/ b# I5 n' I1 C" O4 L( h/ F+ H
2 p' U; S& Q: L7 k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 `2 d: {9 x }# ?, H
' h* N6 Q( Q0 ~0 u
( D: `3 s6 i; n! P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- l E: g& u7 A: a- O
每次DMA传输完成后都要再次使能传输
: \9 M; a$ f4 s/ K
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4