|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. _8 ~2 L' u# j7 P$ Winput mcasp_ahclkx,- m0 i' _& C. d, v: ^
input mcasp_aclkx,
$ F9 B* p! ^$ ]# r5 winput axr0,8 G* M! m& n$ N% D
3 {: b7 G/ z% Foutput mcasp_afsr,
2 n- H" m. M2 |: i. foutput mcasp_ahclkr,
# Z. b; x0 \+ o6 w; ^output mcasp_aclkr,% t+ h" v5 w) y: y
output axr1,; Y" k/ ]8 d: m y# j
assign mcasp_afsr = mcasp_afsx;8 w6 F- K5 z: j* ]
assign mcasp_aclkr = mcasp_aclkx;0 F) p' B; U# L) j% L0 T
assign mcasp_ahclkr = mcasp_ahclkx;+ t3 R: @: X E
assign axr1 = axr0;
+ _2 w' c2 `) y) C6 ]# m0 q3 m. d( b+ j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 V$ T. o3 l! z) H- A2 _% T
static void McASPI2SConfigure(void) q5 V) ^. _. e. ]
{4 Z' r1 P4 D7 Y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 W; H2 J! [- s4 E& R- L& e* VMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
! v8 F2 w0 A2 L3 Z; D) xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! p* l3 b* B' u! B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ L* R2 g4 h. _3 ^ c* S" @" S* [1 @+ yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ s/ i7 B8 _! P1 r* [, Z2 R/ L1 FMCASP_RX_MODE_DMA);3 K- R( L. I, D2 g. T- V/ R4 ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 A3 ~6 Y# M1 z: [( lMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' N* b* ~) }) d' H; l1 ?/ mMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; O& l+ C* n% ~+ }, @
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ c8 m6 H; W; l/ {! O) [3 {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' D6 O6 n1 x$ y W9 U- uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 a- Z) {2 [" O _McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 L# V+ E) h6 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 ?+ [" I1 |; s+ G* u. }/ ?McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; J7 M* a. ^4 q0 y
0x00, 0xFF); /* configure the clock for transmitter */
, _5 S: C% u" j/ dMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" N0 E& C% v8 M2 ^9 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, ]( W U' j, y9 a' MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: j C4 G% h, w# x a% x* {
0x00, 0xFF);5 w1 d4 W1 x" E0 ^" D
: w4 W q+ f& [) c/* Enable synchronization of RX and TX sections */ 4 y% H4 O1 _' x8 x0 k3 Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
- S9 B' H1 t5 W1 ]% A2 a# ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) z( j9 U3 j$ t: u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ X/ Q. k* F0 k3 i+ l5 A- M** Set the serializers, Currently only one serializer is set as% i$ C$ j d. w. t
** transmitter and one serializer as receiver./ v% y8 \0 q) @% B
*/+ C3 {6 X6 W$ R, [. G
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! L M6 i# j3 E8 C
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 Y0 J2 P1 a, X2 }6 P** Configure the McASP pins
% C. a" C( P1 z( F/ A- q+ ?** Input - Frame Sync, Clock and Serializer Rx
' s u9 `5 v3 o! T7 l5 _# ?** Output - Serializer Tx is connected to the input of the codec ) J0 B* K8 N0 s: S9 V5 F
*/
- {3 T" o4 H- k! e2 tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: a0 D7 K7 `5 b8 e- x1 L8 |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( Z# [+ i4 }/ s& D; W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 N) O. {; ^( I
| MCASP_PIN_ACLKX
# ?; R% a1 z1 v; \7 g# h| MCASP_PIN_AHCLKX9 \+ z& c; S# w6 {" w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
5 R4 N2 P/ A6 w6 g' |/ HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# O' y3 a- m# W6 E9 r| MCASP_TX_CLKFAIL
! i3 [" J: Z" Q. o9 p3 j| MCASP_TX_SYNCERROR- s/ l3 j- p. T& M
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ [2 l3 v) Z) X% p/ P% p
| MCASP_RX_CLKFAIL
3 B$ D Y4 O+ z# ]* T| MCASP_RX_SYNCERROR
9 `6 y6 a* @2 `8 _| MCASP_RX_OVERRUN);$ M6 F4 Z+ _/ D
} static void I2SDataTxRxActivate(void)
) s$ ` h0 P' E' z{
9 a- f9 T# g4 t/* Start the clocks */+ Z' T3 }$ W2 r9 c2 L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- \8 x2 H9 W6 B( G& C9 S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 ]- j! N, k( I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; ]# ^* g# f# Z- c1 ]7 f. F7 U
EDMA3_TRIG_MODE_EVENT);- p0 B7 U( ]8 }$ |% \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 Y% S3 U! \# U% V$ T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */4 X7 ~8 }% q- J5 A8 [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: l+ ^4 R9 f5 c3 p. Z. ^) d3 Z, OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
: T9 V L( y3 U- w! W' Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, l6 ~! `# a; d0 ]' ^/ l; T$ zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 R+ { C, p1 j/ G0 ^* hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ l. m. h ?( N$ S8 ~/ k+ R0 G7 H} 3 W9 u P- n2 R$ D5 b6 F
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 t/ ^0 @" K% h$ O2 v$ ^& W) _! p |