|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' [; ~7 U; _2 }9 G; Iinput mcasp_ahclkx,0 R9 U c8 k9 T7 U. Y1 e
input mcasp_aclkx,
l6 T9 M+ m8 W. G: O: V* y, yinput axr0,' N( m) W j3 ?
9 m1 v/ S2 `( z
output mcasp_afsr,
+ B9 @2 t* v& s( h4 f( {output mcasp_ahclkr,
3 z6 @0 A# J g. A ~) G7 Toutput mcasp_aclkr,
. U! D1 F! w* r( {9 {' W! M& I+ zoutput axr1,/ b* S# U, ^5 H
assign mcasp_afsr = mcasp_afsx; k) g! j; l% E. { E5 {
assign mcasp_aclkr = mcasp_aclkx;
% v" a e% ?( v3 qassign mcasp_ahclkr = mcasp_ahclkx;3 K$ D U" {- w9 m- _
assign axr1 = axr0; " B5 c& l8 \1 r
2 o$ y, _4 \1 M2 i' q- v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; D5 I' V2 d) s" I
static void McASPI2SConfigure(void)0 a- h2 R/ X6 a. g; l& p/ E' J
{
3 R/ Y; @8 `3 `McASPRxReset(SOC_MCASP_0_CTRL_REGS); j# J; d7 }" A$ x
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */" w+ Y( l( C y4 ^+ a4 c f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* s/ R$ K9 Z+ K! P' ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 R% c6 y- D, p) p% g; lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) L4 N- r9 k; h% j9 h" V: _4 G
MCASP_RX_MODE_DMA);# m6 R6 M k+ ]
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; I5 ?1 t3 Y/ s
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ v! W f( T, x& K$ DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* m+ t3 [+ b! c# k: vMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
- A8 v$ C) y! e: _6 u1 L* mMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & O' R, f$ C* Y/ o
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! q7 F$ D8 g) S, \% H" j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 _4 S) i9 W. j9 A% F$ _. ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 ]% q1 S: W' A8 u; e% g4 q* W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, ?+ Z9 f# r. W5 {: X& ~3 T
0x00, 0xFF); /* configure the clock for transmitter */. U; P4 s! D; p3 [9 N$ S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* f* c7 _; S( F& f4 X2 g7 `0 K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ r; B& R9 |6 F1 ]$ q; ^5 HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 M1 V) j- q, `3 `3 ]- l( s0x00, 0xFF);
: k6 W* o, m4 ?# O, S& F% S- a
4 a: m) V8 a8 A& B: z% d3 U0 i/* Enable synchronization of RX and TX sections */ & {, @# O5 i$ j4 @6 s% s3 J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 `9 q7 Q W7 M' @7 d8 H7 S0 bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 S' Z; y) r' j7 L- \: u JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 ~. ?; L) b ]% V
** Set the serializers, Currently only one serializer is set as2 y. p! o1 |2 Y+ C5 ]$ X
** transmitter and one serializer as receiver.
0 b5 _% W1 M: e$ T1 @$ x*/
% \" F3 m" O- t; A# |, D0 I! rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( J! G3 P6 O$ j9 h. g: t G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ s$ _- B9 P, e) m Y
** Configure the McASP pins
7 E. e. {7 C# h** Input - Frame Sync, Clock and Serializer Rx
) e2 H* N" l9 k6 t/ u( u9 Z** Output - Serializer Tx is connected to the input of the codec
% d" |- l! A4 r0 I*/
+ B0 ]& M4 N. o% i% x6 dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ A `: i( x6 o, tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 q* X4 A# q; H' e4 k3 q7 Q$ y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, U7 I: n( S$ V: `" P
| MCASP_PIN_ACLKX
4 J5 T: N, V, B ]: q, w| MCASP_PIN_AHCLKX$ U# R$ F9 l* S7 l
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) L0 F) B; ~ B6 J/ @& x0 `: ~
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ q$ m6 n* `1 i/ C5 t/ J/ G8 V- @| MCASP_TX_CLKFAIL
, c0 a' E- T. p# R( ^/ Z| MCASP_TX_SYNCERROR
$ @) a) Q1 p* {4 A* ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, I7 g+ W4 i* s* R| MCASP_RX_CLKFAIL
. X+ V7 `0 |, y% f9 v+ {| MCASP_RX_SYNCERROR
& C |1 I) @ p2 h| MCASP_RX_OVERRUN);
3 n% n' c# ]8 F% k$ n3 A} static void I2SDataTxRxActivate(void)# l. L6 a: ?$ P& s5 p7 O1 T: f1 ?
{8 Q, T, Y/ P1 U+ s' t+ I& }
/* Start the clocks */ i0 J/ T* T$ O1 B
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 t. G9 j; s5 {/ {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' M& I/ u- [" |8 m% f/ LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 @/ Y5 O+ {( I- C- e6 JEDMA3_TRIG_MODE_EVENT);! F/ X; C4 d& j+ j. G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ M0 D k/ D& j) G9 tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( N! X I! Y. ^McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% L1 M3 A0 m; w# _( {: C, g8 R% mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) J/ \2 `. _0 i! rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' e& f% P6 v7 w# s& Q1 A s( }/ G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 A5 x2 ^* p" W: i% kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: J J+ Z; I" f1 k ^} 7 t, `/ P4 l7 W& J2 J
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
E1 {' ?8 G, A8 ?* S7 } |