|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: d. r7 ?! R) j1 E
input mcasp_ahclkx,7 |$ H8 v0 K3 P3 ?% S
input mcasp_aclkx,3 r1 o2 w: U. S- S4 p& [$ J
input axr0,- x- t/ k% K; M8 P3 X
) @0 \! Q* u/ i* Zoutput mcasp_afsr,1 p. Z1 E+ ^% B
output mcasp_ahclkr,4 b1 V) [/ s1 n
output mcasp_aclkr,
6 X8 g7 n! E8 U6 @$ routput axr1,
/ V7 X" C6 E. S g/ f& D assign mcasp_afsr = mcasp_afsx;" d5 c( B* `1 G/ w9 F. L. t8 s
assign mcasp_aclkr = mcasp_aclkx; V5 b) \0 Z1 P/ Q6 w* K% ?; N) T
assign mcasp_ahclkr = mcasp_ahclkx;
6 d2 G: H. ?) l4 k3 t" l" }, `% Eassign axr1 = axr0;
; o1 n+ L3 Y+ ?: b( f9 N* z4 P u
. P0 U1 Y7 W: S1 V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
+ ^6 \; c" G! P6 l1 Z }& x2 {' Estatic void McASPI2SConfigure(void); @1 i- w8 b3 @; i5 a, U
{
. {9 p/ _9 `% t) f! c. \' s0 V: LMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
f l1 |/ w$ S8 f; ^; ]McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 R; c1 E( _' v2 n& r% T& C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 b+ y A. C# R" r) }7 _$ N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
0 r2 I1 ?* Y" o9 i' s" QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ f/ }& n) n* [! i6 J2 F0 W1 d
MCASP_RX_MODE_DMA);) E( M; i$ v( ?! ]1 h/ n5 _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ }5 Q8 k7 w9 T) WMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 b, b4 s) a, O& ~McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) \1 a6 S' A( n( V% Q* ]0 F1 QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 _: C( `. |, { J5 [" ^0 ~3 J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 q) [) E4 _) U# V0 {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 w) {1 }! T: V
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 e& S2 T9 B: K! T' ?9 Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , A. ^$ z) k/ |# t% d, Z" g5 W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( m. o" m, R& q, z C
0x00, 0xFF); /* configure the clock for transmitter */
, P: n- t& {" I' t: ?. I; Z; W1 kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ b' i) _& z" m6 M% P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 k0 Q- e' j: u: O' R: h* ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 h! [8 d: V% F ~: n/ w1 Z0x00, 0xFF);
+ b" i3 N, O/ M E6 A3 M1 s+ R) R
/ x, @$ \7 m) x/* Enable synchronization of RX and TX sections */
" h* ]$ O1 V s" BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ y( q1 G) ?8 y7 C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% L. l6 w& y t/ W$ L# o) ~McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# b, O1 E+ t! w) X
** Set the serializers, Currently only one serializer is set as
' ?* j& V5 K3 c% Z7 A0 n** transmitter and one serializer as receiver.
: o5 e) u" J6 a, Y*/+ s, B9 E i" I% T" N# X
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 \+ w4 w) {7 E5 E" |0 VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 z. c. M' N2 x2 m [
** Configure the McASP pins
$ \: |$ h, C" u% G/ } t** Input - Frame Sync, Clock and Serializer Rx9 Q/ v. }& s$ k* Z" X# P w9 {
** Output - Serializer Tx is connected to the input of the codec
9 H* e) s2 S$ R( w& v*/* S3 d! G) ^! `$ J
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ o9 }$ a- t. H" U }' _4 ]3 |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* P" o& {8 y/ N7 z. B* H" h! Z5 }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( j N& o( v) G" P s0 S2 e/ s3 `2 c) G| MCASP_PIN_ACLKX
0 x/ G& L9 I9 R5 O| MCASP_PIN_AHCLKX
7 O7 V) k( w0 _1 B| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 a! d) h( n# K( w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 m0 j' G4 N/ C% x+ h| MCASP_TX_CLKFAIL & U3 v2 {+ ]( Q; q8 K$ l
| MCASP_TX_SYNCERROR
6 e; d% S; E( h3 m| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 h( [3 i/ y7 j# Z8 ~9 X$ f1 ~6 y
| MCASP_RX_CLKFAIL2 E/ y q% \' A! b5 f7 {+ x
| MCASP_RX_SYNCERROR $ M0 w% q% O l T
| MCASP_RX_OVERRUN);
8 w% @7 L$ z- t3 g3 y6 M& Z} static void I2SDataTxRxActivate(void)* g: x/ [ l2 l
{
! b0 `1 D4 b3 P4 L/* Start the clocks */
: {- O }$ L) M# F8 ^McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- z2 _4 G9 a+ }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, i+ K7 l& X) Q a: TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' @0 d$ l) }8 h) n
EDMA3_TRIG_MODE_EVENT);
' [. @) j) T7 Y# LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " z! n/ d9 P6 {2 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% |1 |9 f/ S# e0 j& y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( g. M9 c' O% |; S
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// G$ c$ x9 t" H- j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ ?1 v! L3 k/ U7 v: T+ ?& VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);, C$ z ^+ f `) T4 F% V( o& n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- ?0 h7 o5 V9 o}
1 d+ t! D O& x# w8 Q) r' E2 h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # G+ K8 d7 d W7 K4 \' |+ `
|