|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' j/ O* W! p6 ^( H0 T- G* iinput mcasp_ahclkx,
& v! B. u u9 d. N9 G2 d: Sinput mcasp_aclkx,
% n; ^% p+ `/ ainput axr0," I3 z) ^9 X% L, G0 z
$ U7 \* c5 S- w# M. R0 N# i4 eoutput mcasp_afsr,
7 U7 W- C8 k, Uoutput mcasp_ahclkr,* ^3 _' B( b% `8 u
output mcasp_aclkr,
% ~/ [7 b2 u _% |% Goutput axr1,
- y- |5 ^! R2 k3 C$ ~: o assign mcasp_afsr = mcasp_afsx;
$ Y' o+ N$ T, P8 [assign mcasp_aclkr = mcasp_aclkx;9 _0 X" n+ p2 U5 @. }4 B8 H
assign mcasp_ahclkr = mcasp_ahclkx;( _5 X7 B2 `' c2 P) q
assign axr1 = axr0;
1 B% c/ |9 x" c$ Z9 U' u% K+ J+ M! y, O% m: A6 K5 R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ D3 p7 C! s+ B% a9 a: V, xstatic void McASPI2SConfigure(void)- S% \* Z5 q# Y
{
0 a( d) @4 O& c* aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);* F ?9 F- t$ T9 a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */' \) T3 M; [5 Y( p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ ?# Y8 \' r; b/ n! ?; L7 b) G5 s: B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: W" k# F$ Q* N; \9 X5 G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% M/ r2 B) x6 V$ h( k7 x6 pMCASP_RX_MODE_DMA);' F ~7 ~6 g3 ^2 S- E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& \& Q: W" o$ D; Z, d, f2 BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- g( U t: ^6 B; G/ i+ a8 V6 ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# l X- v5 L+ |% b- f% ?8 U. J; QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. H0 b9 U/ L5 Q' G! HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / W W" V1 o5 E, Z% B
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ E- ?1 B, [8 j2 [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 v# f+ @. k& O6 H1 T! r e9 d# D) eMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: A0 G' v( x$ m" k- \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& ]3 I( Z) v+ u2 M3 d# R0 S
0x00, 0xFF); /* configure the clock for transmitter */% f2 T% s& b8 w4 O9 _7 L% Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! J' Z+ ~( c: Z. \3 x! h
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' w/ v: m8 F7 j( }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- b5 [, f/ {, Y5 D0x00, 0xFF);* ^* L, }" w) T6 s- _. v: M- k+ u
% e5 \% Q. i0 Q4 b& j5 f
/* Enable synchronization of RX and TX sections */
' V4 J& n. H3 ^4 p$ aMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 e# D0 P; [1 ]3 E& hMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& N6 B- \; x" H2 g
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 e' y+ Z1 D4 p9 T. n* M** Set the serializers, Currently only one serializer is set as/ B6 q5 }9 {, ^% |) Y8 N1 J( d
** transmitter and one serializer as receiver. F. a1 S8 k$ g/ e
*/5 N( D& ?( Y2 R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" o. G# l9 D' R# S, W6 y P7 MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
X8 {0 R5 r- J) k% A L7 }: ]** Configure the McASP pins & n- @- w. l; x% M. h- \
** Input - Frame Sync, Clock and Serializer Rx& F% k9 z% x. `) U
** Output - Serializer Tx is connected to the input of the codec & ~/ K! S* z# Y$ g( e1 n, e4 J
*/
" N$ E5 \1 X8 W9 K K9 D ]! l* qMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: @: c- j; `/ D$ W% S3 X
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 ~* Z9 q9 G4 O& p4 }, }( s$ H/ P6 B8 oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 Q. }; G' O7 H& \| MCASP_PIN_ACLKX
! T" \5 v1 E: x% X; h, z+ ^' M| MCASP_PIN_AHCLKX; Y+ i: B- j5 E
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" r3 f: ]8 n, J x6 U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* C0 m) D" X$ I; X5 \5 E| MCASP_TX_CLKFAIL
) [0 i% ~7 a9 O# }8 Q| MCASP_TX_SYNCERROR
9 `/ Q0 e; z4 X% l0 q, l) y| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 z0 f8 ^; k$ [1 h, E
| MCASP_RX_CLKFAIL
1 w( S3 {3 k# Q }2 N& Z, @| MCASP_RX_SYNCERROR 9 p# u+ v, L; r E
| MCASP_RX_OVERRUN);
) z2 b) W. ^& l$ g* B- G} static void I2SDataTxRxActivate(void)$ _1 `2 Z* c [' `& B) F" T3 {
{7 ]0 n; V4 l" J$ ~
/* Start the clocks */8 j+ t, z6 A- i. e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 H, @+ c. `- t v* F. i3 F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 m$ j7 G7 b/ W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: p4 E5 T6 c& O# \' Z. MEDMA3_TRIG_MODE_EVENT);! u0 V. V r+ s3 B) U) l$ d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : p6 A# O [% w# e
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: m3 }# X O1 f9 v& X2 NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 Q0 w& i/ y3 D0 j' Q; c- L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# U+ O5 v$ h' W$ [% o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" E8 ~5 g/ R/ `6 ?/ y wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);: z6 I6 z+ j8 S+ E3 u$ R
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ G d0 ], f% o+ O1 Q4 { k} . R2 c O u' A% w
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ W( g! J- Y0 p9 y6 o7 K" i7 l
|