|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
3 l8 w8 }5 I: E \7 {! t5 q# [input mcasp_ahclkx,/ R( h% P5 O0 a3 {
input mcasp_aclkx,
0 e% ~ g9 ~$ O' e7 \: qinput axr0,
9 `4 ~: Q; ]1 U+ t
" @1 e* q: O. w6 H4 R1 t Joutput mcasp_afsr,+ }+ p! x% d, K( @9 l
output mcasp_ahclkr,: H5 J- q- v/ s% k" f7 q
output mcasp_aclkr,
& \% G$ @8 c; [) n5 b9 Joutput axr1,; ?( l7 T8 q- f+ \- ?
assign mcasp_afsr = mcasp_afsx;) Y! H% i$ A2 j5 r% p5 G
assign mcasp_aclkr = mcasp_aclkx;
# }5 r$ z- n9 D2 V7 }6 A; Fassign mcasp_ahclkr = mcasp_ahclkx;
& G+ k% T' U7 T5 ?3 uassign axr1 = axr0;
7 `! E+ u7 ^7 O' N* F2 b* U2 u4 J( h7 e+ Z% h, m
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 Q6 N. b! T f% ]. [
static void McASPI2SConfigure(void)8 ^* t) X6 C' q/ U- n
{
7 Z' E# W: o0 h9 r3 f e) s/ JMcASPRxReset(SOC_MCASP_0_CTRL_REGS);, i9 G- Q9 ^% h7 x8 ?3 j
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ `7 m* \3 g: a6 T/ s9 PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% t# S. c7 ?) f" v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ A! L/ [% P( R1 L6 O |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( ] |4 w+ ?6 F
MCASP_RX_MODE_DMA);
* Z8 A% f3 b& [" O% y# u& HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 {3 {. H; i$ E- z) Y0 K
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; ^/ z9 T3 ?: R+ oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 @- M: N+ S; |- Q, a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! |( P) S6 Z/ ?, ^; i m6 d! S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; z+ Q/ A. W5 ?( Z! EMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: T2 Y$ y, k2 r! h0 l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( R7 ^. P) e% n, C$ e% ^$ t% X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 y/ u) T5 l# F V. l* SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) D+ f$ P9 }+ C( S1 U8 S4 K
0x00, 0xFF); /* configure the clock for transmitter */
5 ~# v z( C1 P' Y. g6 IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! V# V1 B0 o5 o( J1 u- k/ |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ N+ X W0 A- t8 a, g# Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 z1 M+ N! J3 ~- _; L1 ^) D' v0x00, 0xFF);% ^ i8 _* J3 u( A) e. v
7 b6 n6 u6 O6 d
/* Enable synchronization of RX and TX sections */
% y: t$ d6 N* e* DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 L6 q- m7 L) V$ `' LMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% L) r: f1 H6 q) {8 D& h; m$ UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# X1 A* e3 f2 e; E
** Set the serializers, Currently only one serializer is set as* x% k( x/ M8 F( y0 \
** transmitter and one serializer as receiver.1 o) e) K) U \6 I1 j
*/: T8 d; |+ W$ m- Y! T, _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 n& k6 a5 M# @& H' y+ {7 K) VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" Y( T% A$ e! e: O/ V+ U" J** Configure the McASP pins
) I5 O9 o8 n0 r$ N( @** Input - Frame Sync, Clock and Serializer Rx
4 ], y2 n2 M6 W' ~2 c** Output - Serializer Tx is connected to the input of the codec 3 }5 O: E/ v7 h. f4 u
*/
' ?8 \6 T0 _" L8 Q' Z3 oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( p( C4 K8 o' z7 R- |7 Z* mMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' U% r/ @7 N( Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 r# \; j4 I2 w8 y: M0 }( h4 V| MCASP_PIN_ACLKX! z( e2 N2 r7 U2 e2 {: K
| MCASP_PIN_AHCLKX
$ g2 F$ @: k: N! T6 ]$ |4 Z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// x$ V- h9 ]. X/ U2 y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 r0 O4 e# Y4 d% Q# E# _/ G
| MCASP_TX_CLKFAIL
& V4 {: j' Q' [| MCASP_TX_SYNCERROR; o O5 y- a+ V# J5 F \
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 v4 R$ R; V4 L5 ]! A' ^* Y
| MCASP_RX_CLKFAIL
8 b! F& S1 _/ l4 t| MCASP_RX_SYNCERROR
/ b/ G3 N4 U) O6 u2 n9 E/ x| MCASP_RX_OVERRUN);
) f2 ?2 ^* V8 N- }} static void I2SDataTxRxActivate(void)- ^0 V4 |' q# b) C
{
8 k7 W* p' [7 @/* Start the clocks */$ ^; F0 v9 [2 {) ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 P- d, p" x- S9 b0 YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 m" s5 w, Z _) B/ Z6 |+ s8 Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! `- C$ t, |5 P, I; A/ a
EDMA3_TRIG_MODE_EVENT);
: m) V6 {9 k2 y* B" l6 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , ]) x. B2 h- d5 B. U. K
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# Y. C ~4 ]' e% ?$ V- d( ~* V
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' g4 ~5 E, m6 NMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) K& m {2 O v2 M% zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ x4 }6 b% k a% P4 _7 j7 \2 TMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% Y! z$ l1 x, ~; Y o- qMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! H/ H# z/ t: Z. i3 G! ^}
6 v" `$ P A, E$ [2 E4 |# _3 s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 B" G4 I8 T8 N, V/ R( P$ T% z |