|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 f. a5 v2 {. w) l8 M1 x
input mcasp_ahclkx," K$ O* [4 n/ Q& _) C) E) N: e# ~
input mcasp_aclkx,, u- I L* _. p
input axr0,2 b6 J9 v. E6 h
1 F- J7 o$ f' q1 w
output mcasp_afsr,
+ Q! h9 J. |0 ooutput mcasp_ahclkr,+ G! {. ]! x9 s, {9 d
output mcasp_aclkr,. `. r& r6 C. c [4 y# d+ V
output axr1,0 p& ?( F6 m( h
assign mcasp_afsr = mcasp_afsx;
3 [% s9 f7 F4 r/ }. R3 r* w# d* qassign mcasp_aclkr = mcasp_aclkx;4 X4 @( a) K. P4 `' U
assign mcasp_ahclkr = mcasp_ahclkx;. o& O+ l" N# _) [3 h( t
assign axr1 = axr0; & A- d* j, k8 H
3 x5 @6 `# _9 f0 b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 g& s& g3 p9 I. X( C$ Hstatic void McASPI2SConfigure(void)& E5 ^* M! F& ?9 T* V" I( ]
{
" z" d4 I j) H3 ~; EMcASPRxReset(SOC_MCASP_0_CTRL_REGS);4 b. G2 g F: B$ ~
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) p4 q9 Y% Z! N W8 @McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' M( b/ U. T. f' c+ L0 b5 \, L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; }* L- Q) P# L1 R7 I* Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) z2 X6 ^' W% [0 j# a* c& x
MCASP_RX_MODE_DMA);
( J, y$ I0 o" L7 Q- o' @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% W7 N0 p" w) SMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 i& R, V. o7 o* u
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 H! U, X- e9 GMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
{! {2 K+ \" Z( M: u0 E4 RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, N3 X4 R, Y8 s
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 ?1 {4 q" y6 k/ oMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 @, ]5 E: M0 D9 d
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " c2 c- h/ h0 i C. z- M" a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 x8 v! g. n! [0x00, 0xFF); /* configure the clock for transmitter */$ T9 k# y' R" L5 v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: j" Z" W4 l) G) @1 X
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ O! \5 u' {( FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ I7 _2 b9 P5 r
0x00, 0xFF);
' }2 M5 m. m- Z! Y3 }) {! _* D4 Q( m- S9 V, X4 g6 u+ D
/* Enable synchronization of RX and TX sections */ 9 ^% _, W+ e+ H3 Q8 j' E$ Q& N3 d
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ o% d& s7 b, H) O" @McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 b* J" ?' y; l3 o" AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, F0 Z) {( w+ E# ^& u( z( W
** Set the serializers, Currently only one serializer is set as
# E4 W, N, R0 U** transmitter and one serializer as receiver.
) c/ c- z0 c3 g' e, Y3 a! z*/
. D u- y+ y9 Z5 [, qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# [1 i; Y3 @9 [2 V0 x% S1 d! t% V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% U7 c+ q2 {. \' x6 L& |/ @** Configure the McASP pins ! R# ^' `6 ^5 k! @" n+ O
** Input - Frame Sync, Clock and Serializer Rx
9 D2 O; @7 N# u** Output - Serializer Tx is connected to the input of the codec
; x4 @% Y. i6 x A" n*/; A1 R- I+ m, K+ }1 y& I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ E# J, L% X1 o2 GMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; [, b7 G. v9 H, H& e8 ]
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX$ E# Z! F/ A; ]+ v$ s) ~3 ^
| MCASP_PIN_ACLKX/ B4 n. k( ]- L& g7 u" \0 m) q
| MCASP_PIN_AHCLKX
8 j q( g( |& p) t) s, }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. }! f/ A5 B. L/ BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # u, f3 s4 H( @) B$ w
| MCASP_TX_CLKFAIL
: t) L- }! a' g0 U( h1 h| MCASP_TX_SYNCERROR
% G/ O; B8 M0 f! |! u. C0 Z1 L| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * @0 J) @* v2 n$ s& u
| MCASP_RX_CLKFAIL
* z$ Y! j. ]/ ~| MCASP_RX_SYNCERROR
6 B) H) X/ h0 i5 c8 G2 g# o| MCASP_RX_OVERRUN);
# O4 K- {/ f J+ F; A} static void I2SDataTxRxActivate(void)
0 f3 J% }2 Y% _& y{
% x2 `, p# T( o) f$ a$ P! a7 r% Q1 H/* Start the clocks */
0 F7 `! Z+ k% w0 {4 sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ m9 g( i: `- G" I1 k8 _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% I+ C- w a6 x2 X8 \/ ?* k. QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) G+ P6 V T) D' [/ L* b" L! f: z. Q
EDMA3_TRIG_MODE_EVENT);9 R' p( P" U% ~ A8 J! e' b' m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ t) [6 s( a- C6 h2 x- HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
$ Q4 t# U, |+ `3 t6 L4 j4 NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 p3 A$ n4 z/ q5 a1 ^( n" ~) U3 U& v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# t1 R1 X& e. |5 _9 q9 ~: Y1 Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' \+ g* Z! i) ]. Z6 x9 [ @. C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 G+ ]6 V( E# j. W6 q" GMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: R$ v S* o" K: d) A1 s}
2 H5 o/ }/ P( x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 `' ^" G* }$ N7 R" R2 S |