嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 g! D6 N d' T; L E U- f' I; c
#define PING_PONG_ACNT 1
! c5 F8 a2 A d/ X# M
#define PING_PONG_BCNT 8*32*40
. v6 |2 t% K- I
//#define PING_PONG_BCNT 1
4 ?- \' j. r! N7 z) c6 [# v
#define PING_PONG_CCNT 1
- C7 ^8 @0 v+ O
#define MCASP_BASEADDR 0x01D00000
4 v) f# B8 K! e0 P: X" H
#define Mcasp_RXEVENTQUE (0u)
' K' n, s% K; H7 n! ]( T
5 R6 h$ k7 a4 V1 }, M
/* OPT Field specific defines */
9 k5 c6 d: {& F: \- }; i5 t
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: U5 p' { y2 ~2 T
#define OPT_TCC_MASK (0x0003F000u)
% B+ ^- p$ k' }# g7 r! s
#define OPT_TCC_SHIFT (0x0000000Cu)
- A1 I0 r" Z% G+ U+ R6 q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 v2 T* ? K3 S7 Q; e
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ q% J0 ?9 [9 k2 t8 }3 d2 E/ `
$ Z( S0 ]- Z: r& C" p% @& [
char ping_buffer[PING_PONG_BCNT];
* M3 N+ y; w& K
char pong_buffer[PING_PONG_BCNT];
' P; }: D, Z* Y w+ p9 m: W
/ b- q7 |6 \/ H; r- T: q( y
* p3 ~3 {) C! n0 X. n q$ O0 _) A
$ X5 d1 `* D2 t _% Q$ q7 l3 e) _
8 n( j6 U0 W, V, ~. {
static void ys_edma3_init()
z+ p- q+ N" L9 A
{
1 w; q: L$ g3 ?0 u2 ~" H; a
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( O2 G7 w1 {7 |% C' f: T% R! I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& u( V" y: r: Y8 F/ b8 C& s7 {
EDMA3_DRV_Handle hEdma;
; E6 i# w2 [! e) Y# y1 s* @
uint32_t chId = 0;
$ b: O Z! x& x* P
uint32_t tcc = 0;
5 _& ?5 c. r( B: ?# m- {9 c* y( o( ^
0 o# D) `4 r5 P
print2arm("edma3 driver init...",0);
6 I6 q2 r, r0 L; x
0 W$ s8 M5 t9 b# g
hEdma = edma3init(0,&result);
" C3 z( B5 J' O# d% j
if(hEdma)
8 ]4 g# h5 p, X: d. R8 w
{
% y5 u$ A p! J" ^
print2arm("edma3init() Passed.",0);
3 ]/ Q$ _# r Y8 b+ W# o# h
}
8 |: y5 s* u% f* A
else
( J" v# y2 b' E" _& q
{
* o% \7 Q9 P; `9 a8 B$ G6 P4 R
print2arm("edma3init() Failed.",0);
# c7 V- [' k# W' b+ Y
}
8 G$ m+ B/ R' R: H4 S- G8 r
& A- k7 M: z& J; m d
if (result == EDMA3_DRV_SOK)
' S6 I! D, H% ?+ c% g) r, {
{
3 k) @* x; s* y2 r
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, |3 T4 e- R0 I! G5 `
(EDMA3_RM_EventQueue)0,
' Z! H6 }$ H% |# }& M) C
&edma3_isr, NULL);
! H* y- }: {! n1 t5 m r+ R9 Q9 [
}
. ]) }8 V% H7 Y' [" F4 T
# a* O. B m5 r/ c) B
if(result == EDMA3_DRV_SOK)
* o9 |, o3 `) _9 y& Y S
{
: v) q2 B% t3 k4 e7 H. o& e
paramSet.srcBIdx = 0;
* g8 N& B6 A; S9 e$ Y
paramSet.destBIdx = 1;
# g$ }! J( M* h% K
paramSet.srcCIdx = 0;
% n% O3 f% [; ^* R8 h& J* P B5 K
paramSet.destCIdx = 0;
- r$ }2 V) d' S, b: V$ L% b
paramSet.aCnt = PING_PONG_ACNT;
( o7 H' Z) A& f4 [2 o4 @
paramSet.bCnt = PING_PONG_BCNT;
, J9 J6 g% ?) J
paramSet.cCnt = PING_PONG_CCNT;
9 n8 Q4 s& k. K! s; \, g
! e3 I/ ~ Q2 u. ]6 m/ E& ?' Y
/* For AB-synchronized transfers, BCNTRLD is not used. */
% t8 s0 ?: O" @+ z5 P$ ?0 t
paramSet.bCntReload = PING_PONG_BCNT;
: c4 G( m* j" U" w5 I2 L7 n
' j6 n3 x. s, ^+ e
/* Src in constant mode Dest in INCR modes */
0 k H$ L( V! O% p
paramSet.opt &= 0xFFFFFFFDu;
. P7 r* a6 w2 x: l5 d7 C
//paramSet.opt &= 0xFFFFFFFCu;
: ~6 D& T# g) [% T: Z6 F, C7 v
5 v) _% ]$ c6 E$ ]7 V
/* Program the TCC */
& C! f& E" \7 @; s
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 g5 R! m9 u- K2 |' N) E1 N/ d7 }
, w) A( Z x2 V& |
/* Enable Intermediate & Final transfer completion interrupt */
K& H+ X9 H! T- ~# u4 v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' A/ {3 `7 a) v8 F& O
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* E6 Z- I5 ?8 M+ E: S r6 H' Y
5 P- u0 U7 q- _: g* R; d. m
/* AB Sync Transfer Mode */
1 h- _, [ z& {* I, t6 ?0 ^ }" ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 w! P+ Z* w7 f4 Y" h* [
8 O, z: u6 K. z( g0 Q
/* Program the source and dest addresses for master DMA channel */
+ O/ r# v+ u m0 X B2 ]
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ c0 _2 j N: u- z
paramSet.destAddr = (uint32_t)(ping_buffer);
7 V& r$ e# p+ k3 T8 e
1 d8 g9 w% X2 r
/* Write to the master DMA channel first. */
& ^7 g: Y( t0 B/ _
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
* _* ?( ]7 [- O7 {6 s: M
}
$ I- L! T. u1 k% x+ H: Q7 }
! D% r) m. V ^2 D: ~& p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ]' j' y9 X O& z. w
6 p A2 L" {, F+ u- S2 C. j" h
if(result == EDMA3_DRV_SOK)
; K" Z8 \$ C \: c' Y4 |% Z4 t
{
: N+ w4 U' J4 r( T, D
print2arm("edma3 driver init success.",0);
) L/ j* K# M' b3 x4 ?4 t9 k
}
) D! S; r4 R4 i; d
}
! v6 T& ~6 n( ^* g
9 J' W" K' K% H- L
( F) M, w( U( r2 T( c; O& E: U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 o- I; B6 b! R. ^2 j/ x
9 s% ~& d: O! ?" I' N) Q; q
! h F* {& e! h8 X8 \- u" p0 U: z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 m& x3 ^: a; a+ ` k( J+ z$ S5 J
每次DMA传输完成后都要再次使能传输
3 B5 N/ o8 P+ j9 v" D/ |+ R
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4