|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- n' y0 D/ r. T8 j& m
input mcasp_ahclkx, d3 a. ]* ?# Z/ U' y! T. p( K. A! N# P
input mcasp_aclkx,, ]* ~9 p$ a# D9 n, O
input axr0,
4 g/ a6 Q% k4 p5 W& ?9 ]' V
2 u1 `9 ]: t+ ~) B* k3 Qoutput mcasp_afsr,
( ^) S) N8 g( N; A9 J7 aoutput mcasp_ahclkr,
, V! U: I, @3 k) d$ T$ Houtput mcasp_aclkr,
: S' p& B7 _3 Boutput axr1,
5 M E5 E8 c) @. l* N assign mcasp_afsr = mcasp_afsx;2 M) r/ U; C/ {3 i- f m
assign mcasp_aclkr = mcasp_aclkx;
. v7 y G* a/ p& e' massign mcasp_ahclkr = mcasp_ahclkx;8 s5 S! u8 o0 @" b; B9 @
assign axr1 = axr0;
. S2 D& ?2 H$ F8 ], x' f, c* ~6 q. M( E% f) Q) q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + n" m/ F# q: L; ]7 T4 `0 r
static void McASPI2SConfigure(void)
; d2 e' R8 _8 F+ G; N) D{
! d0 k) H8 m4 h- r9 _ e! M$ VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 R3 o% w/ J2 K& fMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ r( V& {; w4 g* p! cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# k/ B3 A- P8 Y+ DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* V' W# S( c" {
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ j! F3 A! B- G6 @" b4 q; p; w6 yMCASP_RX_MODE_DMA);% ^6 z7 c$ J. e/ ]' w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 k9 y M- x7 C, u4 a3 W! O1 v
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 \7 K0 U; m2 Y: P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ X# W6 y5 Q9 x" cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 f4 l4 A6 Z. B; s1 J9 FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% f' y, Z- V: p7 {6 C2 W' H; v" a, GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% L6 E, m! k/ @" v6 f% ^6 i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& G$ h: \5 ?1 o; I! u7 @$ hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & o8 {. J. `3 V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. L' @% O# c2 ~9 W( p0x00, 0xFF); /* configure the clock for transmitter */
' l9 n& y5 g2 l% X3 \. f' UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" i/ L! R9 X& QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . q( e2 J3 J5 _) b
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% n5 f' T) O6 r: }" F0x00, 0xFF);$ f% }6 z% M0 ?7 p0 d
/ X; l1 y' s8 @& ~' X! |$ ^
/* Enable synchronization of RX and TX sections */ / I, @" ~' N9 S2 C3 @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ |$ Q' o* D) ]. I8 [' PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 E& b/ E8 E* n9 K4 v
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. R5 H, Z& Q5 J0 K. H7 u0 W
** Set the serializers, Currently only one serializer is set as
3 a0 s) G+ K5 S+ p" D' L4 c3 B** transmitter and one serializer as receiver.
9 @2 O1 z2 ?: ~( A$ x. E*/, J% H9 Z% _! g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# C1 I3 ^5 x* w; CMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! @; c9 b7 e& B7 S/ }6 @
** Configure the McASP pins
& M+ `/ f! v! E% T8 W. D** Input - Frame Sync, Clock and Serializer Rx) \5 k$ T9 g) }2 r/ ~) c1 G( q
** Output - Serializer Tx is connected to the input of the codec 4 H% ]5 N" h0 n/ h. N& |: D
*/4 n: U. _: P& c7 R, o( B% G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 @* F% I: Z: x% wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); w3 O& @4 U) g( k. k9 _1 @
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 u0 w# A0 o3 e* `/ y/ {5 S| MCASP_PIN_ACLKX
. |; i/ q _6 Q2 O' i| MCASP_PIN_AHCLKX
9 g- x5 Q1 R+ ^1 Q) J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 b7 S3 Q/ |: O, V) c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 t& w, e: d% N: M| MCASP_TX_CLKFAIL ! R3 ?7 w7 [8 z
| MCASP_TX_SYNCERROR; R7 B& X* ? c' E
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # J' X) ^+ w; |2 T1 f6 r
| MCASP_RX_CLKFAIL( A9 W7 T! }+ v
| MCASP_RX_SYNCERROR
: `! k' L+ j1 c) P# I| MCASP_RX_OVERRUN);/ h0 c- L6 \. t, Q5 o0 J/ O
} static void I2SDataTxRxActivate(void)
6 L; c( g" X1 Z{6 C* E% O, p" F' f; X0 h
/* Start the clocks */
% W/ {! v. u5 V+ I, z! d6 D& }McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( a. x& p8 s8 C& }, h, S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 j9 I$ e1 U! Y! E T1 \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) t* ~2 b! X! K8 W5 @" WEDMA3_TRIG_MODE_EVENT);) w8 T- N" ~ J( ]1 c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # g" l* g+ U5 q d% @8 u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; g( ?( r$ z; p7 f( J1 r; w$ SMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; f* b8 e: T0 w( m; \% H: {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 M7 ^. b% @, |while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# u# m; _5 N8 Y* A0 x
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* @' N1 X% g; Y: S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& ~3 M, g9 h1 V* J} 0 W/ z' d0 j h8 I0 \ ]& T4 }
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 Q _4 w" L* Q, X: |" R
|