|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- S8 J0 N% S/ c4 v9 n) G* v4 |input mcasp_ahclkx,
. u7 p* W) y, z. I( N1 V" Jinput mcasp_aclkx, H$ p8 x' K$ s' a
input axr0,$ a2 d l4 F1 H" C3 \
$ L' d& z; k) j/ f2 }. I
output mcasp_afsr,' U# U% C, o. j( @2 s$ E: w# y5 a
output mcasp_ahclkr,( {" \6 ?, N* `+ Z/ v
output mcasp_aclkr,- N7 y% g3 D* x; T S# V0 l8 q
output axr1,6 V' r b9 ^! {- Z/ H5 q! X
assign mcasp_afsr = mcasp_afsx; i; k# n2 l. J3 m
assign mcasp_aclkr = mcasp_aclkx;
, G# P8 d& L8 Q9 ^assign mcasp_ahclkr = mcasp_ahclkx;
6 h+ s7 O4 [! U2 m# |5 ?assign axr1 = axr0; : r: _4 K9 F$ o0 N
) |5 L1 p) q' h& @& c0 O/ {5 l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , M, X( e3 x4 d, j- X6 u
static void McASPI2SConfigure(void)
4 H8 c7 G* Y/ M A" g1 G) A{6 B- J# i8 F6 N6 ]8 g% k; I8 z2 Y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( D3 c, Z2 t, O" q: w
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 ?$ P( \9 v9 _+ U5 v6 ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 g! g* }4 J1 f8 m$ p7 l& \8 w' u5 PMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 g8 T( }/ x' d6 {$ O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* @- I* J8 X- s8 L% Q/ m
MCASP_RX_MODE_DMA);* P' t/ E3 }$ |; A% D! F5 U1 V9 t- r
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 `+ N; h! @1 q/ R: F UMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( h: Z3 D, v# f+ h
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 `2 n7 D. V3 C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" ~& X! r$ p9 H" h& L/ hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 ]' L- q1 F- D! @, K3 m3 U) P6 c9 WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 L0 J0 B: Y; a$ F" P- w9 S
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- \- K% D; ]# G) q+ V- O- KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 p: K) }5 l5 x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% R# S* z- J% Q1 \1 p0x00, 0xFF); /* configure the clock for transmitter */
! u- t% B9 d7 [7 Q2 t& cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 a7 x7 T* M% e0 l" f- Q H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 M' F% G' k! o! [! M8 [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! J4 {& R6 M" I. ?" V
0x00, 0xFF);7 W) X- D7 f& ~/ F% _; x
1 U+ R8 P7 x. q
/* Enable synchronization of RX and TX sections */
. p. L% t9 C0 y* I3 X! ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 ]+ A$ @4 a3 x! g: u6 g& @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
B& @/ l* u8 L+ [* g9 j$ P( c) N! yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*; Y- U' M9 d% ~4 _
** Set the serializers, Currently only one serializer is set as0 e0 ~1 E y q. b( |
** transmitter and one serializer as receiver.
, o0 e- k d7 j0 n# u" I" O& \7 B*/7 ^1 J6 s1 z: N0 p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* g1 }$ @, x$ B5 d& g5 n' X. g/ G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: ^1 L. p! N; V+ _( ^( A: C, Q
** Configure the McASP pins
U. ~7 n' p+ L' X** Input - Frame Sync, Clock and Serializer Rx
- o8 y9 g7 l7 e4 x8 F** Output - Serializer Tx is connected to the input of the codec
, ^+ Z) L/ U8 H: S/ d% [# b*/
1 W% r8 g1 @+ P. ?1 g+ ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);2 {# p( c5 k/ C0 N! U9 M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 H' l" z2 m: C/ q3 T
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: R% {1 c- v- B& H# e' Z| MCASP_PIN_ACLKX v- W6 B! x4 Q+ ]' T. X
| MCASP_PIN_AHCLKX
) J* n# z6 l$ H6 Y _7 I| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 V% k" ]1 k* n- r- }, R% KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 T" M% c) G/ r+ v* Q
| MCASP_TX_CLKFAIL
4 O/ O: I% k, C0 ^5 N# h| MCASP_TX_SYNCERROR4 M' L1 n! Q) W! `
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" }0 i; C3 Q Z| MCASP_RX_CLKFAIL
4 R: r& |0 u( `( P# _' A( Q| MCASP_RX_SYNCERROR . T+ D# E4 M7 ?- Q" I5 [
| MCASP_RX_OVERRUN);
, H5 u, g" Y6 b6 A* U# s} static void I2SDataTxRxActivate(void)5 [- y% P4 ]8 ^/ W9 Q
{
6 r) @3 p' f( A) a/* Start the clocks */2 c% j: @+ l" g9 T8 M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ d- Y; O" G; |& J. D% VMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* D) E. I/ N4 M! l: y/ U8 `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& @5 R$ j* v. {, P
EDMA3_TRIG_MODE_EVENT);$ ]# j6 p, s5 g# |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 G1 F8 V( G3 j& e4 K) S, b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */7 J+ d' a8 \$ I7 _) z: j
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. R3 \) w" S0 a3 D' c v5 ~: }McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* f) V: m/ _! g/ p4 }
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# c$ n; r& p0 b }8 v
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) R- \, s7 H# y3 |9 @McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( r/ \- n& _2 R2 o
}
) s! Q" _/ a, S5 }# R- u( E: w" |请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' S7 |" J: w+ O, N
|