嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ v5 X5 {8 j7 B, y4 T
#define PING_PONG_ACNT 1
& V" U0 k% d" }7 B6 G% a$ v
#define PING_PONG_BCNT 8*32*40
) ]" y1 W/ O( l6 I. f
//#define PING_PONG_BCNT 1
: j" y$ p: h. a! v @) I
#define PING_PONG_CCNT 1
0 j& y; \6 D0 u6 T1 q* _
#define MCASP_BASEADDR 0x01D00000
D/ F( [! M( e
#define Mcasp_RXEVENTQUE (0u)
, t9 q' O( m& Q( A" @( W% Q
! S8 F2 Z4 D; b: t- p- j6 n
/* OPT Field specific defines */
- ~! C+ l+ A' u9 B0 w- n
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& I4 X/ m r7 p0 _# p* X0 B, B
#define OPT_TCC_MASK (0x0003F000u)
8 p6 h0 P6 R( m0 s& P( u1 U
#define OPT_TCC_SHIFT (0x0000000Cu)
- M8 ~+ D& y: a) q3 Y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 a+ d, x5 d- e( M2 U4 o- ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 W4 }+ O& A% m/ |( O( t; }
: B/ E( _" y M
char ping_buffer[PING_PONG_BCNT];
9 \7 z6 [7 {3 t' D: g+ T
char pong_buffer[PING_PONG_BCNT];
% }! x8 ?3 W, X8 E) a
! H1 |& g9 M1 j- [9 q
' j e( _, J( x
- f/ M* ?/ M7 F) e0 b8 ]
) m& u5 l5 |5 l+ B+ d- w R
static void ys_edma3_init()
/ `7 d9 ]# {" g* a
{
$ p1 c$ A' R7 B, H. o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' A1 [, a8 Y5 Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 v, d" ~; n8 @# D! i7 g
EDMA3_DRV_Handle hEdma;
$ o& W6 ]! u% |$ c& L; p
uint32_t chId = 0;
2 b# Y. M9 v9 F+ m8 E/ N O3 Y. l; f
uint32_t tcc = 0;
0 A4 E- A4 t' s( L5 X
& W: k1 }% n9 I
print2arm("edma3 driver init...",0);
/ [. i' X2 L; }2 P. r; r
+ q) U |8 J! Q
hEdma = edma3init(0,&result);
8 S. G- L8 F2 z" N0 i& e. z
if(hEdma)
7 X- w5 [! F* A! b
{
* f; B& X7 w6 L9 p! ?
print2arm("edma3init() Passed.",0);
) g' e7 B7 R) u* H' j
}
! u$ E+ J! t* {& T- T' Y
else
. @5 n i; A! g, j' o) X( J
{
U/ E7 {* L* g" I% Q% V
print2arm("edma3init() Failed.",0);
% f* M7 r5 t! t6 T# [# J
}
. [; e' V/ [6 O6 Z
4 n t. O% e6 F+ ^: [) W g
if (result == EDMA3_DRV_SOK)
5 E8 z5 P* |* k* p& ~5 H, D- j
{
& j4 j5 M+ P! e( ?8 i7 R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 x: D- k U' {1 l* y4 S |* r$ P& V
(EDMA3_RM_EventQueue)0,
/ _' n( P9 H, h) L' f
&edma3_isr, NULL);
2 |, Q) ~! r" x# g$ K* C$ [
}
5 n6 m/ r, D. s" n
8 f: o% l2 R8 ]5 F, Y. s+ Y+ X
if(result == EDMA3_DRV_SOK)
# a) k: G8 i4 `/ L- O
{
/ n* z8 {0 _' `" [7 m6 M
paramSet.srcBIdx = 0;
$ F: ~. i* O* {4 x' O/ E( w
paramSet.destBIdx = 1;
9 Z& s6 N8 Q' x4 |- A* J
paramSet.srcCIdx = 0;
/ o% s$ _7 b" b0 n- m/ x5 S
paramSet.destCIdx = 0;
# J7 C( z( c7 i$ I3 e
paramSet.aCnt = PING_PONG_ACNT;
0 V4 X& |, x2 I4 E
paramSet.bCnt = PING_PONG_BCNT;
$ \( j3 u4 i1 Q0 U
paramSet.cCnt = PING_PONG_CCNT;
- o8 c; o7 l. F/ s7 ^3 g/ E2 {
7 a0 n* |5 u# ~2 N6 h( W; ~5 [
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 a, Z, e9 b# Q! M, s3 q8 e
paramSet.bCntReload = PING_PONG_BCNT;
# ~! @5 Q) L% D3 h+ |" K. O
* |1 r. f/ _' R: P2 e7 Z
/* Src in constant mode Dest in INCR modes */
0 X5 L% A& A9 H
paramSet.opt &= 0xFFFFFFFDu;
5 B% v% E, B! _+ t5 y# ~, }. M
//paramSet.opt &= 0xFFFFFFFCu;
3 d2 H- z% W9 \5 S* g
9 N2 t' C. }2 D; s6 p8 x
/* Program the TCC */
' O5 ~ g X ?1 O( S) j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% M* c' m4 ~2 }3 F6 O3 ]
: W9 @3 _. c0 N0 C. M5 Z! b1 e
/* Enable Intermediate & Final transfer completion interrupt */
7 P8 ]& B0 O; G W
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) }5 E# B- i% B7 j
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 g5 B! j, i3 A( U) K2 A
5 V! i+ s2 O1 t. A) [: o' W. u7 ~
/* AB Sync Transfer Mode */
% @ U- B) n( s- n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 ^' S9 M0 h. _2 j. f
1 z- I7 K7 @ \9 z
/* Program the source and dest addresses for master DMA channel */
6 S8 i; B. K8 H! Y4 W. F. T5 L
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ M' r3 h( Z# r' @! z' B
paramSet.destAddr = (uint32_t)(ping_buffer);
9 p" f8 y- E! U9 d) F [: F$ T
* [% l0 _7 C# I- f3 ]
/* Write to the master DMA channel first. */
& q3 K* k0 e$ S& `( F$ Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. O1 L* b) d4 K. \9 ]
}
# N* b5 w! E1 a6 U9 q$ [9 a: l7 f
?: G7 ^, x2 ^0 M8 c) T$ r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ f' e- i) q2 A( L" \" |4 C8 p
* C/ M; |. _: q* i2 R2 I" @# P
if(result == EDMA3_DRV_SOK)
- ]0 k1 E3 }! {
{
) y, w, Y; R4 I5 F) E+ A
print2arm("edma3 driver init success.",0);
% B+ w7 G1 S: w( `. K* k) {
}
' G1 V6 m- z8 O; `2 z
}
3 l, S4 O) E" K9 }3 H" d- N
" ?( ^& G% Z8 b* Y6 o1 z
5 u3 W# I( n; F) Q7 h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& N2 p6 F3 {! X0 u/ J' D6 h
5 I N* l. j1 H: D/ a7 W- F0 p" B4 L
$ b* O* T( _8 Y- L7 ]+ _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! ]; t/ k: t5 h; u$ W+ L2 z
每次DMA传输完成后都要再次使能传输
7 |' f, \8 ^5 s. H
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4