|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 Y- V9 P4 N8 m1 j+ l
input mcasp_ahclkx,& ^/ B4 s0 o2 S0 M5 W: n
input mcasp_aclkx,
$ R" {5 D% Z% ?# b4 Jinput axr0,3 x1 A0 ~1 V3 S% E2 D2 |
* T/ a; V3 j6 J4 ^output mcasp_afsr,. p4 ] v0 h& {) O. l
output mcasp_ahclkr,
8 Z: i/ v" {/ q8 N x& I, F4 R/ K. e& Koutput mcasp_aclkr,- l/ P! Z8 G8 e
output axr1,
" G2 U7 p% B @8 o assign mcasp_afsr = mcasp_afsx;7 f5 y5 p6 f( }& {2 a
assign mcasp_aclkr = mcasp_aclkx;6 T* D" T$ N! e' `/ p' G
assign mcasp_ahclkr = mcasp_ahclkx;' N6 g+ D( r0 X4 \5 o
assign axr1 = axr0; ' o9 v, K5 @) @+ q
7 J/ z. g' c& g9 _2 y3 o; ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
( N, {4 }9 w1 ]static void McASPI2SConfigure(void)# n7 b6 B3 c9 F% i
{7 }: C- P3 w: c; t3 g7 ]+ T
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& ?1 i2 c7 N$ s- ]+ O' m; |5 CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) ?8 P! m& t/ m: GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, x4 i# W) v4 V, q& F7 u- l) X$ tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 Q6 y2 ^' P* ^4 i- I& G( I5 D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( i, _- u; W6 y! B5 {3 k5 hMCASP_RX_MODE_DMA);* m! F% E. g3 e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 v: a' Y. V2 w. M
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
D. V. K4 b- GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 g! e4 m8 l$ P5 @1 C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 r4 K9 g5 a N' l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 o, k3 y6 X% N0 {
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 r% ?9 R$ V8 o! XMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ e# I, Y7 x" A) [8 F) h# N1 N
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); R7 S* x$ c6 z4 r; B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. b$ @* b7 J/ G% T; Y: T7 ]& o0x00, 0xFF); /* configure the clock for transmitter */) _8 q% I- W8 p3 e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); t' w2 M& P A9 P( H8 N3 n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 I7 Z+ Y% X- t; S* g9 e9 wMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& K) k. n+ |( ^! P0 Z0x00, 0xFF);" i/ p7 a1 f9 a% t2 T# [0 T
1 E5 c, p/ J0 ]6 T/* Enable synchronization of RX and TX sections */ ) K# @* X2 x {1 O" t
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 e0 A, \* u* U4 |$ j+ t
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' ~& ^( i6 S/ U* e$ b4 J: t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 ]' C, f, f8 `% ~** Set the serializers, Currently only one serializer is set as' ^/ f$ M! K) p. }4 r1 o
** transmitter and one serializer as receiver.: Y% \4 H% Y5 Q6 X2 C Y
*/) w! B8 | T4 ^8 g7 `" `. x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% |' ?8 ]/ h! EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 o8 B4 A: J; ~- T# Z& @2 `
** Configure the McASP pins : V4 z) R6 e2 _9 J# c0 x
** Input - Frame Sync, Clock and Serializer Rx6 h( G( U3 Q8 \5 A) O$ s
** Output - Serializer Tx is connected to the input of the codec 1 L$ e; s- a6 {* O. c
*/
`1 X; J9 ~" W: S$ oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 W) A; i5 J6 S4 h+ ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ S: y1 x0 j2 ~9 L9 L$ {- d( T$ |& BMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* M8 j6 z$ I ^: g. I9 q| MCASP_PIN_ACLKX
7 o) W+ `2 S0 u1 T/ Q| MCASP_PIN_AHCLKX E# ^+ H+ R5 K" D
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
* h! X! z& p4 R& R+ K+ S, m) }McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* P6 r) L. W9 G& @) g n2 j| MCASP_TX_CLKFAIL 9 ^% r; [6 g9 M5 H! G7 o. R
| MCASP_TX_SYNCERROR0 t/ P+ m/ n! d7 g5 I- A
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 ?3 N& K, Z n8 L/ B( P/ L( f$ _! b| MCASP_RX_CLKFAIL6 K0 s6 \$ V& r
| MCASP_RX_SYNCERROR 8 u/ _ ?1 \. q% z+ i8 F6 t
| MCASP_RX_OVERRUN);
4 i6 m3 ~- w- `' Z: ~} static void I2SDataTxRxActivate(void)4 V. X6 y/ H) e( r/ E6 \
{6 S4 v5 |' R4 ^! R
/* Start the clocks */
* }* W7 d: [# G2 aMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- n F: }0 \% o; u0 N2 H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: I: E1 }; j% L/ kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 a5 c# |4 x0 j( x
EDMA3_TRIG_MODE_EVENT);
$ q7 i5 C4 H- Q5 L& fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 L: k; d% w+ i* P" jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ L& h: t8 j# g9 ]; [3 x, ^McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 M _! e2 F( c7 N7 I& }McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 t# r6 e$ B) y2 m$ A6 S! F3 T1 Mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! B5 M# W5 L; w0 m1 }" N% _5 l2 O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);- |9 @" g6 \- v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ A/ K' l' ]5 C* Q}
4 ~9 S A; u( i2 x$ P6 T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 H7 ?6 r( v6 s6 Z. D3 Y# ? |