|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
; @. O% K# T0 i; }2 N, K! ~% uinput mcasp_ahclkx,+ w0 g6 J7 k& y% m p2 _
input mcasp_aclkx,
2 e c: h* V$ h, M finput axr0,6 r, f) w1 g% b8 T+ O: q; u% s
5 h+ \. ^$ w+ {& c% u$ n# koutput mcasp_afsr,
. f7 c( S5 M6 h, n* x% {output mcasp_ahclkr,
+ U& w4 H+ _. ~2 t0 @% B( R9 M! Koutput mcasp_aclkr,6 _- j; b! K: i$ M
output axr1,
' t+ B, U' w8 h1 F: j$ f assign mcasp_afsr = mcasp_afsx;
r" V7 ?$ {9 e/ ^" l5 w9 hassign mcasp_aclkr = mcasp_aclkx;
; H( d6 r. ^# b! ^/ o9 Zassign mcasp_ahclkr = mcasp_ahclkx;
- R4 K6 W, ?$ q6 R! \, lassign axr1 = axr0; 5 x" ?8 K0 ~( `% i2 y% |" {
$ O/ |: t2 @$ y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 {9 y: ?5 j$ zstatic void McASPI2SConfigure(void)
( y8 X4 @9 _6 ]* v{. W0 D( }, N" f, V* z9 o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 G; D- }% ~5 q. aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ U0 k/ F1 D0 ]4 _. g& l2 gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! W6 y9 j) S* v' j9 i' t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) R( }- O+ \4 \2 n s8 ]% j- t' LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 S! R Y. Q6 cMCASP_RX_MODE_DMA);
* [' f8 g% O& HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% ]8 e7 K7 N( N2 K3 BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// @0 t. a& r2 g! ]6 Q" N
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- ]6 i: t/ t( X$ s( TMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) u9 g5 }- H( d/ h9 x; Y# QMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- F, F5 w8 i" H" a+ h g2 FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ l. C. J# N( c" ~1 o k# O% Q3 s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 X* x/ @2 A* ^) S) t( f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 b( Q; c, V* @: Z: hMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' ]& y- ^6 A/ z0x00, 0xFF); /* configure the clock for transmitter */( v! z+ i8 f0 @" W% [- [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 C* M" j8 n/ q/ F( p: `3 a, q" J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 i8 l' J9 E0 p) q) n8 C4 x- r6 p5 m$ I
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 v; @, }: e. @* O P' S) _
0x00, 0xFF);
% x1 E! I) ~! c! V
7 s: U- x$ k, w. t/* Enable synchronization of RX and TX sections */
, N7 p$ y1 O, F3 dMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
5 Q6 d8 ~8 v/ y# i" lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 l. t9 o) S. \! P' r8 L" @+ k3 k3 sMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 H7 Q$ C' i+ ?* ^' Q* G** Set the serializers, Currently only one serializer is set as0 [4 q8 a" B) J7 N; a& d( {$ M G
** transmitter and one serializer as receiver.
& c% P; U1 R* Y9 P* b5 }8 l5 |- c*/
! U4 ]$ K( n2 }# U0 P) J" lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) h4 W% K8 @, {! F0 HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
( ~" I; j) ^& [; `** Configure the McASP pins 5 j( a" K) ~: {$ w; i3 s
** Input - Frame Sync, Clock and Serializer Rx2 \ w5 A0 b2 S1 b/ F+ U
** Output - Serializer Tx is connected to the input of the codec ) e& q0 j; [ r1 V$ q S" v0 F
*/
; v J9 D( \1 ^$ m8 JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- s* ^8 S( O% a9 @- C$ _5 ~
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 b' g( s8 x% G$ C6 A2 j; z3 LMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" R' [$ N+ ]# T! w
| MCASP_PIN_ACLKX0 a9 I8 C0 i: B9 G2 Q
| MCASP_PIN_AHCLKX
. l5 x" T, E& L: C; O| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
: w: J. i+ a! o, R8 k' r- GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % d- z2 H2 p D/ a% V
| MCASP_TX_CLKFAIL # U0 J! m' g( q/ l( Z6 S
| MCASP_TX_SYNCERROR. V& k1 ], w: V, g8 X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ ]- v O$ H- v& J| MCASP_RX_CLKFAIL
- i& q2 ?- F8 D; M/ a9 w& W| MCASP_RX_SYNCERROR ; b: s7 T* e/ o% L+ Y% ?- i, B
| MCASP_RX_OVERRUN);1 _& _& Y8 w R- V* c M V) o
} static void I2SDataTxRxActivate(void)
$ w* O$ k6 }# a' _/ [{3 U2 \" H) Y1 P _( A
/* Start the clocks */5 f! X$ k, W( |; T2 Q8 J* u
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ E5 v( G' r4 z5 [4 a3 \: ?9 Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& L' R @# T) K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' M5 l0 ~- e3 O. p8 jEDMA3_TRIG_MODE_EVENT);" _/ }* u" v2 L, n0 p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% z; D6 |- B w3 j6 C- rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 J7 d9 g0 J R) n0 KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) D8 U; d$ M1 o, i3 [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
`/ R$ R- P. q, l+ Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- q' E9 s- @+ x& OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);* U2 A S' D. X) |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" S: M2 ^. ~% i# [: s}
6 f& Y$ d" B- Q3 v, x( K0 b3 p请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! }+ d1 w+ T6 ?& _ |