|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," W$ J {/ ~# n8 a/ K; Z
input mcasp_ahclkx,
0 f+ F, S8 E( n; W4 W5 Jinput mcasp_aclkx," U3 ^* H. V' r* c
input axr0,0 w0 o8 o& B' n4 p
. f" y2 K- F& J1 G, `2 joutput mcasp_afsr,9 l' m: g3 T5 c: {. Z
output mcasp_ahclkr,
5 z& L8 h6 `2 n8 I* ^9 loutput mcasp_aclkr,
) k- C9 w) e0 ]; ~& d( youtput axr1,6 `- f; w' S. J) a. _
assign mcasp_afsr = mcasp_afsx;
N. v4 X6 C& j7 Z/ E; ?; Lassign mcasp_aclkr = mcasp_aclkx;
7 i/ o: D9 h/ H8 ?4 P( W- d0 L, sassign mcasp_ahclkr = mcasp_ahclkx;
% s/ [% O$ z' } ~assign axr1 = axr0; , h: ?" B! ^ L
" U& O/ e2 ?1 p在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 " W( f' _; z2 @$ Z0 \
static void McASPI2SConfigure(void)% E' q$ q# \( `
{# R* {) A4 x `8 ]: K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 N# @$ @; I e( s% XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 n4 w6 J: H* B/ L0 s0 E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, K5 @" ~" _2 N" cMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 Y$ ]- {8 Q! |9 D- \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& c. s- H$ C) x8 F
MCASP_RX_MODE_DMA);, A* \/ s' p `7 }6 ^3 v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, R. Y# e( |4 `, ?6 Z4 W1 `7 Y( J+ qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- g4 B$ f' p! y i" q9 VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! P5 {8 g# l6 a9 q7 v4 r9 f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! f% X+ x9 v: U# wMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 K' S, K s" K5 |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ V. b; x/ G. w' n; `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* _9 r6 `% X, R# Z. M. L
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 M1 R9 p. @2 ?/ T* `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) k5 T7 Y/ L$ E* y/ W0x00, 0xFF); /* configure the clock for transmitter */ [( q- J* p1 J. V* X6 z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 ]1 {3 w5 y8 n5 i* G$ FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 U' `' ~. `5 h4 r& IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 n. @- h1 F$ x: t0x00, 0xFF);
- e+ |" t( p4 X" F* D' X' @" o7 M$ Z7 r/ J2 h/ s" d
/* Enable synchronization of RX and TX sections */ * U& _8 ]: l$ \+ m1 E% D- M
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; `6 Z9 H0 u! a- j7 `$ g3 c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- @$ L# M$ t' _: tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: p8 \2 z3 R; O. [3 c) |) R
** Set the serializers, Currently only one serializer is set as7 r; h1 c" b) k: y; `
** transmitter and one serializer as receiver. T* t$ w8 h5 J3 N
*/
T) c T) k9 m: e" T2 g2 j! g" v) t% \" f# mMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); q5 z* S- O$ `
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 ^6 S9 I$ n- |! C% m# p6 ~
** Configure the McASP pins
% h7 T P" ^: t1 w** Input - Frame Sync, Clock and Serializer Rx& `2 ?7 O% o, p4 x0 O1 I; q
** Output - Serializer Tx is connected to the input of the codec : r( O" X( @9 F! h# j. l; x
*/
& u1 t; J$ {' VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 c$ x( Y6 L6 @) L2 q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
z7 q4 P; Z: }1 ~- ^$ wMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 k0 V% Z7 J+ ]+ T5 j" M
| MCASP_PIN_ACLKX+ [- k4 d$ G, |5 t
| MCASP_PIN_AHCLKX: x2 B( d* i! B8 |$ U& U, M+ i0 S
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 w+ `- F2 S. ^2 v4 e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 w w* L$ F0 W( R
| MCASP_TX_CLKFAIL
0 {: A" e3 U/ m' T2 p/ A| MCASP_TX_SYNCERROR
1 B+ O, d: i" D8 H| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : t/ `3 F8 f( ]; Y6 z
| MCASP_RX_CLKFAIL0 ^8 L3 ]- Z" F6 n3 F' n
| MCASP_RX_SYNCERROR 8 L0 \) i2 L7 u* ~! \
| MCASP_RX_OVERRUN);
4 x6 {6 x: _, j. ~+ P} static void I2SDataTxRxActivate(void)2 H1 u9 O" J6 G5 S! I" P0 W
{; \# j; b( \6 D: k- o
/* Start the clocks */
' C1 N& W, F' h: mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 H* m. [ L; [7 T4 K- }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- M, e- ^7 p2 o* b8 B+ f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 k3 O. W* y% D7 ]8 k4 }- @
EDMA3_TRIG_MODE_EVENT);: X( Z* Y6 s- m! t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 H1 e# V# Y. @. K( E( q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: }5 B; R# S! w7 d. m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. H; T; L7 Q: ~( \ TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 k- L4 x: L, c* X3 T8 Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ p6 c& {- s- j% _4 c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ M9 w1 U, `7 ?McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 z1 a6 T' o; @" i9 |* S' H} 4 w+ U! {* u% G& X
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , F# B: M& O- k t3 J t D! Q7 D
|