嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 o7 E# m/ c" g/ y' ^' B, [
#define PING_PONG_ACNT 1
% {0 C, d2 Y* y% R6 p0 I% e
#define PING_PONG_BCNT 8*32*40
" p1 T! e$ v8 g. K) X* z, h
//#define PING_PONG_BCNT 1
* C, y8 {# n: y: u# q4 a
#define PING_PONG_CCNT 1
* E" i) |8 z! C1 t1 S( V
#define MCASP_BASEADDR 0x01D00000
{" ]4 Y; t, z5 R/ s) N8 Q5 S) U
#define Mcasp_RXEVENTQUE (0u)
3 y* h" y( F1 q4 T1 [
: C' R9 H$ F0 w7 J7 n3 U
/* OPT Field specific defines */
^5 p4 r% H8 B4 D* i$ E
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 A" B5 T! V' d* D: I: l7 ` g. `; D
#define OPT_TCC_MASK (0x0003F000u)
/ Y2 A" q; B0 L% A4 n2 f
#define OPT_TCC_SHIFT (0x0000000Cu)
; h1 K2 k% z; f5 q* G
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 |% u6 E0 ^ b$ Q: ~
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 k6 ]6 g" N9 i# m c6 V
( Q; M* r: H$ Z2 y! O. A
char ping_buffer[PING_PONG_BCNT];
# L$ m6 ~, n/ G
char pong_buffer[PING_PONG_BCNT];
& g) X r: X& Z4 ?' H# i0 E7 y
/ K* x( W z+ \: n0 \* }
" F$ O2 T8 \ X/ @6 m3 G
8 \3 t) A. X) ?; L
- i$ {( k% Z( h6 P' \# ^+ p3 f2 Z2 p
static void ys_edma3_init()
" e* a# s( F$ c& i3 F( N
{
1 e7 C) U1 g0 M- ] W! n( B# p
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. W0 n" k1 c. m8 J. [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 p* X& o, L, _5 \! C& y
EDMA3_DRV_Handle hEdma;
& p& t9 _" \) [# u B" o
uint32_t chId = 0;
# {% P" \& F0 M# S: U6 V
uint32_t tcc = 0;
, O# y2 B% c* \/ _. f; r
; J* C6 w+ U- i' G1 c1 s
print2arm("edma3 driver init...",0);
( ?* N; I) [* O+ K9 g" {
# ~1 f9 e0 \ w1 w1 t
hEdma = edma3init(0,&result);
! X7 k6 |* ]6 s: E6 M( n$ Y
if(hEdma)
+ m1 C) v0 X' r' L
{
1 e5 d7 Z2 }1 `( V. E: e# g
print2arm("edma3init() Passed.",0);
! v5 g. I4 ~, b: E" j
}
' O8 T2 e+ D- j: `, L
else
3 g$ @; U3 X* {1 Q
{
+ |/ T5 u8 x) O! _3 r
print2arm("edma3init() Failed.",0);
! E" ?4 F3 l8 c3 ?9 U4 o
}
4 N4 H) G' c' @6 y0 g
* N1 a& a7 M: f' i0 C& M, p
if (result == EDMA3_DRV_SOK)
7 B9 C" r( ?% w0 J3 r" l) x
{
2 F2 S- \8 H: s. L7 j: g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" T* |5 u3 t$ Z9 x' G5 D: x& M( k
(EDMA3_RM_EventQueue)0,
4 x& w- @3 d. j" t0 X) q
&edma3_isr, NULL);
, A& L! w( x: x2 r
}
' [' h5 `( I. c
3 W/ f* e$ t7 v/ y
if(result == EDMA3_DRV_SOK)
+ W. u& \. ^# X# _6 ^* }
{
C7 u! z7 R' D& ^3 {! M
paramSet.srcBIdx = 0;
) r. o+ b* ~5 R) A. o: u
paramSet.destBIdx = 1;
3 Y; d4 p7 z, O' g( i
paramSet.srcCIdx = 0;
6 |/ e! B" b" K" a, E
paramSet.destCIdx = 0;
[/ ^) P8 d' z' U2 c# p5 g
paramSet.aCnt = PING_PONG_ACNT;
5 O" [# C$ H: z7 p6 k# l4 [0 i
paramSet.bCnt = PING_PONG_BCNT;
1 R) h- X, ~& a/ {+ `
paramSet.cCnt = PING_PONG_CCNT;
/ y" }+ _9 D! d, n4 _) G
( e+ W2 R9 }- {4 N5 a+ p
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 |$ P; V7 t7 `6 R) T* V4 I1 f
paramSet.bCntReload = PING_PONG_BCNT;
8 ~) I1 Q* J. b
2 C/ Y; o0 y. p! `! W; }/ S7 F
/* Src in constant mode Dest in INCR modes */
5 t; q0 O5 \& {; t! ?. k6 P3 ~
paramSet.opt &= 0xFFFFFFFDu;
0 J# ^! Z" s X7 F) H7 a1 j( r
//paramSet.opt &= 0xFFFFFFFCu;
" d A$ c: s* w
" d6 i& ^$ b7 t7 w1 V4 a; k
/* Program the TCC */
+ V$ R9 G9 e8 R7 m6 c6 T4 l2 x
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 f: d3 _+ z7 ] m- ?+ D
6 J: O* D( l( h0 W- I5 C% M! G
/* Enable Intermediate & Final transfer completion interrupt */
X3 R. W3 q+ K" t
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
u. d! b# x N: P; q% ^" r8 {/ c1 v2 K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 a3 F5 R' ~) p' t1 H
4 N& @, M! V, B6 e9 Q) g
/* AB Sync Transfer Mode */
. \0 F4 v! Q7 h, q, @6 T7 c
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ T8 u: x/ t, Z# R* G1 E( {6 v
; C. [1 a2 `' O9 J, D. m4 T
/* Program the source and dest addresses for master DMA channel */
( l( Y' E6 m% m9 x+ _% g( h( ]' H- [
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ k; j( P8 r: H
paramSet.destAddr = (uint32_t)(ping_buffer);
$ F4 c5 a5 e0 ?# I
- t- Y. H- }! N& I: p+ Y
/* Write to the master DMA channel first. */
$ t& X6 a* r9 b) X
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 u2 N$ f5 _& l1 N9 l1 a
}
4 C( H9 n/ c% P* R2 e& d2 t
, V- ^! Z& L9 Y3 y$ e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; ?7 h2 w+ u4 [0 i% L
6 Q5 p! t: u1 z' Z& ^5 M6 W9 ]& ~
if(result == EDMA3_DRV_SOK)
/ h! L9 G( F* Q) T+ E
{
. m- ~7 U% g! H/ G3 W
print2arm("edma3 driver init success.",0);
% I! @. E3 C5 D1 K4 K
}
/ m8 [; w) K; s- a3 }; ^% k, l
}
7 H5 C6 h+ V- E) Q. W/ |
+ m8 P9 \" w' i7 Y7 ~' B; E& b
: e5 w( g& N" U0 H2 K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 O9 m7 A7 m+ o ^( }
; h2 p1 D; P6 a, R! H% o8 \4 q3 [
{5 D# c8 j' X- N
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: m# z: Z, [" M
每次DMA传输完成后都要再次使能传输
5 ` Y5 q g5 P% I) A# c
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4