嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( M# @/ C& Z# ^8 B8 ?; G$ A
#define PING_PONG_ACNT 1
1 b) f, ~; H8 D* j+ \
#define PING_PONG_BCNT 8*32*40
- N6 W: ~7 a8 r8 k
//#define PING_PONG_BCNT 1
6 F0 }5 f1 A3 F1 Y+ n8 j( ]" R# _
#define PING_PONG_CCNT 1
7 d4 F! t) D/ @7 v' N, @
#define MCASP_BASEADDR 0x01D00000
. c/ s8 I- r6 j' |, L1 V
#define Mcasp_RXEVENTQUE (0u)
, N3 a+ C5 E5 l
1 H& x1 T; B5 L+ Z
/* OPT Field specific defines */
% T& f) z+ |- W5 v. g7 H9 ^ g
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! u# Q+ y' J6 c1 G
#define OPT_TCC_MASK (0x0003F000u)
7 _$ y4 M2 n, `* d9 y; B
#define OPT_TCC_SHIFT (0x0000000Cu)
% E; V( m2 S* H7 m& x/ s# x' ~
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 z& ?+ S, {! p/ y u
#define OPT_TCINTEN_SHIFT (0x00000014u)
: `" Y+ d5 P8 j/ i
: f5 ~: \' N4 _, M9 N" T3 W
char ping_buffer[PING_PONG_BCNT];
3 N/ v- T7 Z* B y
char pong_buffer[PING_PONG_BCNT];
C! M. y1 ] \: P
0 Z& a" W+ l) m: X$ d& P |
$ }; U. ~5 `; ?4 J
9 Z! j4 v' a8 T# f7 J5 r% D
! W: c& C* b3 \7 J- w
static void ys_edma3_init()
) i% x0 e; z. Y) k
{
6 @- y! {" [1 q& A( q& U8 j
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 ^7 j; U q2 }6 Y- u: O( Y: `* D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 `" m; C/ y' ]0 D$ j3 H) n) j( W
EDMA3_DRV_Handle hEdma;
6 L+ E* M8 v5 ? ^9 H
uint32_t chId = 0;
3 Y! p, I* h( s; V
uint32_t tcc = 0;
3 U v9 u4 o( _6 x. |' w w
- D y2 o- Q+ V
print2arm("edma3 driver init...",0);
6 W, V& R5 l; g( w: C1 d r
5 T& u' l$ A( k6 M" K) p: M m
hEdma = edma3init(0,&result);
7 X: ~0 h d$ c: T, V) x% e& y
if(hEdma)
, C: i8 ]6 g, x% I) {* r( v
{
: s: [! T0 t3 _$ T- B; R
print2arm("edma3init() Passed.",0);
6 [3 S7 f* G& J
}
/ H p; B x9 w% X' x1 r4 h/ R. \" r
else
) J+ a8 j4 C; j7 D2 D9 ~& n
{
1 i- a) D. ~2 ]& }7 g3 s4 ]
print2arm("edma3init() Failed.",0);
$ B3 ?1 v, T% ~- E
}
. V: x2 I ~7 J
) `9 X0 t2 D5 j: I% n5 Q
if (result == EDMA3_DRV_SOK)
8 R- f$ u9 \ R5 O
{
7 ] a; `( ]+ [" a/ j4 T
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' I# ^3 n3 N+ e& A+ ^+ y
(EDMA3_RM_EventQueue)0,
1 [3 }2 D8 B5 J% C+ f
&edma3_isr, NULL);
$ g5 r. ^/ Z; w8 {7 f
}
7 Q% @% @5 Y- U
* e' O2 D/ G2 q9 c8 a
if(result == EDMA3_DRV_SOK)
8 C0 i1 K2 [! B& _
{
- |8 p' j, ^& T x' S6 A2 H4 F' m1 z
paramSet.srcBIdx = 0;
$ i4 R5 e+ \7 C- W$ F5 M
paramSet.destBIdx = 1;
( f( h; n) A; f( w- t+ J. @( Q
paramSet.srcCIdx = 0;
! z% P+ d; I' _5 w2 F
paramSet.destCIdx = 0;
u, [! o" d5 w* Y! m, Z% D- m
paramSet.aCnt = PING_PONG_ACNT;
# l1 X* n X+ E: h# `+ ? H0 o; ^
paramSet.bCnt = PING_PONG_BCNT;
- |) l( I) s4 J
paramSet.cCnt = PING_PONG_CCNT;
& j+ P& M" U% H% r, a' Z8 F
0 u# T0 c3 _' X+ X6 f) H- o2 |
/* For AB-synchronized transfers, BCNTRLD is not used. */
: b5 m: K5 s, Z [1 @8 q
paramSet.bCntReload = PING_PONG_BCNT;
R/ P* R) ]3 P& U
3 Z- y" x/ w. u5 B3 R( |
/* Src in constant mode Dest in INCR modes */
' a1 c1 G( t+ ^1 g
paramSet.opt &= 0xFFFFFFFDu;
/ w# k$ p0 A, G& H6 e
//paramSet.opt &= 0xFFFFFFFCu;
) [# |( F/ N; n& W
5 {/ ~5 I# l$ f4 @) i0 }- a
/* Program the TCC */
$ {& I1 @( K( ^4 S4 l2 ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 H; M/ y7 k# a4 W6 P5 L
4 a; I& _) q& v- L( f& B4 p' e* q
/* Enable Intermediate & Final transfer completion interrupt */
5 F. ]6 x6 z$ z/ Z" N
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: f# S5 Q$ g ]( h: k: W& R# l0 q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. j0 F. U3 N4 C6 }+ O$ W$ s c
u1 Q( w; E0 p6 v5 h3 ^) H
/* AB Sync Transfer Mode */
0 M4 `/ q# h0 y9 d* L" {, h1 D4 x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' x$ t- @5 e3 l, [; z
; n( x* ^0 _8 d% f2 l& f
/* Program the source and dest addresses for master DMA channel */
1 }- }. e: W5 N9 D! A
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# _$ b; s( Z* G4 B3 W6 Q/ Q" G
paramSet.destAddr = (uint32_t)(ping_buffer);
* _4 k4 ~ D/ A
- M+ r. e6 t) d1 a8 C' F+ ^9 ]
/* Write to the master DMA channel first. */
# P7 F1 v9 ?4 J7 L, b2 c3 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% u8 M4 Q# i: A
}
$ {" U* \# N7 K1 P* f' [7 K
4 c% m/ |+ o1 A0 m! N
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) M# y5 E2 ?( c& g
8 s) `8 z( P+ ]5 C& ]7 G1 W
if(result == EDMA3_DRV_SOK)
% i1 s7 K: w2 r: W
{
8 m. {( Q2 q4 {
print2arm("edma3 driver init success.",0);
; t. h4 p4 u$ T
}
9 l. i! q, n: z+ ] b* V# A% O
}
) O4 Q0 M/ d' c/ D& X
' {; ]2 Y- W" }4 }; h2 w9 j
+ ^. U. u( @* d2 G8 d2 K& z, y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* j2 |" u( O2 \; D' a3 U, P
_$ V# h- m$ y: P5 v
' |3 G3 z: J' z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, A0 o4 M8 z" l! s8 \, ~
每次DMA传输完成后都要再次使能传输
8 u! b$ x7 G( O: M' g( d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4