嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; `0 @3 U/ L; K
#define PING_PONG_ACNT 1
+ x1 T0 o! ^6 f# V) ?
#define PING_PONG_BCNT 8*32*40
$ y+ T& X- S# d+ p" ?- P
//#define PING_PONG_BCNT 1
7 N( f' K" ^& f8 b0 G% m6 `
#define PING_PONG_CCNT 1
+ O/ l2 W% l! ~' Y# d
#define MCASP_BASEADDR 0x01D00000
6 {: U- E6 ~9 C$ a
#define Mcasp_RXEVENTQUE (0u)
3 N6 D* s, |# y z0 m9 q k1 w
+ G; X4 E g0 p# @1 Q4 h3 z U
/* OPT Field specific defines */
, R6 n8 q- T4 a5 k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# g( T1 L" p4 n h: B
#define OPT_TCC_MASK (0x0003F000u)
; `! n$ w9 h l: {0 B7 r
#define OPT_TCC_SHIFT (0x0000000Cu)
) L# n1 r0 \" S$ T n; n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 m5 m+ s. K! d
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 N5 [% v" ~& N" E7 P
2 m" C- k2 c6 x P! E/ D6 d% G
char ping_buffer[PING_PONG_BCNT];
`8 }' l" u8 H- B
char pong_buffer[PING_PONG_BCNT];
, x7 d0 C! s3 J0 q5 W
, d9 S B9 j! D) C! U. L/ w. t
; D, Q$ S6 z% k
5 p( K& O6 \! k* S) l
/ s( U* Y4 |4 c0 J
static void ys_edma3_init()
: E, C# E/ J4 S5 X+ W5 S
{
% e# s. K" X7 i+ m. L
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) X v+ M- a; I. O1 z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 c4 F+ v8 I$ W) Q/ j7 a4 X
EDMA3_DRV_Handle hEdma;
, P" R1 ~7 O% r2 e4 y9 H. R# ~' r
uint32_t chId = 0;
9 Q/ D `& ^5 v( f8 L5 w7 j
uint32_t tcc = 0;
$ I/ _/ G$ H& D* B# _
h" ]& X0 e0 b3 f' ?
print2arm("edma3 driver init...",0);
9 E1 g& k" \ q
8 d) r5 m4 q2 j
hEdma = edma3init(0,&result);
% T2 |- h- P" q+ q
if(hEdma)
8 T) g3 ~ _- [$ q: [ e9 \
{
4 O! S( A4 V4 G
print2arm("edma3init() Passed.",0);
, Q& c A) S9 E2 ?0 K
}
6 Q( a$ D9 m3 M a
else
" O( x6 l6 X. }" ?
{
, g4 Z, H' y$ m/ p
print2arm("edma3init() Failed.",0);
( o1 c# z% v ^- U- _" m/ l
}
! ]( n4 F: |* v/ X0 G9 C, L7 N
" f3 i A! L! b2 C. m% ~
if (result == EDMA3_DRV_SOK)
2 B* A/ ^' r4 k
{
' R; n w O: X/ b" ?- v
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 D3 O( D$ N- e8 H/ e+ U; `. w
(EDMA3_RM_EventQueue)0,
4 |$ H. W" V B" e
&edma3_isr, NULL);
' y1 \% L1 C3 y# m1 }* B
}
5 ?' j# f: Y- Y4 Q
- F2 _7 c2 J- \
if(result == EDMA3_DRV_SOK)
9 O- G. x* b( i' {
{
. x% ?& r: O0 K. w5 Z" w
paramSet.srcBIdx = 0;
4 h( L2 _- c) L4 a9 ?% m/ _
paramSet.destBIdx = 1;
, U# L9 I3 U" H1 y6 y9 _
paramSet.srcCIdx = 0;
8 ?, l& x O/ A# l: I ^/ L( x, y9 G
paramSet.destCIdx = 0;
$ Z% r+ T8 j: d$ z/ S
paramSet.aCnt = PING_PONG_ACNT;
0 E: H1 F( e7 ]2 q
paramSet.bCnt = PING_PONG_BCNT;
$ L' N0 e( Z. l: ?0 f( Y$ e
paramSet.cCnt = PING_PONG_CCNT;
j2 v( {( Z( e! t- P
0 H! I9 ]- d" ^
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 x: V! r6 s8 l
paramSet.bCntReload = PING_PONG_BCNT;
' ~! v. K5 ]; y% F6 p
" r; D+ i2 r+ B- Z% F* e% q6 N
/* Src in constant mode Dest in INCR modes */
' p* R+ [% K, c }
paramSet.opt &= 0xFFFFFFFDu;
. q6 k! i. E" G9 S8 Y. v
//paramSet.opt &= 0xFFFFFFFCu;
# o8 V" p& K' I: V- r# i6 c
8 E) c1 _; S3 r
/* Program the TCC */
' h8 n+ L8 T0 E- e, b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ u( ~5 z5 v- u, b* ?" V
- }1 k6 i2 ~& ?- {0 v. Q6 m
/* Enable Intermediate & Final transfer completion interrupt */
- _: q% z6 ~& I$ T6 o4 u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 F: o8 V$ @7 D4 C& V- f1 \! S
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* {( z' ]( t8 k8 P3 b# h$ P$ {( z
0 H$ T( z) C' g1 X {1 c4 y
/* AB Sync Transfer Mode */
2 d! b& u' U6 y0 x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% \8 b& i& z9 z& S, M
* f9 M0 U# s) R
/* Program the source and dest addresses for master DMA channel */
; H( t4 u1 p, r6 g. A6 }: o, j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 r4 e4 @. |+ ]2 x- L
paramSet.destAddr = (uint32_t)(ping_buffer);
( i* C1 ]$ U6 R! X& @; B$ r8 L
! ?" } x4 R4 N* F- ~3 l \) v N
/* Write to the master DMA channel first. */
' Z5 s, N# j6 U# `% |- `: ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ s- V ~4 ]4 M; _* O
}
( l [! o; [+ o9 A4 ^
! B+ p+ V4 z. j' C4 P2 Q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: B, ~2 S6 G. [( P x
0 }$ [0 I, }4 }8 M
if(result == EDMA3_DRV_SOK)
% B- f. p- E- u# D: n
{
$ o/ R7 W$ E0 z3 ~
print2arm("edma3 driver init success.",0);
( ~" s# Y, N# R' J" \3 L1 r
}
/ t+ }4 V+ r! f% |
}
0 t3 J- C5 l9 l0 c5 y
0 {& ^) Z- ^/ Y
: u0 N6 _& d0 a! M# r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
_& w/ ~7 z* K' H8 ]6 J! n) J$ @
" S0 l0 A* p% ]% _4 v# a
! p6 V2 a4 R. @: H, \! @7 v; r& U
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% s5 Z2 _( w' A6 k1 C
每次DMA传输完成后都要再次使能传输
3 n! Z- c0 A+ F% W
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4