|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,) X5 g. ~7 K6 i+ e
input mcasp_ahclkx,
; t$ H3 V6 H2 f7 q% w5 T8 rinput mcasp_aclkx,- I" L0 C& u( s$ M+ M& W- y6 J0 W
input axr0,
5 i8 G, e+ h2 `5 ?$ n/ x- A
4 m( a. K! q' {* Doutput mcasp_afsr,
* I3 {+ r$ b/ d% boutput mcasp_ahclkr,- W x/ f, d. e8 L
output mcasp_aclkr,1 A- Q! p$ D' ^) j
output axr1,6 s) u0 w& n7 j% n4 k2 [
assign mcasp_afsr = mcasp_afsx;
' |0 ^# l+ t& B- p& |assign mcasp_aclkr = mcasp_aclkx;4 l: i* p1 W6 L5 j& J7 W' S
assign mcasp_ahclkr = mcasp_ahclkx;
" }+ i, I/ w/ K+ m1 Rassign axr1 = axr0;
) z& _8 P- U# f/ o8 F: ]; p$ x7 \7 |/ A. y# m9 j) v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
% r# u# N; ]$ _3 h/ zstatic void McASPI2SConfigure(void)5 I' V. d3 B9 C. ^6 U% `' x: e; ?+ G
{
* K. D5 z# W- m1 @. G9 e3 EMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; T* I! G; g1 r" [* Y! W6 E, h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% N/ t9 ]) T' Z& @McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ C3 B7 W6 J# L0 V
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; A2 E0 L e# \. c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, }$ d5 ^" C' UMCASP_RX_MODE_DMA);( p3 U! ^1 i l- p! T( b" E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% ?; A- ]0 n+ h) l" G3 a
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 I9 {9 ]- E1 w! y2 GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! Q7 K0 A2 d5 Y! X2 p; [MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 h, X; l0 o; Z5 e; M. o# M+ t$ {. F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ I7 N' n+ k) f& N( XMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* ^! ^" n6 `+ S) U1 _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 F: x9 a% _. k3 G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , h+ A/ }7 ?* ~9 t8 b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 l8 y n; f. _1 p- c5 M0x00, 0xFF); /* configure the clock for transmitter */
6 K4 P O2 z$ f# pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; U3 ?9 ?- e$ B2 yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% Y+ m1 y+ ^2 M# t4 ]0 W- z; HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- |) W0 w* @" Q/ S0x00, 0xFF);! L+ B) h q0 P3 ^$ t
6 O+ o+ [- h; S; Z' V# x
/* Enable synchronization of RX and TX sections */
4 K' C) ?5 E! a, S; oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */$ X2 a7 H/ ?7 H4 g( ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 |) I* T l0 ?, T' a% ?: V
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! [( E+ P1 I2 P% F* s Z
** Set the serializers, Currently only one serializer is set as$ |( i! r! M' e, G* d* v
** transmitter and one serializer as receiver.
$ H6 D/ n2 g" O% K* z*/
5 Q* a# M0 s, G3 Q5 pMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 a5 j$ Y g7 }4 V" J- ]% RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) M3 T, d) R$ W* F, C( y
** Configure the McASP pins 0 i" V% B7 @7 v# `# u
** Input - Frame Sync, Clock and Serializer Rx
1 z# f' U6 d5 o' o8 H** Output - Serializer Tx is connected to the input of the codec
2 @" _* c& L3 D+ V6 m*/$ o# m. @* N- w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% W, T+ W1 j2 C1 r: P7 w5 G8 f6 ^McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; t# `5 \ J! V5 J f+ SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ j4 S) v B" }8 u5 j! C& E! |; Z
| MCASP_PIN_ACLKX; ?3 P& i3 i$ ?. X C4 x) B
| MCASP_PIN_AHCLKX F$ P( p$ l8 ?! e
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* Z; }1 G$ ^7 [! B4 a
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 h1 J( m a( z+ m6 R3 b4 m7 S. w5 Y| MCASP_TX_CLKFAIL
6 I" Z% M/ w, S+ P1 l$ E; Q| MCASP_TX_SYNCERROR1 T: C# @% `( h9 A9 T& N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , F* q- D0 L6 U/ x6 I% E, R1 \
| MCASP_RX_CLKFAIL' P1 u0 t$ ]/ j( B* x/ Z/ ]. H* ^) [5 z1 Z) y
| MCASP_RX_SYNCERROR
5 e0 H/ b2 ], D* ]. }2 j- l| MCASP_RX_OVERRUN);
& g* V. o/ `; l} static void I2SDataTxRxActivate(void)- A' `8 l( i+ e
{6 O4 y; ~' z9 v$ {7 Z" y/ O! r! G
/* Start the clocks */4 B8 K+ l9 a( j% }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% z) F3 W/ ~1 M3 o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 c# Q" i5 I) y1 s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 i$ g: `1 X: `0 r; l/ b1 U
EDMA3_TRIG_MODE_EVENT);! u" d4 s+ }$ t8 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 ^; Q3 Y9 O; R) e2 k% }8 G0 S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 b1 t% w. v, Y `9 ~+ m9 _4 fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" O, A- S+ q* \$ T, bMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 I) e% l( j+ T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& z+ u' }; s& N; g i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* _+ e" j8 I2 r1 v/ k5 Z0 R* ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% D7 P [. W/ _+ I}
- O8 o) F: P% e2 c请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / `5 \8 k; V; j
|