|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 N6 G+ V# k* S1 E/ f+ D( M
#define PING_PONG_ACNT 1
) y% }* O: O7 |( j* C* B! O( |#define PING_PONG_BCNT 8*32*40 % Z4 G! e$ H. o3 m' n' U: D1 H1 \
//#define PING_PONG_BCNT 1
" u$ ^, { n$ v2 @7 o. b$ B" s4 O6 ]1 r#define PING_PONG_CCNT 1, [+ [% G) m+ X# ^
#define MCASP_BASEADDR 0x01D00000
7 s9 n+ E& G2 r7 o* c }+ |#define Mcasp_RXEVENTQUE (0u)9 D* d3 Y+ d9 G% b2 n; i0 {7 m* h
8 O; r5 S5 b& P) O9 m. M/* OPT Field specific defines */- C& k2 f K4 N! F" {2 X
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 m2 S- g/ O9 a7 R" z* i9 ]; V+ o; Y/ N#define OPT_TCC_MASK (0x0003F000u)" W4 l% d' a; G: s
#define OPT_TCC_SHIFT (0x0000000Cu); H% ]1 f3 I7 L, Y0 ^, l+ i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ A5 Q& D# l5 q/ ~5 I3 ?! y5 a#define OPT_TCINTEN_SHIFT (0x00000014u)
5 h8 P6 P% F7 f0 P9 |- n4 }8 ~( |
4 n8 R3 X) f* \: Z( B6 i2 K. Lchar ping_buffer[PING_PONG_BCNT];
! l2 \+ E8 {2 W cchar pong_buffer[PING_PONG_BCNT];6 A, Z* X; y5 y* ?8 K
( e4 M' V) M% A( |
) G" @( K. d: _& E- H0 L0 n& e# R8 V0 o" F8 u
2 A/ ~) H" h7 Q6 p* ~% l# W0 l8 Dstatic void ys_edma3_init()
! [& q9 S; k6 f: m/ d, F{% D3 }; R+ ^9 f7 X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& D6 E j: z8 w# A% Z& d: @' ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) U* v( \* n- z+ C( V E EDMA3_DRV_Handle hEdma;
; ^) V; b& Q$ j4 h uint32_t chId = 0;3 E8 X* v! ?: R+ r1 c, O4 s
uint32_t tcc = 0;0 Q' l1 s. ^! K
8 M3 e: n& d, x* X& | print2arm("edma3 driver init...",0);
9 b2 a4 l0 o5 I b& ]% r7 c6 J2 S
hEdma = edma3init(0,&result);
" V( }; x1 f* y, D if(hEdma)0 l' k9 d/ H$ m+ q
{
, V# i- j1 p) H9 k5 A, A9 m' \ print2arm("edma3init() Passed.",0);. t$ r* o7 P, Z
}
: S$ s+ J! f) r+ u9 W else
4 E0 C3 D. m9 S H& [6 u) g {* t. r: ~. {- V. E+ \4 F
print2arm("edma3init() Failed.",0);/ q2 ^) i$ b$ M2 _7 v0 ?
}
1 R! ]) |. a7 ]2 u2 Z( K; X9 Z ) `5 @: z; c, n- _3 [
if (result == EDMA3_DRV_SOK)
( x r4 E8 v" S; S9 P4 L# ` } {/ a( n- B, f2 i
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," @9 g' d n& [8 G
(EDMA3_RM_EventQueue)0,
8 R* W" q$ K+ z- @ o &edma3_isr, NULL);
) z% m/ e9 A. _3 n9 x }; M1 F- _+ a3 [, X; j6 t5 z' W& M; M3 j
0 f8 _2 ^7 P3 q' V3 @4 q if(result == EDMA3_DRV_SOK)- i) b* ]7 b+ B: G( Y
{
2 e* W6 Y& {" M paramSet.srcBIdx = 0;( T5 n( \' U7 W
paramSet.destBIdx = 1;
4 T/ `5 `7 s% M0 g0 A paramSet.srcCIdx = 0;
! R: m% _. z7 C5 e paramSet.destCIdx = 0;
: X' K' w }' o' z/ t4 C$ F paramSet.aCnt = PING_PONG_ACNT;
. G0 K( g( t- o, Q. u+ b$ d7 | paramSet.bCnt = PING_PONG_BCNT;# k7 l* ]* y. k
paramSet.cCnt = PING_PONG_CCNT;+ B& I$ G' N: I* \! V5 r! }% ^
1 c- u: A/ E% @( G) D9 [, ^ /* For AB-synchronized transfers, BCNTRLD is not used. */) P4 ]% W6 |/ s$ y: \% m
paramSet.bCntReload = PING_PONG_BCNT;* o" S$ v8 M) G: U
/ f: d" I; y) Y- u7 e6 d2 M
/* Src in constant mode Dest in INCR modes */
9 k8 K3 _; v% x* G paramSet.opt &= 0xFFFFFFFDu;" d( v% |* p2 g) ~, h
//paramSet.opt &= 0xFFFFFFFCu;
4 @0 E7 R+ [+ L5 E# t8 d, H" E
$ E8 s* o7 t R& T2 b& L /* Program the TCC */5 M$ p! t; t1 Z. [* v
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 Y7 p" H: f$ O8 G# j. ?& y
- Z6 n8 G9 _; W' f7 t. _ /* Enable Intermediate & Final transfer completion interrupt */9 [& i( ]5 Q: Y* ~
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
|! x2 }* T+ Y! U8 Z$ \6 N paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 |9 y7 B0 a9 d, V' ?- P( e
8 I1 r3 F" w- J% l5 f, ? /* AB Sync Transfer Mode */3 N! u2 Y- O( c4 E3 e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ x t6 h( @$ k7 o' X
% @# M- h( y2 Z5 ]4 p ~ A /* Program the source and dest addresses for master DMA channel */# Y' U9 G. k4 G* Y9 r0 ? ?
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ H) M" N# v8 u7 x) Q/ M- M% `/ v6 l
paramSet.destAddr = (uint32_t)(ping_buffer);
; l$ H; S! c# e( \9 g$ d$ m- z( ^5 M! N& t9 G7 s) L; \/ j
/* Write to the master DMA channel first. */! P- Y& C* P! T) w$ F
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- ^2 Q8 b% N6 Z }" J( y i& s: c
}
6 V4 A) ^! ?( L. F9 y
7 H% w+ h+ n0 p" U0 L, v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 \+ \2 d8 d4 V$ W; M2 x ; t8 b9 n1 C1 E- `. v
if(result == EDMA3_DRV_SOK) $ s8 ~6 b0 R* o+ g& ?7 z. J4 l- N
{
2 H7 P) C, }5 c, p: ?% e7 M3 [ print2arm("edma3 driver init success.",0);
# `$ f) Z2 y$ z3 s3 U2 k } 0 F) z9 k/ G0 f
}
2 g* h9 J6 M P+ ^' m& [6 z2 w' m2 d: m* e4 b" ~1 V3 V" A
" d+ |2 N3 D- K) u& r- v2 S
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 ]* h; B) C" S( w* {: `
. C6 f; u' v2 [1 ~# L/ `3 K
$ Q9 V+ C: K% {& J$ q4 T4 X( R
|
|