|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- x( V2 k4 c+ O) M& O
input mcasp_ahclkx,& \- R8 B" H* e" K1 u' @
input mcasp_aclkx,4 p6 W" m" ] j: ^
input axr0,/ Q( w3 m6 e3 u6 X- W: ~
# \* s2 |; C1 O9 `' p! |* M6 h
output mcasp_afsr,1 ` N5 @# N: F
output mcasp_ahclkr,) g! I. w# M( G* v6 n
output mcasp_aclkr,* {! E# U% {' k/ x# o8 i/ P
output axr1,% {7 Z# s7 E. C6 I1 i, G
assign mcasp_afsr = mcasp_afsx;
, s* G6 s! E0 g( m* }. h2 T D" tassign mcasp_aclkr = mcasp_aclkx;
) Z. c- d6 F& m3 K/ Eassign mcasp_ahclkr = mcasp_ahclkx;
: x5 I1 E7 Y! W% K$ @/ bassign axr1 = axr0; & \* y9 Y g# j7 w% D$ a) j/ R; f* H
4 _( `; ?$ R5 C- Q2 o9 q& c' _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + Y2 H) ]( k) i" x8 i
static void McASPI2SConfigure(void)6 @8 a0 {: V" [7 K( J/ R( J2 D
{
5 Q! _( v- W. [5 b& D7 Z) _& h# T2 dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);, x9 _' Z: b+ S) X8 k- I$ |
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& `4 W" j9 \# |8 Z' ^/ D" \: A
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 f9 m. E( a3 B0 _# |5 q6 y3 A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# Z! k- ~0 ?/ m4 E5 ?McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- Y0 Z2 W6 |( v8 o. d, b
MCASP_RX_MODE_DMA);
; x/ j- ~! T9 |& p9 t, {! B! ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; ^. y1 }) j, N" y/ WMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) j* g$ V9 E/ q; nMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" Z& q/ m( U0 {7 w, g2 g5 d" ]& ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: U6 p. p, ?, d$ H% JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # I" Q7 {1 Y. V) J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 `6 w. l6 y" Y8 k( X) RMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; q9 D \. M! p& Q" I0 o8 i
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# } m ~1 @) w, o* [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ J+ U u! ^, h, R- u5 }& K
0x00, 0xFF); /* configure the clock for transmitter */
; K6 f/ U) B8 v: D% V) i' x/ J$ PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; U( L) C4 D! OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 k) E' z: {9 Y7 s0 ^) cMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 I$ s' }' _- E0x00, 0xFF);
8 y) e/ ?% q" |6 ~3 `3 `5 }6 Z! t3 q3 |+ }0 r
/* Enable synchronization of RX and TX sections */ % S; M8 i- P; i( M* O( S9 [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 y2 C# S$ u4 ?8 e& f" \' k4 v6 x
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, u, l9 S8 F8 U+ FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# ?( N1 w8 U9 }3 L
** Set the serializers, Currently only one serializer is set as' n6 q! O9 W& D$ g' m( Z" v. V2 v
** transmitter and one serializer as receiver. M e0 K2 l. l4 M
*/0 c+ s; O$ J- p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, N2 J X& H* d
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*7 N+ y; m) y3 C1 M
** Configure the McASP pins # A; {; c; g/ P% v
** Input - Frame Sync, Clock and Serializer Rx$ T' x( j& I5 ]- W" a
** Output - Serializer Tx is connected to the input of the codec
( L# q1 ^6 o+ Y9 W) f*/
/ u# i, t6 Y! z% {McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ X! ]8 U ~1 J& [+ n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* X( o) G' s% x$ r
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 J& l$ R0 m5 m; o7 L0 G| MCASP_PIN_ACLKX9 d r" r J$ ]+ w& R! r
| MCASP_PIN_AHCLKX8 t; w0 c6 m4 G* {. j& @
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! f) n: l+ I& ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : K* \: U& ] S3 o
| MCASP_TX_CLKFAIL
# ^/ g* d, ?1 i| MCASP_TX_SYNCERROR
# @- j3 x( V: ?9 Y6 ?| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. R, p7 {# o( r* R b/ v| MCASP_RX_CLKFAIL
0 D& ]5 Z- i$ n3 d& W; T0 a3 _| MCASP_RX_SYNCERROR
4 K J* Y3 G& }4 Q, m; ^2 ^| MCASP_RX_OVERRUN);1 W6 W/ q: U, A, S
} static void I2SDataTxRxActivate(void)5 S+ c% ]# |5 ]6 }, f: u3 X
{
8 p$ F/ J( E2 c% X5 |4 L! ~6 R/* Start the clocks */5 }; y4 M6 e8 D F
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. j" z" c* Q& j/ `) u3 [1 _McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: q% F7 y: z e# g' W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# F- H E8 z3 AEDMA3_TRIG_MODE_EVENT);4 e# v8 {1 \% [6 `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / D# l3 s# o6 K( ^; N9 S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 {: |2 |$ m, D- s5 V& jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, [" y! ^% T( P+ ]McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- q& l* N# e6 Q) R/ ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */7 [* A# J" y- [) N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 L6 Z4 d$ D! W; t6 }% mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);( ^& {( ~" i% x6 ^+ d! j
}
* `- U* g# v7 \# k4 y3 S2 ~请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 l+ ? T+ T; e5 w |