嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" d' f/ m- C4 x+ K% d
#define PING_PONG_ACNT 1
( q4 `+ W Q" N' ^% Z! b
#define PING_PONG_BCNT 8*32*40
- W$ E8 R* y7 Y% f4 U
//#define PING_PONG_BCNT 1
( h2 O* C2 i" S
#define PING_PONG_CCNT 1
1 C$ P& s/ Z, D' D0 x( ]
#define MCASP_BASEADDR 0x01D00000
8 T2 m' g! j2 F m& X0 C2 |
#define Mcasp_RXEVENTQUE (0u)
( L+ [" y) ~: i4 h
4 {* d7 @" H3 @, u7 P0 X. b
/* OPT Field specific defines */
8 Z( y$ B* M, @& z) e( X. _" P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, j W. D; n0 j' B t
#define OPT_TCC_MASK (0x0003F000u)
O2 x0 F- _; X4 M4 } C
#define OPT_TCC_SHIFT (0x0000000Cu)
! w, t% j; S# o, E# @8 ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ D# i1 p+ x# M
#define OPT_TCINTEN_SHIFT (0x00000014u)
, D/ [; H ?+ `% ~+ B. k
# t6 S3 A# B/ _. c9 X' l2 }
char ping_buffer[PING_PONG_BCNT];
2 `8 `5 @; I C( }& o; I
char pong_buffer[PING_PONG_BCNT];
% @9 z' t3 q+ [
3 Q5 p$ F' j- p6 h3 N
- a0 u O1 _# h6 M0 x P4 b* R
W, O. c4 A6 X) L9 M) n/ G& \. n i
: [2 f$ T' x! O5 F4 |* V& c
static void ys_edma3_init()
$ n! X" F( ?# Z! C
{
* h0 x& W6 u/ F
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ b" ]6 Z8 ^1 G. }: o2 J
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" c" V. p' k4 H3 ^& I, }
EDMA3_DRV_Handle hEdma;
/ a+ k6 `5 r/ H1 b
uint32_t chId = 0;
' b1 U+ J* X; q% r! x4 |
uint32_t tcc = 0;
; \# ^* N+ D( _+ S3 H6 P
" q0 e' ?! \0 Z% O5 i
print2arm("edma3 driver init...",0);
' }- l F$ n$ v# v* w
, g/ {0 T6 R; u
hEdma = edma3init(0,&result);
+ i$ W: D2 Q' W9 w% m: J
if(hEdma)
" T6 H3 b8 }; I9 x+ [
{
9 s' Q9 b+ f6 n2 |
print2arm("edma3init() Passed.",0);
* ^* q+ O3 u/ H7 U3 x [
}
8 s0 `5 w& O0 B1 l, p
else
0 `( {- I/ Z( n' c
{
+ R( i( v Y5 V" ~# P8 S
print2arm("edma3init() Failed.",0);
' y3 _$ ?0 @5 X# O2 F1 D: R1 l
}
5 l w9 v9 D+ l* J" @" ]. k
. x/ u5 j" ^( h4 C
if (result == EDMA3_DRV_SOK)
: V6 N- n& E. k$ _! Q7 f/ ?. U3 a
{
$ l# c! `# I7 f+ j( S0 r' ~
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; O# A; x d' B; v& K; F( H
(EDMA3_RM_EventQueue)0,
. _4 C- k% p% m8 b4 S
&edma3_isr, NULL);
' w% v4 G6 k3 N, p2 @
}
5 f1 e) M2 k3 o2 m7 |( L0 S; ~
% |" c/ B3 w7 [$ d; I7 L, i
if(result == EDMA3_DRV_SOK)
( f! p# D$ O6 c1 b
{
& L0 o. J8 ]$ A7 I- m5 Y- H1 V
paramSet.srcBIdx = 0;
1 {- P f0 u+ r3 X# X8 d
paramSet.destBIdx = 1;
' M1 ^9 E4 a4 m$ S
paramSet.srcCIdx = 0;
( A w7 \) b" v2 C+ [& E
paramSet.destCIdx = 0;
3 m* C j9 g, W5 ^, ~6 L! J+ c
paramSet.aCnt = PING_PONG_ACNT;
0 Q( ?; ~4 B( f# Z$ h- M0 I4 W
paramSet.bCnt = PING_PONG_BCNT;
, C# z+ K/ K2 K
paramSet.cCnt = PING_PONG_CCNT;
; p! _" P. a1 i5 i" b0 ]4 d/ H# x
: W" F6 [" c9 l v- N7 c, i
/* For AB-synchronized transfers, BCNTRLD is not used. */
# ^7 q1 j! {' S7 v: Q9 r
paramSet.bCntReload = PING_PONG_BCNT;
5 P, R' X- s6 l `7 W
" Y* `: [: S- [. y6 Z8 [0 ?. f
/* Src in constant mode Dest in INCR modes */
8 { f c. X* v) `
paramSet.opt &= 0xFFFFFFFDu;
1 o6 d4 ?% q: Y
//paramSet.opt &= 0xFFFFFFFCu;
e( {+ ~0 X4 a" b: c
0 Z7 Q' S" j8 A$ v
/* Program the TCC */
N' X z9 A7 Q* J/ W. }
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ G" s* A/ ?8 ]: r) I4 O6 O
/ e2 L5 X4 f' o/ P3 M$ F. {9 ?
/* Enable Intermediate & Final transfer completion interrupt */
: m( ~# W0 C& \% J O2 M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ r: } f) S8 D7 ^; W
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% D, s2 B! x& ]9 e( S& J* }
b3 ~" [* v8 l/ O; m
/* AB Sync Transfer Mode */
; j+ D% x& V# p. a% V& j# U' ]0 i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& Q4 j; m, c I5 R# b% f1 q
3 Y5 t6 y& ?, @7 B$ g* V! t
/* Program the source and dest addresses for master DMA channel */
! q1 a8 Q- e9 o/ f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
G4 z2 W! ^0 R9 H( h% q4 H
paramSet.destAddr = (uint32_t)(ping_buffer);
+ R S6 v9 V2 t( E7 O
- K) V8 _: X* H- N$ F$ I
/* Write to the master DMA channel first. */
# ]% y/ r9 q$ Y, L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, P8 i" W) _* S6 [/ E x
}
- G. S! s* L) U2 Y. b2 ]' r
; d S: |# o J& C
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 {# v$ u' \# r& y$ T
. a% x8 X9 d$ ]& Y' |2 m
if(result == EDMA3_DRV_SOK)
d# z# I M( t G& Y( K! s8 t
{
7 {- r4 J2 p0 U9 z" N5 p
print2arm("edma3 driver init success.",0);
! b1 l; m, ]( V1 a, b2 T" s: w+ t6 h
}
7 W: v U3 V. n
}
- t* Q. {3 e" b# G
$ u5 t( {5 \' `7 u+ b. Z+ p% {* T
7 U+ Q: K3 V3 a3 y* E6 Q. j: d5 k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) X4 q. p; {5 f# |" T
4 W; P f. f' D$ C: u0 b
% @- W. J3 {: F6 L5 K5 ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 Z+ [6 A/ y- y. P4 a' z% Y
每次DMA传输完成后都要再次使能传输
+ m1 Y/ v7 y) Z# | Y: E! F5 A
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4