|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 X' j$ v/ t2 {- jinput mcasp_ahclkx,
& l7 w9 |. U1 ^; Uinput mcasp_aclkx,
2 v( y) j0 s9 c9 E9 rinput axr0,
9 c( ^* M, s+ ~6 p" F; }' @; ]6 I% ?( Z( \
output mcasp_afsr,
' P, V5 Q2 W; v7 coutput mcasp_ahclkr,5 f' m1 [. r4 |4 V
output mcasp_aclkr,
5 X. J6 Q5 Q7 l J' d( H0 noutput axr1,9 Q- l- d& I) x& A8 `0 f
assign mcasp_afsr = mcasp_afsx;, _( n: z$ g$ S0 O. [: ~
assign mcasp_aclkr = mcasp_aclkx;
( s/ G! s9 o- \6 V; d! [$ h4 F; oassign mcasp_ahclkr = mcasp_ahclkx;
. O# p! a( a- ~assign axr1 = axr0;
% e4 b( i$ j% y0 g: T6 X9 {( { |' x0 @ i, j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + N$ z2 y3 i, j3 h6 b
static void McASPI2SConfigure(void)
* o* G8 V) r( E* `$ A! C8 K{+ s( O- x4 z7 b6 D' e* |: I1 }2 r9 G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' A: G; d0 O* }* I2 X6 C6 g- O+ i
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ {8 {! p. _" l* d/ N) e5 |8 Q( z7 iMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( ?4 s5 X4 o! f! p2 B5 X) J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ {: ~5 x9 Z8 kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' i8 F: ?9 x1 O3 w1 k
MCASP_RX_MODE_DMA);
* h* f, Y: G4 o# IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! p- F7 w0 L& Z* Y; v
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# R7 R+ t6 D$ ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( |- f6 x! [( g% @ L) Z1 S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
?3 w6 T; r4 |. q j' u9 h- DMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ w7 \4 H2 h3 f1 g4 kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# m5 e" l B) P; \6 i; y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ v' m* X9 f2 W2 N: ?McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; N& @4 A7 t0 l l/ Q4 s6 O6 q4 hMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* E- f8 f/ F- l+ `3 a
0x00, 0xFF); /* configure the clock for transmitter */
. \' W2 ?6 s2 I4 tMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 E, N2 I1 s; o4 E2 N2 C& r$ \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 R, C# p4 R- Q9 ?) ]McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( s) K* h# X9 [3 f0x00, 0xFF);2 j5 W; H k5 f5 x! W* |
; ~) K# q. f. t, H7 ~/* Enable synchronization of RX and TX sections */ - ~% u$ F- D; U" L& T3 \2 L+ q: n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) S* E! O G: h) qMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, E3 Q( V/ {1 C( Z. }) Z7 Y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
P6 `% \* x9 ]6 z4 U2 P' s** Set the serializers, Currently only one serializer is set as
U7 \2 q z' P1 \* q |) \** transmitter and one serializer as receiver., K. O1 x$ C# N5 |* f
*/% t& I; P9 E# w" h7 t# m% u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& I# K* M8 T) W2 v5 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
; M* n; T3 U) X- ^** Configure the McASP pins , e$ X- J. n) N, X9 M; U$ q) v" f& m
** Input - Frame Sync, Clock and Serializer Rx6 E7 V! V2 R' D, \' Y! L" t' N
** Output - Serializer Tx is connected to the input of the codec % t' w l3 O# l* i$ r# n+ L7 c
*/ x1 o3 q! \2 [6 ]! ~( Z5 t9 d! E- z
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% {! J) }# b/ u" y! a3 xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ L) S, {+ T" a7 P/ K: x5 Z O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 D& K4 E! A' {| MCASP_PIN_ACLKX
! m4 [* N/ \; h h+ K+ o, ?| MCASP_PIN_AHCLKX M/ R1 K' v4 c+ [, |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */2 w V. @6 V& Z, J& a. M, q) V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; Q! ?- c, G: S3 o8 y| MCASP_TX_CLKFAIL
! [& W$ d l) d& j| MCASP_TX_SYNCERROR3 L' _7 R' M' V& n( A
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ T& O* u8 v0 l| MCASP_RX_CLKFAIL
6 F$ T" n ]* n3 Q3 Y9 r) O1 y| MCASP_RX_SYNCERROR 5 c8 N+ I3 S5 H7 ^7 g/ g) e
| MCASP_RX_OVERRUN);
! M7 S, q2 C r9 m: j! G} static void I2SDataTxRxActivate(void)
/ Y* A: v% Z% T0 \+ H{, Z# z9 W8 C d
/* Start the clocks */9 A5 c" j; i7 ~; ?% Q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& |2 O. P0 R+ k r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( h) F0 A- ]% V9 @4 h t7 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
o3 f% f# D1 g) _, z+ |1 [EDMA3_TRIG_MODE_EVENT);* C& h& g' |4 D7 ?9 q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( N% a$ p+ \+ f. F3 v( Y x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 |& h5 p2 Z! e o
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 p8 J3 o! i: w9 r( e, i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */" C. Y; A9 a0 T% ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- e# {3 T3 P6 m5 n+ B! p' mMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ A0 r8 D, s2 ? J! @! U5 CMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 b( B4 s7 L7 [( e0 _2 H: J* j$ x}
# H6 u: T6 p4 S2 q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 z! p7 q+ j, Z0 ?( ]0 u |