嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 z8 Y# Z4 E0 b) b: g$ ?
#define PING_PONG_ACNT 1
3 Y) w4 |' h" i/ h9 y1 t8 p$ W" [9 j
#define PING_PONG_BCNT 8*32*40
" @3 e% {: z) `' `
//#define PING_PONG_BCNT 1
0 x# h, r% ~9 f/ V4 x7 F
#define PING_PONG_CCNT 1
1 W3 t9 l/ t# A+ x: ^
#define MCASP_BASEADDR 0x01D00000
! x# N5 W+ s4 x# |. W, V& V* r1 N
#define Mcasp_RXEVENTQUE (0u)
/ `% X4 t X A
$ u: K1 N1 {+ i7 D9 b
/* OPT Field specific defines */
1 S$ s( i2 I) h* D0 h
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& _" E/ T3 `6 M0 Z
#define OPT_TCC_MASK (0x0003F000u)
3 S: f) L. D% h( {
#define OPT_TCC_SHIFT (0x0000000Cu)
$ r8 O% h$ ~- K5 h1 l
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& T" K5 w$ o& G) R& Y
#define OPT_TCINTEN_SHIFT (0x00000014u)
# X P9 X( g$ C0 p9 {9 J
1 e: j7 F! l0 E2 U) H* ]6 j
char ping_buffer[PING_PONG_BCNT];
7 |3 R0 i6 ?/ A$ f
char pong_buffer[PING_PONG_BCNT];
" q# K9 L) d1 G5 v
) K% u8 V9 c2 u8 ~- z) l) t
3 A5 Z; i- Z& N' A0 C2 R
( e& [& d6 \* E; m5 Z) O5 K, q
6 P; p" M4 o6 Y6 a# B8 e
static void ys_edma3_init()
$ U5 g. ]+ u: \ Z; t
{
" e- O) A$ d7 O
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
d3 e/ }: k, k$ p
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% H. ~# U0 K7 j. T& A1 m' f! U) ?
EDMA3_DRV_Handle hEdma;
$ @+ B0 d, ]0 _: c1 ?! y1 ?
uint32_t chId = 0;
( M8 {. z$ J& K
uint32_t tcc = 0;
T/ ]4 U# i( R# H
. s e% v8 A/ A2 R6 J6 Z- ^" G( D
print2arm("edma3 driver init...",0);
* j; c( S. a0 c4 d ~
3 h; m& }. U" o
hEdma = edma3init(0,&result);
2 G" R# g8 N: p# o7 q+ v
if(hEdma)
& ]; c/ B9 h, J/ t0 \/ L" i7 d' T
{
7 A) `' z2 }+ J
print2arm("edma3init() Passed.",0);
' q0 N) R% ]7 G' x3 z$ o; K3 \
}
7 y, G, r. e1 `2 U
else
2 Z' M6 Q0 i! b# U& E
{
% a: H2 h% j2 d
print2arm("edma3init() Failed.",0);
2 }6 V$ R B5 |5 w
}
/ m! r$ D; k5 H, f% e3 @9 D6 H
, H6 _% T% P$ i2 K9 _2 J9 O8 S; G
if (result == EDMA3_DRV_SOK)
D1 C9 V( i$ x3 f; n# c4 i. B
{
( N8 @) h* U5 c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( w% E$ k4 N- \4 A. p) X( y" \4 ?' h2 Z
(EDMA3_RM_EventQueue)0,
) x5 h' ~$ G/ W; e6 j
&edma3_isr, NULL);
0 ]6 P+ i- `6 c1 ]- ]& [0 \. K
}
! m ~9 k* l1 \6 |7 S/ ?
; Y2 [& D& j* s6 U$ R L; H2 K2 k
if(result == EDMA3_DRV_SOK)
) ]4 R# \3 x3 L: w, N
{
; i" q, S- X [; F( q$ j" g$ ]
paramSet.srcBIdx = 0;
, x/ p. j; F4 a1 e
paramSet.destBIdx = 1;
5 [' Y: g/ Q, q% i
paramSet.srcCIdx = 0;
/ k! W) I$ G) P, x2 O* v8 L S( b
paramSet.destCIdx = 0;
3 b. m7 n- g/ h" @. n0 J
paramSet.aCnt = PING_PONG_ACNT;
- Z% v: M1 _. a0 ]8 D& R
paramSet.bCnt = PING_PONG_BCNT;
. C& y5 J5 X7 U' {$ N; Z
paramSet.cCnt = PING_PONG_CCNT;
0 m7 D( j- N! p& Z5 ~5 B+ _
' y) o) V( m! H3 L
/* For AB-synchronized transfers, BCNTRLD is not used. */
) n. M5 H) \ S) t. L( \3 ?! _* }
paramSet.bCntReload = PING_PONG_BCNT;
( \# M4 N; W* y$ C0 k
; B/ |7 K2 q. }# a$ R7 t: s
/* Src in constant mode Dest in INCR modes */
- O# A* z4 I$ S! K* H. P
paramSet.opt &= 0xFFFFFFFDu;
: f8 }2 c: z3 o/ O% N! I
//paramSet.opt &= 0xFFFFFFFCu;
" h* { D" Y8 {0 C
, c5 d ]) b5 ]/ o4 p1 s5 t
/* Program the TCC */
5 M; r% d) w/ \( Z I* b' @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 Z8 y ?+ o) @/ ^/ A( Q
2 I) v" k- a) X' ?; ]
/* Enable Intermediate & Final transfer completion interrupt */
0 Z) E# K. U4 K
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% F3 G+ x+ z8 N3 P1 s6 ~
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; a# a$ Y9 r) }- i
9 ]; o! d) j9 Z4 N+ a4 O
/* AB Sync Transfer Mode */
1 z) T' D: v- t; e& O$ u6 D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 `6 J5 `; f3 V$ ~( g
" g7 I! A+ I" g3 f7 |' S
/* Program the source and dest addresses for master DMA channel */
* u/ |% L) l" O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 w, ?. b/ L2 t
paramSet.destAddr = (uint32_t)(ping_buffer);
# M5 n# o& |3 b8 ` a
& j) o4 H& L8 U
/* Write to the master DMA channel first. */
( u( r2 j; Y2 o0 a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% c$ P& I) M6 h3 G; P: o
}
6 m9 i& [( j7 Z t: J
# H7 n l9 y: t4 N/ \
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% L3 u O0 h2 e6 O a
- [1 `/ ^8 M& e5 H
if(result == EDMA3_DRV_SOK)
3 c2 x8 u) ~- e; T
{
. @8 f" {# @/ i
print2arm("edma3 driver init success.",0);
, R1 |( v% v' x& f+ Z: ~4 M a
}
$ H1 z4 ^, u+ t4 ]
}
! O4 M, ?( k) |! d% }
, m4 [( G$ e8 S1 \) l
1 F, h% Y( {4 n' {+ `+ `. c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 U0 r! F0 b9 J! l C
' I- \# _5 i0 E8 g+ K# q4 f
3 L+ p- C' i6 {# n% E) w
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% _. f6 V, _' @1 v8 S I
每次DMA传输完成后都要再次使能传输
) K( E: v8 ` f! X
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4