|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- l4 L6 W' ?: b) K% B6 tinput mcasp_ahclkx,
" ^# C: z9 _! J6 f9 Y7 Finput mcasp_aclkx,
, E, n/ ]* ]# \, D% ginput axr0,9 w* |! ]. B! F! e
5 V( F1 `! P! L7 i
output mcasp_afsr,- _) m, B+ k2 u/ d, Y2 n
output mcasp_ahclkr,
/ k3 f1 R( V4 ~ N6 \ Ooutput mcasp_aclkr,8 B4 N5 |. m% G) W) Z( E4 [$ Z: p
output axr1,% Q; }. r: m; X
assign mcasp_afsr = mcasp_afsx;( Z I# v0 ]+ a3 j
assign mcasp_aclkr = mcasp_aclkx;: A0 j" J" N# g+ w- m
assign mcasp_ahclkr = mcasp_ahclkx;
/ e. @: ^* @ B( [- z4 R4 ?9 Gassign axr1 = axr0;
8 A1 i+ E5 s$ S* O: M! ^0 z, ^# c& R) _; h4 T: V4 `( E' A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - h5 V& T: f5 t% \' @
static void McASPI2SConfigure(void)- A7 v. g2 x2 _# Q& m5 P; i- p
{$ S$ B! w5 W# I$ w) b
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' ^" c1 B) N4 A! R# bMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" l ^1 q! w) O( }' q3 c$ l) y2 cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. G; W+ C3 Y4 {' L9 ]2 A! ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 G9 o/ _1 {/ m, ~2 ]McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) {! B# W# y0 L* k- I' l" T7 D3 Q
MCASP_RX_MODE_DMA);' T( s9 ]+ c6 E: M; N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* l* M9 ^) Z! F2 Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! A# z( }1 L5 Z8 r7 M' r0 L" }# z2 D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, }7 o: A: z2 P' NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* p$ ^* w0 N# c1 [ DMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 j- G: ]6 X( h% T" TMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ T* g" H4 M* X5 e4 Q4 MMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 a8 W3 b( n* Q% E8 X$ q5 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . e" Y6 P6 @0 U+ F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- l- N% [" |* J$ h4 `
0x00, 0xFF); /* configure the clock for transmitter */
8 C& m5 Q" L# p5 Y7 M+ vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) `& r! X i6 m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- J9 m# c7 o BMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 S9 d) } q. d2 F* k0x00, 0xFF);
4 W2 T) m5 M) Y% b* I
, o! V8 q a9 B2 h# ]) E$ X/* Enable synchronization of RX and TX sections */
% P9 |) {0 Z, \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& p: v' E" a0 Z$ v) ~' d7 w( F
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* g. J+ K$ ^; Y9 N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 V$ _8 `' m/ C v+ j- p8 N** Set the serializers, Currently only one serializer is set as. [; Y2 _. P4 l$ T% b& W c
** transmitter and one serializer as receiver.
, e7 e! m# P7 W) F*/
- v' d$ F1 g, |3 X8 uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# O+ ^8 z& C* g$ d4 Y L& v) l
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: F1 e7 ^6 `& p. x+ V9 b** Configure the McASP pins ; k0 ^, s5 W7 m- O
** Input - Frame Sync, Clock and Serializer Rx
- l3 h, S$ X% G p6 `** Output - Serializer Tx is connected to the input of the codec 8 l; L# l+ Q, x' |2 z+ H% I
*/. C: o2 v* U1 M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) C- T; H2 T4 A" Y/ Z) v( |& R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* K- T9 C5 r( q0 c g1 O `# j3 _1 HMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 B/ n8 W( G+ q& V; w
| MCASP_PIN_ACLKX, V% P% q; ^& e+ @, |. {8 _+ {
| MCASP_PIN_AHCLKX$ q0 A( m. l4 ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* b- V- z+ E* V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' |/ h( I( ^4 R o' ^# A) `% o| MCASP_TX_CLKFAIL
) A! @# M/ R4 i! E. l7 I. z| MCASP_TX_SYNCERROR( N* C9 q( G3 p0 a! w0 U* ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR C: R! u, [1 V
| MCASP_RX_CLKFAIL# S" a! O; @7 t w. A
| MCASP_RX_SYNCERROR W. c \4 h( R4 |/ ]
| MCASP_RX_OVERRUN);
6 t1 Y& @4 [9 _. c/ l7 e$ K} static void I2SDataTxRxActivate(void)6 x6 r& a9 R, b$ a O; o
{
8 |5 u, g, i; }8 _/* Start the clocks */
! K, R+ l+ F0 a3 DMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ p& w7 o: N [ {! N- ] Y0 SMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
. j; m) _. k% p! yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. p3 I1 W% z& `: F) S4 P% m
EDMA3_TRIG_MODE_EVENT);
& k* s: x$ P6 E; \' ~# OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 r# [8 V/ ?7 H% x( ?
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* u: D6 u7 k* l; b3 `McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 O! ?! w5 ~" d9 g8 C' @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
8 d6 ]! N# K0 a$ S+ _# I ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
5 l l% R! K% L2 X8 sMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); t& ?% m0 s( e$ D) Z: [
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( M. H8 W' I( T K
} 5 ]4 N5 f3 P) N* T
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + ?0 T. J1 A3 j. ], ^
|