|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 g1 w( K; J$ |input mcasp_ahclkx,
$ Z% {; ^4 G: j8 pinput mcasp_aclkx,. [! B8 S i. X( ~; I5 ~
input axr0,: d9 r) ~7 H+ W7 V J+ C
# }- {( n q/ S8 t5 R4 W) }/ M
output mcasp_afsr,6 f& E5 ~! S8 M
output mcasp_ahclkr,1 v7 z- g3 l9 y" T4 ?! c; q, m
output mcasp_aclkr,
3 \3 ], L# Q/ G D, r, {$ Y1 w( \output axr1,4 r$ T& U m! b
assign mcasp_afsr = mcasp_afsx;
, j2 P; ^7 ~0 J; U1 Qassign mcasp_aclkr = mcasp_aclkx;
+ ~- F" g+ A6 D5 t0 bassign mcasp_ahclkr = mcasp_ahclkx;5 A0 X. C8 d3 o( b
assign axr1 = axr0; : V( i' O( { l5 l5 z
. {! Y/ g) C. y) F# r, Q+ [6 |5 i在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 t3 _. X: C1 b4 i" ^% {static void McASPI2SConfigure(void)7 j6 t0 Y% F. q ^0 W" }
{
4 x, z! e. f( n$ jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 U* W& O% g; G0 o* N* v) rMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 u- U2 }! y C# p8 v$ V9 F
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% Z n0 n. W5 D+ l- T, b
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! K' V! u. f6 Q5 c+ ?$ U! BMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# m: ?: w9 [$ Q8 l) HMCASP_RX_MODE_DMA);1 f9 b7 v/ |* g e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 d5 O5 ~9 l) NMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 H& [, L6 }" DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 K9 A8 Z; S! J$ p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# t1 `- `. V1 P. z" M, N* U& U( EMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; H( Y+ [, k' V6 {# v8 k- k6 yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
( _5 I4 w; ?( F8 A: TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& I+ i0 w+ v3 i2 ~, v8 ~& U+ m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + l9 d/ o4 Q+ \( m( E1 G) ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 M. V/ t; @( R, e0 D* c0 h0x00, 0xFF); /* configure the clock for transmitter */+ O& c9 u7 b* j+ u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 \9 `7 l/ u1 \, P# z2 E2 }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 G- D# l5 ^4 p1 y K. rMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' _% i! V( d2 O9 u7 M; R0x00, 0xFF);) F! C4 R/ { _# E3 T( |4 s+ K
$ y9 A; i% q2 G3 R; _( I0 E/* Enable synchronization of RX and TX sections */
! s0 z( L n& m1 x( K RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. q" g- p. A: e: @8 t/ s# G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. n, w- Z" l, F6 Z* O# nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 j/ F8 d4 r. L8 d2 O& c& ~! L2 W** Set the serializers, Currently only one serializer is set as, _- N7 j( Y0 ]$ R0 F- e
** transmitter and one serializer as receiver.8 y! C3 _" u6 s; C/ ?6 K
*/
$ O8 q8 O8 k: PMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 P- Y" j7 b. e) z- p) g
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 F% ]5 w, }2 E** Configure the McASP pins
" o" w7 p, G/ Z; u/ }** Input - Frame Sync, Clock and Serializer Rx4 s% A! \0 u/ M& S
** Output - Serializer Tx is connected to the input of the codec
, ?4 p; M- @3 t) U S*/
8 w, l! f; f- H8 jMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 [; S# o+ O* P. S( SMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: R$ r3 v2 h; @; z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. a6 I- E9 f2 L* ^) C$ D| MCASP_PIN_ACLKX4 {/ m& ?8 R( K; J# [* W& Z, {
| MCASP_PIN_AHCLKX9 y/ D* K7 v; _9 G) k! B
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. H* T; q ~, m: E5 H6 ]McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" Q: V6 w9 K5 j| MCASP_TX_CLKFAIL
6 ^( c: E/ C# e9 u' w# }* c! U| MCASP_TX_SYNCERROR
) I4 m- |$ i0 ~| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, x% o- M/ v. L9 e: [7 x& O) || MCASP_RX_CLKFAIL& \9 ] B% r9 j
| MCASP_RX_SYNCERROR
) N$ `+ I e! d3 j; D| MCASP_RX_OVERRUN);
s' A2 @0 w. g} static void I2SDataTxRxActivate(void)
/ @+ n+ d# y0 G) ^7 [# B9 P{+ m" B0 J$ M3 h& R2 B
/* Start the clocks */
2 @" x4 l- l4 g' b* [0 \# m+ AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" i6 G R! K$ _/ J, d3 o/ x
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 R! a+ g' Z1 L) _3 X6 v* D( X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. L! n5 O0 x- y# H7 v/ g4 d
EDMA3_TRIG_MODE_EVENT);
' ]9 v* u* T2 E/ |' b$ xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 g" r2 R5 s* C0 O# ?. yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* P1 ^. W1 e! J) Y4 E" x. Y& qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: A" z P; [% V5 {, r0 w8 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" {- Q5 L: {8 u2 R- lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; k$ }* M. P1 D# e2 N9 H1 F, dMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 u1 I9 f, n @+ w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. J! ]4 f' m9 W. ? v r) @
}
8 p, H" W0 E6 o请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # H! @$ v) f; v; Z0 T$ G
|