|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 o) k, D. o) W) sinput mcasp_ahclkx,
, K# j. M8 z6 P: ainput mcasp_aclkx,
/ y( @ c' F6 P4 U/ Uinput axr0,
! M7 E% `) |9 [+ `0 ~8 ]# @' D( d+ M3 E1 u7 l6 l* i+ @% d6 d
output mcasp_afsr,& I. J4 {3 I- q N, c9 I
output mcasp_ahclkr,
0 g* T& K2 I6 C1 f) G# ]output mcasp_aclkr,2 W9 d( u1 d9 [# q* U
output axr1,0 g2 W6 r# M/ Z
assign mcasp_afsr = mcasp_afsx;
! c: F2 ?5 {* fassign mcasp_aclkr = mcasp_aclkx;& O' t+ z' S+ d( r- W( o. v
assign mcasp_ahclkr = mcasp_ahclkx;
3 f. T9 ^" r5 q. p$ ^1 R) Aassign axr1 = axr0;
) O3 a) T5 Y5 t$ E4 x1 R8 F/ _2 Z o8 c- x
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 7 D% D: E9 g- s/ p, {
static void McASPI2SConfigure(void)
$ H% Q- T6 X$ {! W7 y4 t{; a5 B, ]& x' ^) C4 s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ j2 m1 |0 o/ s0 j6 s: wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ K7 t9 x7 i$ z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) {, W: _6 g* f3 @6 ~3 J/ h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- q1 s" [6 n# L+ N0 J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- D( F5 a" m. J1 `7 L2 AMCASP_RX_MODE_DMA);
l3 C* \1 d( T( x# NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; Q9 |$ |( d" a! n" j
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ J, ]" E2 {. a" Z' ^* c( kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + {% c5 {' O, q' Y6 G0 |( _3 C$ B1 M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' W, z0 r; w# d- a1 A$ `! p7 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 M4 W$ T9 x. \3 g6 F: qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 `; ?9 \; u' YMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% K/ w Y* A4 W; ^( R$ hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 t- G7 |: W* O7 J: P6 a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 z( W; x7 q9 p0x00, 0xFF); /* configure the clock for transmitter */
0 S; ]. ]3 ^% s- o( q' a, GMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 h) A7 t' l5 x) ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# W0 }# E% H6 K7 \1 AMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# Q+ q- x ^ i1 H0 L4 `; w" A
0x00, 0xFF);
1 a. U9 c" u. e$ \" e& Q1 {( Z6 C* Z1 n/ A
/* Enable synchronization of RX and TX sections */
/ o* X |' U3 r1 S+ U2 RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: j+ a0 ^; c2 j, y( k) b3 h5 l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) O1 J3 u5 X6 \- V3 B0 e3 i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: W, p6 D% k1 Y. L4 _. q
** Set the serializers, Currently only one serializer is set as5 m" D2 F! L4 z9 Q8 l0 O
** transmitter and one serializer as receiver.
h; u; v+ I7 V: O' \*/
% ^4 M! V/ w* HMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" P" C( h+ t E* fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. G3 |3 ]: e) F/ {/ y** Configure the McASP pins % z n4 w3 Y: n1 |5 G( H- d# q. F; ]6 f* A
** Input - Frame Sync, Clock and Serializer Rx
& o$ w- n0 R% |' [7 ^** Output - Serializer Tx is connected to the input of the codec
. l4 c4 P" {" e- o; P5 t6 y*/% {, o$ E& w' p$ d6 g
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" _. u+ P: X s8 t* T, pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( u; v: t0 L i6 k( o3 U3 e; q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& v1 W @/ ?' F2 p
| MCASP_PIN_ACLKX
% x: ?. A+ J% e2 D9 H| MCASP_PIN_AHCLKX& t6 V( v1 m% k5 T- J8 |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 d- N! O; Q8 P) n( `! t
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 B' _% ` k) S; z. q# q) W; o8 W& j% w| MCASP_TX_CLKFAIL
U3 M) P7 x t| MCASP_TX_SYNCERROR/ b# P$ O0 B+ X; D
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! t* ^0 y4 E5 i+ }$ i8 `& T- s$ W
| MCASP_RX_CLKFAIL5 ]) D+ ~# l. k4 P5 L3 B
| MCASP_RX_SYNCERROR
5 N3 ^: ^+ F+ t% [7 Z| MCASP_RX_OVERRUN);* K' y5 O) `0 U, [* r
} static void I2SDataTxRxActivate(void)
$ g5 X$ i9 X3 z! J4 p( [- ^{
; z `$ U/ G3 b) h/* Start the clocks */
2 E' o! R2 S" [" ^8 mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; H, R7 i8 W6 n" O. w" ZMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 |6 M8 R6 N u% |+ E4 U# u5 g
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 @3 ]( A* c- l& }, ~, O
EDMA3_TRIG_MODE_EVENT);) i1 X3 _ k% d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 M" H! U) A; s% o1 x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% t$ _3 h% H$ c. \+ D
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; |7 {) k6 g+ B; G! H2 a6 i: {McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, ^) v2 d7 H, p# m' A. x' swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 u8 r: J M2 y- x6 M7 _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 l" x9 [1 N$ S% cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 w* B2 v9 q9 H% N( l% c} 0 a/ u( D0 f% S. c1 N
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! Q- H( x0 C+ f$ \) A% E
|