|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, F/ T2 I& l) ^% r$ \, v6 L0 C. M; C# qinput mcasp_ahclkx,
$ u) p4 t# f7 H7 E- ^$ t5 e' E6 kinput mcasp_aclkx,
* }6 N: `, J& O4 ]4 b" yinput axr0,
9 Y% n0 x/ A' J7 |5 [1 r$ ]. p5 e- F" \
output mcasp_afsr,. E [. Q% F/ s9 R8 ?/ u
output mcasp_ahclkr,
& N+ V& z) A Z f$ |$ [( Poutput mcasp_aclkr,
4 h6 Y/ ?+ _) u6 C- n9 [output axr1,
* m% b: e9 [; M8 ^$ S assign mcasp_afsr = mcasp_afsx;/ F/ v/ F4 A$ C2 [
assign mcasp_aclkr = mcasp_aclkx;
& t3 ?' I2 @. {5 d. l7 g; w7 s, Rassign mcasp_ahclkr = mcasp_ahclkx;* A5 y$ Q$ J# ~1 N9 i' Y
assign axr1 = axr0;
6 I8 W5 k8 r4 c; E( }7 }* y' ^
- z3 K1 S# x7 p7 i: m: `# [在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & r( Y$ H/ F- K
static void McASPI2SConfigure(void)
' A' ^2 C- `; q2 O1 U/ J+ H! B{
0 g4 A3 C6 Z* QMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
( M1 ^1 V9 C. IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */6 s# j7 g; q1 l& G1 M( [8 s. M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, P2 M; g) f: t6 g: u' C3 M. dMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- ^. q( I/ w6 x: I% o. q YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( P7 g5 K: w& K' y2 d9 }MCASP_RX_MODE_DMA);
* `9 q, g* o" K6 A1 d4 u0 yMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. o! f- o( m0 `& ?8 P& [
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( _* \+ l5 V: r& @' u% | i# jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . m. l$ G# @( ~, C6 [' Z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 ?) D3 m% q0 ^$ l' b0 Q! w* n/ qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# F, g5 M0 H5 ?. yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 I8 O: G! s6 k7 i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 j8 Z) ?+ a: V' G/ m+ T$ U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & g* r. u4 v6 z5 S9 R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; V& N& \3 h: H Y+ R T6 O
0x00, 0xFF); /* configure the clock for transmitter */- O$ V9 ], O' R2 D( t
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 J3 W6 ^4 H0 T6 k* b6 F5 CMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' }& F3 n# p7 t, h- l
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 d Y( c! x5 @8 n+ |: F
0x00, 0xFF);
' h( p$ A3 P9 E; n* J" a1 o/ u' J( W+ ^) T
/* Enable synchronization of RX and TX sections */ - n" n+ F/ T* M! c4 r$ h- R
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% v. A% b' J: D, B- z/ D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* j) |/ W$ u! _8 N5 C" [4 t" Y# W9 S
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* W9 n2 T7 a2 M0 G2 D9 s2 d
** Set the serializers, Currently only one serializer is set as
$ L- U8 X# g) t! q. U# l% I; J** transmitter and one serializer as receiver.
; G. x M5 j4 k/ ~- h*/
6 p/ k `' N: V: tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, ~$ `3 F% B5 M* j: p, J8 ^6 R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 i o- m+ h( j# }: b
** Configure the McASP pins
6 B1 B8 g0 r0 \** Input - Frame Sync, Clock and Serializer Rx
6 {* M4 _- d* \& M2 y$ {: M& ~3 j** Output - Serializer Tx is connected to the input of the codec
$ c5 O0 s* U7 m2 k*/
- l% C! z" r- ]0 }( dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 J& w. {7 ]1 \0 `
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); p! O& S6 f! {9 n4 A" c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) x* ?8 ^5 n" {( ]& t; b+ g# T
| MCASP_PIN_ACLKX
0 c+ I0 f9 @( _; c| MCASP_PIN_AHCLKX
; P) u9 I% R& d8 t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 [; Q$ z4 a! P. ~" S( [6 k
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 l, A3 ?! }9 V3 ?6 p4 `
| MCASP_TX_CLKFAIL ' Q% o) R# r/ N2 n
| MCASP_TX_SYNCERROR! H8 s4 o% C7 s/ ^2 R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 x* l) H X, p| MCASP_RX_CLKFAIL% Z b) X3 @' A4 h
| MCASP_RX_SYNCERROR
1 j4 t3 `' }' ~( p| MCASP_RX_OVERRUN);3 `* @0 J/ K& U! l2 n5 U
} static void I2SDataTxRxActivate(void)# E9 \ ^3 Q M% p+ [7 y
{) N3 ?% P8 y% ^1 Y' r# P
/* Start the clocks */- Q# P r8 ^. p; J6 a5 |# {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( a" P/ E2 M2 a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 O0 R' t6 F* A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 ?% [4 e( l# \$ j* D2 ?7 b* w
EDMA3_TRIG_MODE_EVENT);
1 ]0 `/ h" {9 s/ |9 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- F, F" C+ _/ y8 ^5 D- @# EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% z2 X4 W3 E# u: hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
t* p3 o8 N+ gMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% W" a+ U: c& d3 `. k# X) t6 \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; x2 ^: {- E f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 [' U5 ^( S9 I5 h, o* |9 ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! S* s* p" q8 X}
) b+ @! n1 N: H7 N1 u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 Y9 m( O: X* z8 q6 { |