嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- J3 U6 \2 e5 A4 E$ U7 m: B
#define PING_PONG_ACNT 1
( I0 T: U6 X0 a" {& L
#define PING_PONG_BCNT 8*32*40
- v M7 S7 S/ r7 t. m# c5 N" \
//#define PING_PONG_BCNT 1
/ F. N0 r% R, I/ t5 K% w+ Q% N, ]- m
#define PING_PONG_CCNT 1
9 ] r, d+ c) u) |
#define MCASP_BASEADDR 0x01D00000
' K i4 g Y% O4 k! _/ G+ e
#define Mcasp_RXEVENTQUE (0u)
, |3 |. h7 V( T# F" v* u. V/ G& ~
/ n; C! W [# J0 S' \
/* OPT Field specific defines */
# s; V7 R% `( |5 N: i" g
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( I+ [/ ~. M0 D" l$ k- l
#define OPT_TCC_MASK (0x0003F000u)
9 i c% ~& j+ _/ B* \6 {
#define OPT_TCC_SHIFT (0x0000000Cu)
3 D$ q0 {# \( ~8 k, z' r$ R
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' w% u, X0 S8 k9 }0 [4 g
#define OPT_TCINTEN_SHIFT (0x00000014u)
" `! N3 R |' W+ }" h
2 U* [6 u) ]" Q2 e9 m( k( H! a
char ping_buffer[PING_PONG_BCNT];
& z7 n1 B# [5 o( K3 k- \1 b: o' f! x
char pong_buffer[PING_PONG_BCNT];
# q) B* W' z" |$ D
+ U: H* h+ y/ K
7 q( T5 |/ Q d3 o/ ~3 H8 P
* M! y( e8 N# [5 k
' _2 N7 G4 N8 `- o, @
static void ys_edma3_init()
$ Q) k d4 \' w# W7 t e
{
1 n3 h, ?! ^1 t' C
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& Y; t' w% z6 H# J$ u( D" N3 r
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( U, C2 _) s6 \
EDMA3_DRV_Handle hEdma;
7 J6 ^. b5 x! O4 h. }
uint32_t chId = 0;
0 J) e: r/ B, {! E: F
uint32_t tcc = 0;
8 m# Q) B5 A+ ]' R( z, P# Q3 R
, F$ g3 N% V' c: e8 ^
print2arm("edma3 driver init...",0);
& J( G I: G0 k. D+ N2 T. D2 j8 x
9 r2 v6 ?; J. L b
hEdma = edma3init(0,&result);
. l; o( Q$ l; _; p9 k( i; G: b. x
if(hEdma)
# Y- X! H4 y. I8 @: y4 V3 m* H7 G& b
{
4 E& \ `, ?. y
print2arm("edma3init() Passed.",0);
0 d! r T" [% ~7 i! X
}
( F. ]& G) ]! o" a: `( e) E
else
3 l, i0 B6 Z! ~+ X- g1 H H3 z2 L
{
3 q3 _) N' V( [) x6 S
print2arm("edma3init() Failed.",0);
% a! {$ Y& o) f. m
}
% b4 m" I' u, s+ d6 a9 x! s% p% v
) z8 a/ d! A0 q+ V2 k
if (result == EDMA3_DRV_SOK)
7 R; B& Y+ `7 ~+ E7 |2 S
{
1 d) p# x; I# x! G- A. c' O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; V, X- ~! Y3 M# n
(EDMA3_RM_EventQueue)0,
! }7 ?2 }# }- _, U# E
&edma3_isr, NULL);
# d6 `/ j9 Y" a9 \. y3 v+ p
}
) h: i. H0 f5 v1 w6 s, |7 ^
" w# `+ v0 H9 G
if(result == EDMA3_DRV_SOK)
. T3 Z7 s! T/ y0 Y a8 E
{
6 ~# t" C# F7 \3 h6 b
paramSet.srcBIdx = 0;
v. o; ~# g2 {6 l
paramSet.destBIdx = 1;
( i( e0 m% Z- ]9 ]# C7 I. w2 q' P1 ^+ z
paramSet.srcCIdx = 0;
% t, [& e4 I" g7 U* i+ h! w7 n/ F
paramSet.destCIdx = 0;
( ?( i4 |1 i! p! r, G
paramSet.aCnt = PING_PONG_ACNT;
* N" P3 w& ]0 {& R$ J8 V- r
paramSet.bCnt = PING_PONG_BCNT;
9 w4 j- X: L# V( d, K9 k) M
paramSet.cCnt = PING_PONG_CCNT;
$ y; t F! E5 m. L
" u& W6 j* r. z5 w
/* For AB-synchronized transfers, BCNTRLD is not used. */
) L. v/ F/ }1 y) Y) d
paramSet.bCntReload = PING_PONG_BCNT;
; G) W) c2 V# O; B8 h# U
* b* I1 ]2 u- p- f
/* Src in constant mode Dest in INCR modes */
- B+ P' a+ G6 {5 J
paramSet.opt &= 0xFFFFFFFDu;
! G, P- U& l% x) d" X! v
//paramSet.opt &= 0xFFFFFFFCu;
+ D2 y. ?5 |/ V$ k
6 N$ H% H. D% R5 r% ~) l& ^* z# v
/* Program the TCC */
) t% p4 S9 R: t1 t# _4 t: U
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 [6 ^# l3 r1 G% p- W3 a
; a: s; a$ J5 {; b
/* Enable Intermediate & Final transfer completion interrupt */
& D/ s0 |2 E3 O w! L" Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ V2 E1 ~1 M6 G3 \+ X
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& A* \' j5 S1 @) S. A6 i$ y
4 C8 m+ g6 D& P6 F
/* AB Sync Transfer Mode */
/ k- }4 ^+ a4 d6 D* C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 b: U3 R- u$ |, k$ A/ x* t6 r) p- l
- t0 A5 Z4 W% C5 Y( L; v4 B
/* Program the source and dest addresses for master DMA channel */
4 H6 \7 y1 @, \2 m0 N0 ^2 A @
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! Q5 J5 U! l/ A' N7 `' Z
paramSet.destAddr = (uint32_t)(ping_buffer);
, i* [" \* E$ r' s! R s# f' m
( l4 E9 _$ p3 P! j, @! {# [, c
/* Write to the master DMA channel first. */
" R D S/ W- E3 {( {$ ~; t# M: n
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; U1 y+ T8 H2 h. L
}
" A. F6 J6 l+ }. k# }
. N; Y" F# E% `% y) c1 V" u, y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. g0 P% Q( g# R
& j5 C( W/ Q# C7 g/ @3 r: m
if(result == EDMA3_DRV_SOK)
$ g0 L- S# C$ t+ W, @
{
$ g& P* y; H5 o/ Y9 u
print2arm("edma3 driver init success.",0);
( {, T6 H# x" h
}
9 D2 G+ _5 D, ]0 U# d/ s
}
) @& n; X7 v" s, u6 c4 h8 d! u3 p1 _9 N
2 k; i& j# ? w9 e' `4 p5 @
+ a5 ^. W) j, d3 `0 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- A: J8 K0 c2 ]0 [2 } d6 u6 l" ~% _
7 |: R3 j) c# C
; w3 F; a; f' M! G
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- j. l8 S9 l2 ], Q
每次DMA传输完成后都要再次使能传输
1 {" s T' `& T6 U8 w% g
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4