嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& h: }) H9 W+ w9 j1 v
#define PING_PONG_ACNT 1
" D9 E- ?# l9 q5 P; G% M
#define PING_PONG_BCNT 8*32*40
/ N! X1 i3 W9 ~; q
//#define PING_PONG_BCNT 1
" D" w0 |* _6 T7 \7 m8 _
#define PING_PONG_CCNT 1
# l' _/ v$ s2 x3 M; b
#define MCASP_BASEADDR 0x01D00000
$ N N Y( _- `1 M) B3 a6 ]
#define Mcasp_RXEVENTQUE (0u)
( F8 B9 O6 T" P. F& q
; K+ X* f9 A% U* b# N" m: V) v
/* OPT Field specific defines */
8 ]) R/ T$ \ e: Q9 G: {; e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ K( ]' D9 D, O
#define OPT_TCC_MASK (0x0003F000u)
. q5 |; H& J q* P
#define OPT_TCC_SHIFT (0x0000000Cu)
6 j2 F! b7 C6 ^, H2 L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' @ B# H4 n, D+ ~2 B x U
#define OPT_TCINTEN_SHIFT (0x00000014u)
& T/ {* }% D; p( h
1 {4 O, h! H0 \$ C7 V; z& {) ?, w
char ping_buffer[PING_PONG_BCNT];
, [7 _' @! y$ e* U2 x: A" D0 u3 i
char pong_buffer[PING_PONG_BCNT];
- n( E' u& G; m$ U
& @5 R% W9 o+ T6 [0 N! \
- E7 t7 q* p o
1 l; l, Q7 I1 ]* D1 v
e. C. S3 N! z; x7 H- B- I
static void ys_edma3_init()
. G. H. F& l1 P# ?6 K N' g
{
- [4 M6 {; ^- N: l1 _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ L* b! d7 |1 z( Y- ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 ]9 Z- Z: [% r* Y9 |% q( q6 L
EDMA3_DRV_Handle hEdma;
A1 H) [# e' @# `. }+ t
uint32_t chId = 0;
- o& _3 Y% ]$ Y" \
uint32_t tcc = 0;
6 l0 J6 W! I" H4 r
9 Q( N1 C3 \" k7 _- T+ c. ? F( _) z
print2arm("edma3 driver init...",0);
- a0 K, I9 H& w
: A/ W& R8 R, L) f& h$ s; Z
hEdma = edma3init(0,&result);
5 h7 c/ [+ F/ A# n6 w
if(hEdma)
$ v, O/ u# v* O. a- {
{
* p/ U7 r& L& n- v5 q0 _* n
print2arm("edma3init() Passed.",0);
0 {. `0 u$ j- \/ o, w7 F& j
}
+ _. V# F$ u: o" q: R, ~
else
* G! @$ X( C3 o: r
{
9 d& [- ^% U1 L) w$ w' C
print2arm("edma3init() Failed.",0);
' j0 e6 E% u( k4 m1 u. l
}
: A- x6 W1 w1 X
8 T: O5 H- a8 ~& z( e
if (result == EDMA3_DRV_SOK)
9 P2 R5 N/ H0 I B* j% y$ f/ R
{
$ p5 o' B' w& b$ a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ z" o" Q3 R9 N7 X" {
(EDMA3_RM_EventQueue)0,
9 }8 b- `$ Y- A8 a+ e' q
&edma3_isr, NULL);
" Z2 I- I$ }' Q: z" F! O
}
, R) V$ p1 x9 B' o: C9 {8 y
! s: u/ \2 z/ t$ v/ \
if(result == EDMA3_DRV_SOK)
7 P1 h& q2 |: X- m
{
8 H4 b; ~4 U: S& x
paramSet.srcBIdx = 0;
2 h- W- e/ \. Y" l: ^2 ~% a
paramSet.destBIdx = 1;
- [; l. `5 i2 n
paramSet.srcCIdx = 0;
: \4 _! \7 w8 p+ p, `% r
paramSet.destCIdx = 0;
! @& N4 v; v2 z, ?! o
paramSet.aCnt = PING_PONG_ACNT;
* ?* ~ A) w! ]0 C
paramSet.bCnt = PING_PONG_BCNT;
' N& C; X6 y6 [' e5 C
paramSet.cCnt = PING_PONG_CCNT;
3 `+ @2 w* V7 ]8 F' b
$ g7 H; n9 Y: q
/* For AB-synchronized transfers, BCNTRLD is not used. */
" k" G, u a6 w6 y
paramSet.bCntReload = PING_PONG_BCNT;
; f8 n. x- K4 P7 P
4 z0 o5 e. w; z6 V
/* Src in constant mode Dest in INCR modes */
( e/ u% a6 G6 f7 v. {9 h
paramSet.opt &= 0xFFFFFFFDu;
; Y7 D) O7 V6 P# r# H. U
//paramSet.opt &= 0xFFFFFFFCu;
3 K$ [: u$ L- X+ u3 I
6 v0 N8 Z) N$ G( A
/* Program the TCC */
2 h: _ u2 b+ |" V* r- w7 j7 B5 i& D+ N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ Y; w# h; Q* A8 b6 f
1 S2 G4 C/ P ?9 z% ]
/* Enable Intermediate & Final transfer completion interrupt */
; f! w' ?! a4 Y' f4 |
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. K' T* s% O6 t w* P# |$ f9 ~3 j8 a
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 ^; Z) w; K6 c) O2 @) R
3 C- \! ?! b" Y! [3 Q: V
/* AB Sync Transfer Mode */
3 j# G q3 B( ^/ w& f# Q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 N7 y# B' f9 v
+ W8 h3 {2 q. {3 y
/* Program the source and dest addresses for master DMA channel */
4 P3 Z! R2 h9 o! \7 P, M1 W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
& e7 X* z6 z" X- |! B! N X' v
paramSet.destAddr = (uint32_t)(ping_buffer);
/ P! D# x5 Q% _' C7 G
6 o. x" Q% N/ l) A
/* Write to the master DMA channel first. */
! t0 E4 X8 G+ S* F2 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. S0 l9 l3 @1 R' J
}
. }6 H$ I! N2 |
; N( k: N1 O; p! D# P& u. P
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 ] m$ ?( ~8 e* v# E5 g
* N% Y( Q2 F7 c0 e
if(result == EDMA3_DRV_SOK)
+ D$ j) e9 z* P$ `9 j8 `5 R# c) S
{
$ w6 u, L$ D. L# ^9 @, i
print2arm("edma3 driver init success.",0);
! ~7 P3 a9 U! t1 f
}
- n% s* u; s. `' U3 x; G' u. d% k- ?
}
+ X3 K# k8 c, }$ v- r
6 i' Q5 o2 v$ `' T6 v; e8 k. j# v
- O8 M2 W! R/ ]6 y% j. X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 G6 r b. \4 \- q. t+ b, D1 r
3 r: n( M& ]# @
9 _; P) n/ O4 A8 V9 a
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 M1 _) y5 w5 ]0 P7 r5 X
每次DMA传输完成后都要再次使能传输
7 h1 R- x* v; W$ ^0 J6 J
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4