嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ {% l Y+ c& f: O7 _
#define PING_PONG_ACNT 1
( P9 F: a" T8 Q" i3 b( m4 H
#define PING_PONG_BCNT 8*32*40
! `' U' [# M- O1 m
//#define PING_PONG_BCNT 1
. I6 m! n& k2 q* H7 H* F
#define PING_PONG_CCNT 1
7 Y8 q' T/ Z+ t4 L* N8 V
#define MCASP_BASEADDR 0x01D00000
( a* r C3 r S9 v+ V
#define Mcasp_RXEVENTQUE (0u)
/ _3 C$ q: U4 Q* b- n
; G& n# E0 L: k9 P; m+ G" D# Z
/* OPT Field specific defines */
& ]) n4 E% n2 _! G
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- i# q# K( F5 T; H8 D1 x5 x# ?7 y
#define OPT_TCC_MASK (0x0003F000u)
" [% J' p: }- t$ f9 ?6 S
#define OPT_TCC_SHIFT (0x0000000Cu)
: L3 `7 A! n# p* @9 P( K
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. u5 P* H1 p v- a; h9 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
, ?5 H1 |4 F% Q* H
: g% ^. r+ k7 Y m/ `7 _: [
char ping_buffer[PING_PONG_BCNT];
, q* u/ t; n5 I0 b
char pong_buffer[PING_PONG_BCNT];
9 @9 h8 u& g2 f# u; e& \! u
' m# }, x& |9 y$ K
2 ^% v0 p' f5 P
% u) |5 e: M4 }1 h# o* I X& K# a
- c# F' j7 H/ L1 R; q( o
static void ys_edma3_init()
8 N+ R. c: i7 a8 B R& A6 M
{
( d. v9 h$ T) ]5 E1 p/ P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 j$ v6 Y! U+ M: n# K$ o
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ [: T, j, p& X# d
EDMA3_DRV_Handle hEdma;
# f7 Q1 B# c. c
uint32_t chId = 0;
5 G J" S% r) ~ y0 S8 F* ~9 D
uint32_t tcc = 0;
3 ~' ^8 j, C4 Y8 }9 T0 R5 f# c
# \3 n1 w& m* x8 @
print2arm("edma3 driver init...",0);
; u! Z9 g/ e0 }" s( m
/ A% L3 \# O1 D/ ^0 I% D7 e
hEdma = edma3init(0,&result);
5 {- F% E G" S8 c
if(hEdma)
, Q" h* p @6 F' O4 r4 M0 ]5 n u0 M
{
+ Z8 B9 |& ^. k
print2arm("edma3init() Passed.",0);
4 F) h2 Z3 a7 H/ C0 l6 z) a5 N) l
}
6 t& t) |* B2 \5 Y+ S! v) c
else
& H6 z$ w% q$ _3 l3 b$ B' s0 j
{
( `8 e5 P/ ^# u% m' }, f
print2arm("edma3init() Failed.",0);
4 \9 x1 E3 s0 s* R5 Z
}
; t, c& `9 ^2 Q& }$ a% L* A, v" G
6 \/ H6 Z& E0 U1 w
if (result == EDMA3_DRV_SOK)
+ K6 X9 G! M. B( i c7 J9 K" p
{
( r$ \( M- i& ?. D& y% q3 G
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% Z( f9 e" I7 B
(EDMA3_RM_EventQueue)0,
6 `3 [% X1 }- C2 ]: T
&edma3_isr, NULL);
$ F6 \6 J- ^0 H( a4 X3 j- T
}
: i8 F) E- o2 P: h( `
$ s h) D: f0 ^+ H2 {/ i6 B2 D
if(result == EDMA3_DRV_SOK)
& |+ }/ f4 h5 L/ t5 N% P
{
+ g( Q2 H: s0 f: I4 n" u0 |
paramSet.srcBIdx = 0;
/ p5 n+ @, u6 g- J) D
paramSet.destBIdx = 1;
: {5 x% J9 J1 `& D- _+ X' j
paramSet.srcCIdx = 0;
e- b5 t( @/ i# x) I& x* e* X! x) F
paramSet.destCIdx = 0;
, @/ x+ ?7 J$ t
paramSet.aCnt = PING_PONG_ACNT;
5 w6 J, I3 m% n& I6 f/ b
paramSet.bCnt = PING_PONG_BCNT;
3 B, o( _; @; d( y8 O2 c+ H
paramSet.cCnt = PING_PONG_CCNT;
, Y- f6 P3 Q( U; u, f" M
1 U- S- y' E. Z2 Z
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 o/ ~2 M/ ]+ c! ~$ u6 C
paramSet.bCntReload = PING_PONG_BCNT;
% `+ T7 p* u9 H; P0 k
0 P% H4 i: ]2 U1 \
/* Src in constant mode Dest in INCR modes */
" y1 j7 H/ e" a2 G% U: `+ X" c5 X
paramSet.opt &= 0xFFFFFFFDu;
) K8 q% m O# O7 g
//paramSet.opt &= 0xFFFFFFFCu;
8 Q% c8 j D% N( }* m; O" ]
- @4 q% f w( ~, M# g* K
/* Program the TCC */
( [+ P1 Q! t- B0 ^8 P, j3 w3 h
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: u" k( g5 z* P- t% v2 i
/ D0 }+ c9 u9 F! s
/* Enable Intermediate & Final transfer completion interrupt */
" j8 Q5 @+ F* ~2 J2 Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' B' U5 y5 I0 m8 |0 u5 J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' l9 S( z( T) n* d
! L+ I, b, D- w
/* AB Sync Transfer Mode */
( U( w; Z3 t8 `9 {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ M4 ^3 r8 X" `9 X, _) w+ Q: j% h/ o
# d7 t% d+ O! w, J
/* Program the source and dest addresses for master DMA channel */
& v! {: f" y, _2 d2 p/ _
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 V* {- p" s3 c) U
paramSet.destAddr = (uint32_t)(ping_buffer);
- k% d1 h7 P( D% q% d6 t
& g$ |0 [; a3 i& |- b
/* Write to the master DMA channel first. */
+ F4 l% g: {# ~; [
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ m7 |; z+ |3 F* E! E- Q0 b! _
}
( J3 F7 O& L# ]1 d
% O0 F; V1 Q& T, j' u, v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 g( C7 a$ A$ D# S8 `
! o3 Y O4 I! N9 W: h3 d" ]
if(result == EDMA3_DRV_SOK)
" C1 M, @2 D3 g
{
& i9 `7 Z0 Z) g/ G# r8 p0 ~. i
print2arm("edma3 driver init success.",0);
( b8 c$ _, h/ W5 ~6 x, u0 {
}
, p1 y/ D& R1 q# [0 @
}
' ]2 [% @. A' l6 @
' I$ L( s8 O) m9 a4 N1 D1 j- b
# y- [/ j P1 k- o
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( u) L: R F- m- I w0 ~
' E% |, X: @3 g- v8 |) ~% Z ~
* |- y7 T( Q. j# d2 j* Y J' C
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 N& t9 r: C$ {. A* i
每次DMA传输完成后都要再次使能传输
; p7 z' `6 X& i- v6 v5 r9 v- u
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4