嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; K9 q8 C* ^- v, K- s
#define PING_PONG_ACNT 1
5 I$ q4 v/ T4 o% h0 o6 B
#define PING_PONG_BCNT 8*32*40
5 e# t/ ?, \0 x- {5 _* N
//#define PING_PONG_BCNT 1
6 s: S* y) ~" p9 x) L6 W
#define PING_PONG_CCNT 1
" Q5 z+ Y4 o& V0 v( X9 Y
#define MCASP_BASEADDR 0x01D00000
& t/ N% F* L' I! i0 I+ R; |
#define Mcasp_RXEVENTQUE (0u)
/ e7 g! A' ?* G0 U0 w( `7 x% U
; O% A+ o) T% S, g
/* OPT Field specific defines */
: e* n- q9 u( h. D5 p6 P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ N( i3 A5 M; J Q' q5 S# R% V
#define OPT_TCC_MASK (0x0003F000u)
U( B" K1 v. u1 H% e) j2 K% s6 d/ J
#define OPT_TCC_SHIFT (0x0000000Cu)
. o* j) N2 O9 S& v4 w$ M0 l
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% Q" y H3 o% @& k8 ?6 y& C
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ `# k* I2 l; C6 Q9 T8 z
. x) M) l0 [9 `2 H6 _# D
char ping_buffer[PING_PONG_BCNT];
# o% [( Q" T( k) p! ^
char pong_buffer[PING_PONG_BCNT];
( q& }( R. M" s( D
3 @5 I! c& J9 j6 p. l5 }9 f% c
9 v0 J; m/ w" }2 _
% k6 g; _' B* l7 [
% `2 X9 L2 j& Q T9 _
static void ys_edma3_init()
2 ~1 N2 {* r: p* d0 [4 o2 m7 `+ s
{
3 ^, y0 I# B, _5 C
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 @5 ?6 F, B! v5 F' G) x5 v1 i
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) n. b3 P* r2 g; Q- {( l: m; t
EDMA3_DRV_Handle hEdma;
7 t, @! m* m- i3 E1 I, ]
uint32_t chId = 0;
: R* V: ?1 r" V" S* k5 |
uint32_t tcc = 0;
% b; k! J3 V1 M4 N
5 n4 ? c, x6 I! X) q# U
print2arm("edma3 driver init...",0);
8 @: U0 F/ m* U. B+ Q
9 O+ b7 `0 B& A, t+ Y) ] h' i4 r1 c2 @( o
hEdma = edma3init(0,&result);
! c3 A9 v( y( y8 x
if(hEdma)
' e- X/ A/ O# K3 P" E! X
{
/ A6 ~3 y2 P) ^
print2arm("edma3init() Passed.",0);
$ e0 o- n3 w7 X; r4 G
}
8 H O$ v! x! Q, o' o8 s% \3 h! ^
else
5 k: h2 @# C+ v! {# E( o
{
1 b8 V' [7 X9 q1 h, e. _
print2arm("edma3init() Failed.",0);
, w% K* P. T# m3 k
}
0 G5 k' o/ E5 Q
/ H# ]& h5 _, U3 m
if (result == EDMA3_DRV_SOK)
& [9 l# g; ?/ g) ^# a
{
9 q2 A3 x( z& j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) g+ |) w9 o2 H7 z' w
(EDMA3_RM_EventQueue)0,
+ h. r3 i+ O, P G; k
&edma3_isr, NULL);
+ ]$ O/ A' d* T* m
}
0 B t; [( Q* b8 p$ R" ]: Y/ p
3 @, w D+ [) _2 t0 v5 E
if(result == EDMA3_DRV_SOK)
, `: j7 {: Y+ w0 I' p
{
3 I1 @; S. E; z0 N5 H# y! y4 Y
paramSet.srcBIdx = 0;
8 }. E+ k3 B0 e/ z- j' Q
paramSet.destBIdx = 1;
, ?1 Q3 L7 [4 y- h4 @& p
paramSet.srcCIdx = 0;
" p3 K' H/ O4 z% k! B) z" U
paramSet.destCIdx = 0;
/ R) M9 e0 ~! h5 I2 [9 } Y
paramSet.aCnt = PING_PONG_ACNT;
- @4 z" x; k/ I7 _
paramSet.bCnt = PING_PONG_BCNT;
1 L4 E( g0 W' Q5 W9 @- O/ s
paramSet.cCnt = PING_PONG_CCNT;
( x F# A: f0 s- _
% Z6 K4 p; _6 g1 E c2 x" [" u/ X2 z
/* For AB-synchronized transfers, BCNTRLD is not used. */
! u, C% \7 O4 r! q: }% s$ V% y
paramSet.bCntReload = PING_PONG_BCNT;
$ B3 w% |+ ^6 A$ K1 \) H+ n
7 k1 w* ?/ ^( H. ]
/* Src in constant mode Dest in INCR modes */
% H+ y7 D/ l4 N
paramSet.opt &= 0xFFFFFFFDu;
8 }' b3 @ A: a7 O, w
//paramSet.opt &= 0xFFFFFFFCu;
& z4 b& Y: o- U; L3 |
& x7 G3 P# I" \8 s
/* Program the TCC */
+ Y3 ~0 ^/ C8 n; H
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; B2 Y7 @. E6 y1 {2 {3 u( D& |
& B4 s; l* O. J1 K3 Z. ^3 |1 L Y' I
/* Enable Intermediate & Final transfer completion interrupt */
9 j% b; }0 O: @0 n% O/ i i# b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 u* r- N; n7 r$ \3 U/ b6 G; z$ _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ _. Y( ?6 ^8 n8 O# h% v
" v/ ~+ U7 M4 o8 e% D0 Y
/* AB Sync Transfer Mode */
8 j; R- q q, i- g
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* ]: \: d3 N) [& s, s
+ t5 u8 P/ |. V9 N& A" n1 ?
/* Program the source and dest addresses for master DMA channel */
& i) z% S, R5 I/ w9 d# ~! h& I
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, T2 [( Z0 D! b' W$ `
paramSet.destAddr = (uint32_t)(ping_buffer);
( [$ P A2 t1 d; q
; q T$ L: c Q1 G, z7 [. I* e
/* Write to the master DMA channel first. */
F+ s0 s$ o7 R( m% G5 L$ q( S! c
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 o) c1 `" u( ] q: U2 L* D
}
; C1 t, q5 y6 C) [ K$ a, I
# e& v; H5 r7 N! B' q1 g- b
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- t. a8 g! |1 ^
7 I$ o3 d; B5 H' d# I+ O$ x
if(result == EDMA3_DRV_SOK)
; c/ R3 i6 ]6 `
{
* _$ I7 b) t5 b7 z1 M2 O' Q2 i5 V
print2arm("edma3 driver init success.",0);
4 [& P8 E+ k: \5 i' I% g
}
0 W/ y0 v( O( z, ?; [( [; t' M' h
}
1 j* H; o+ T# T' l+ Q
' x- c. w' c- T0 s8 k" j5 `0 R
2 d" R* r+ t5 d1 N2 u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: \+ t9 Q( q/ j
" o# L, N) \, v: T' m0 H
* d2 N- ?3 o8 ]& W# B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 C2 L" P& X) U) n
每次DMA传输完成后都要再次使能传输
* m! A9 b6 g+ ~/ s$ D
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4