|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ {% t% l$ ]" F: p2 E E
input mcasp_ahclkx,# h! l% b' S# t6 [# b* Y: n
input mcasp_aclkx,, r) ?9 |5 k3 {8 O
input axr0,, k& Q/ p- z3 R+ a. A9 D. [+ v$ ?
* A: q3 T b# h
output mcasp_afsr,% j0 X8 Z" `4 i8 B7 ^8 O: \4 h+ ?
output mcasp_ahclkr,, v& C; v2 x3 X$ y
output mcasp_aclkr,. \* V! U4 M( x4 C' Q( S
output axr1,5 Z; N2 O9 A _, O; u$ p' D/ n+ I) X& x
assign mcasp_afsr = mcasp_afsx;' L o5 |& G* ~) @6 ~
assign mcasp_aclkr = mcasp_aclkx;3 a, v; w: {9 Q( I. s. y9 d0 N
assign mcasp_ahclkr = mcasp_ahclkx;& T/ w. \8 X) K0 d
assign axr1 = axr0; 7 _1 D j4 @! U- J% i* V
. ]% F k! }' b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % v2 J& J/ d$ z& S+ V# Z; O
static void McASPI2SConfigure(void)
& H( D- {9 E# X+ N& j{
$ L0 l- G# k0 @' VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 u" i: i& d; |- q6 u1 X& rMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */; t4 X2 }& A- J9 O" B- k! s" u2 i
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: `. H' W) C, nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! w. \% f' g5 o5 D# `! ~McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' ^3 s4 q/ V# n) e7 g' e& ` lMCASP_RX_MODE_DMA);& a$ ^) l9 y& G! f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' T- l+ _; j- ?6 \9 z
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 @: @; j) F3 J0 p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! Z4 P) J( |1 FMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 V/ z! V3 t! PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" ?% A7 M1 O4 t+ O \/ CMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! f' c. o5 p9 o$ X" n# @: c. MMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ P, @4 q9 Q) ^8 b! p- d# a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " t; L) S# b: E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* ]# l+ Z) [+ B! J0x00, 0xFF); /* configure the clock for transmitter */
( G/ Q" q d; p7 s( ]McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 i% t( G: G G A0 K! G: B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 o+ q$ A6 T7 x0 R5 D+ A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) L! T* Y% n3 V; b" u7 R% f
0x00, 0xFF);( U! c8 w6 k- k% |4 `# V
) V& [& D/ x: h, Y/* Enable synchronization of RX and TX sections */
& B/ ^# d8 y( h3 BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) X* ]4 y4 E' z- H& yMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% L9 X) f3 k& ~% P0 FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
?! _7 i; ?& r' R2 w- d** Set the serializers, Currently only one serializer is set as
# S6 P7 x: Y' u# T** transmitter and one serializer as receiver.
$ X+ ?7 E0 j! e7 \. g' @) ?*/
! R! }6 ?& ]. T$ B* x4 UMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' `0 U o4 Q* K; ^
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' Q: c2 l& \' A O# W P** Configure the McASP pins
' E$ t( o& [5 { e) H i** Input - Frame Sync, Clock and Serializer Rx2 U" S# t. D, c1 |
** Output - Serializer Tx is connected to the input of the codec 8 b, \9 x, ]- z- |( f- ~
*/
( O8 v) W$ z5 ^ {3 s9 p# V$ UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); o( F( @: q- j( ~
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ Y$ [: g3 {! w- \2 P2 X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 s+ \/ | M! x% W' r( W6 d
| MCASP_PIN_ACLKX
- X! J( U0 c$ R3 W: Q0 x| MCASP_PIN_AHCLKX
8 b& R# {9 T% o: ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( R6 b) L/ n& ^8 v# O0 [5 X: H k' bMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& F6 Q$ n- W$ D5 W5 U. D: s| MCASP_TX_CLKFAIL # x5 s& b& ?. M6 M
| MCASP_TX_SYNCERROR
$ m$ n; x! ]- t& G2 q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % h+ L% u. C- J9 m0 [( M. ]- Z7 v. v
| MCASP_RX_CLKFAIL
9 C d6 H$ `; y3 n& O| MCASP_RX_SYNCERROR 1 C' K% o: D4 T4 ]
| MCASP_RX_OVERRUN);
7 x! x y9 k7 H5 a" Y' E} static void I2SDataTxRxActivate(void)
8 m `- E2 D" A; J2 k5 H, {1 K/ k{5 Q, ~) ~8 r# M8 @5 V
/* Start the clocks */! q* y% V# r9 n8 k/ E. j
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ {/ n; T* u0 \6 q- d9 J! T% P
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( Z+ w* z4 _* R! q6 ]7 `+ I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& E3 A G( r8 V/ T* R
EDMA3_TRIG_MODE_EVENT);
: R7 v5 f+ A- C; JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 P9 Y( q3 j& ^% n5 q( S7 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 T" B4 J. z$ {
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; Z, u' ]# O: F6 F+ T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 u0 X2 i' p% j; ^, t7 r7 ~* C2 {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ a, [+ f% r/ ~& tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);! a, l$ ?' D F. D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 R0 c9 m, C, w& s}
0 ^* J2 x% w6 R请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! ^/ [5 {! _/ F |