嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% k% c# }6 O2 k* P4 O8 u$ C
#define PING_PONG_ACNT 1
) h* G) r9 f/ F: @' g, ?) W$ p Q; V2 P% G
#define PING_PONG_BCNT 8*32*40
; ^& U% c# M* s `
//#define PING_PONG_BCNT 1
: o# ]" e9 m5 }( f
#define PING_PONG_CCNT 1
3 _/ U/ Q: b2 S$ t$ @" f
#define MCASP_BASEADDR 0x01D00000
, h$ z+ a6 K$ H
#define Mcasp_RXEVENTQUE (0u)
# I4 p7 |, h$ O9 A& r3 k( ?
8 c, b- c e" ~7 N2 h& r7 d
/* OPT Field specific defines */
( l) Z! I, T6 q2 `1 i
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( \1 R5 i) B4 _, e2 j1 B
#define OPT_TCC_MASK (0x0003F000u)
( |2 @) C! q9 r7 g3 W4 [9 E
#define OPT_TCC_SHIFT (0x0000000Cu)
% J# p [8 X" @3 |
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# [# n, j3 u6 e& \4 b! H" p
#define OPT_TCINTEN_SHIFT (0x00000014u)
) u% V* l- E4 t4 @
O2 D8 B# Y1 c4 A
char ping_buffer[PING_PONG_BCNT];
6 F% y. c5 {# {1 J& v7 @9 _
char pong_buffer[PING_PONG_BCNT];
+ y4 s, i0 [- ~7 [; e, M; ]& O
+ ^3 v, U" I+ o: i+ Q
0 y ?) n: n! r- J9 s) ^2 j3 H2 z
% c) x" }0 n5 b/ y7 z8 G
9 H* x" q) O2 t* T% ~* o: _
static void ys_edma3_init()
P" l* }% }( t. v2 m6 ?
{
2 w% T2 Q* v3 `; M, [
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 A" E- G5 y" B2 Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) p/ Y% t& r. N z8 ]( i
EDMA3_DRV_Handle hEdma;
9 N( }$ v6 n2 W: q! P" \/ _
uint32_t chId = 0;
' W6 h0 \* O) c' V$ e' R; J
uint32_t tcc = 0;
8 w! {# N# J. q+ A
3 L9 |0 l$ Y" {
print2arm("edma3 driver init...",0);
/ {$ }2 z/ Y' _7 n
7 A1 ?6 e. i- z: f
hEdma = edma3init(0,&result);
2 s* b2 i" n, h, W$ _% x7 d9 g
if(hEdma)
( w6 w" p& a5 ~# N3 \% R3 N% @9 d
{
8 ] W- ?" o, q% E' N( u
print2arm("edma3init() Passed.",0);
2 L2 ?# g: F2 c/ |: j3 c/ S# |
}
, T1 d$ {6 @7 {, z L5 T
else
% i( q8 Z8 O5 I% C
{
. Q( [; {2 p% J/ ^& N* b1 y
print2arm("edma3init() Failed.",0);
' q. m9 M6 d: V/ n* @, c( Y
}
% r8 I$ @ F# _+ }
6 r( W! ^3 P; E* n- ^7 H, X
if (result == EDMA3_DRV_SOK)
9 Q) a: Y: W# ^' \! A: b. V8 y$ E
{
& h) u$ i( s. u( S0 h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! j3 V/ D; z* V( y/ H8 h# n6 w
(EDMA3_RM_EventQueue)0,
3 ?$ B1 N" F9 [$ t' d' V9 s
&edma3_isr, NULL);
6 o" O8 ?- ?0 N' {6 F+ f
}
: g: ~8 L4 l# S7 K9 I, R
% ?$ Y7 x6 \: d u0 W; ?! b
if(result == EDMA3_DRV_SOK)
3 ^! T9 J- M; c0 r) `* I
{
" Y3 `! c) x: S! O3 x- f2 I Q% G
paramSet.srcBIdx = 0;
: Y" ]. j1 G1 c$ g- f* u* {
paramSet.destBIdx = 1;
) E" [6 p4 W) Q4 p0 {) Y2 X
paramSet.srcCIdx = 0;
+ `$ E* [" e' J1 h
paramSet.destCIdx = 0;
0 B1 D# [3 t* k1 E, H
paramSet.aCnt = PING_PONG_ACNT;
' X$ \9 B+ H+ J% Y# R2 |
paramSet.bCnt = PING_PONG_BCNT;
* w8 H2 O" k: b# a
paramSet.cCnt = PING_PONG_CCNT;
9 A, J5 d* \$ e; ?7 C5 C+ \1 L# {
- A7 y) a8 k. |; `
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 M$ N5 X1 I! Y$ r; _2 @1 E
paramSet.bCntReload = PING_PONG_BCNT;
$ s! }! ~7 q/ y* T# V. K0 ~$ T9 \' y8 ~
' y# Y! P# K/ u( L; y" x i; I
/* Src in constant mode Dest in INCR modes */
* o8 a5 p0 J5 Q* M, Q2 P
paramSet.opt &= 0xFFFFFFFDu;
, f% ]1 F8 d6 I7 @
//paramSet.opt &= 0xFFFFFFFCu;
+ H0 i% N0 q# l! Q
+ y6 J+ Q B2 ~* X. A* Z6 F; i
/* Program the TCC */
& a! z: L+ V5 ~- ]! x* c3 y5 ^1 M
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' |: q# U' _( F, l1 U
m$ V" z* d; e
/* Enable Intermediate & Final transfer completion interrupt */
$ J5 | X" _) u+ v6 h4 a
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 S! b# u) e7 Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% M! }3 N H8 P- V1 J8 E: j1 L
6 R6 T9 K. h r/ Y: G6 W9 f
/* AB Sync Transfer Mode */
2 ]3 ?& d: n6 I* h2 w0 \( C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 ^. }' M+ F* M! e3 y0 [1 O
! R t0 [: u! X$ a( H3 _4 l
/* Program the source and dest addresses for master DMA channel */
3 R" J) @" @. Y/ p+ D; L1 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) G: i# f( @9 G! `, C4 c( l+ Q
paramSet.destAddr = (uint32_t)(ping_buffer);
0 s( M1 r8 W( j5 B, n( k
% {6 g8 ]8 u7 B J9 O' M
/* Write to the master DMA channel first. */
: x. o1 w: f4 x) A1 @- ]4 S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
I. b9 c& Z: F* }0 ]
}
& m8 b3 X) K" [# e {: Y0 F
* s1 h8 A* B3 ~" U. M, a& S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 u+ j) M6 h9 o: L5 W
' y5 H, X( _3 y8 P- o! W
if(result == EDMA3_DRV_SOK)
) A7 m- V9 m X" y: h/ C' b
{
\) j; ?! Y; p
print2arm("edma3 driver init success.",0);
1 b2 d# O; Z- A+ B9 K6 [& e: x! }
}
5 T3 h6 _& k, i, W
}
6 G- A5 P( x! Z1 n; e
2 u8 \# n: q) W5 L* q' d
5 L* a5 m/ L2 {+ ]
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( _0 ^* a+ ~1 T3 F
" R9 F7 M9 I% X( K1 U
1 @" s* e8 J! d4 y% }9 \# p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) n& S% v; w d) K# U
每次DMA传输完成后都要再次使能传输
6 i. X8 s1 B* j. R$ i0 ~ `% b
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4