|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% z, s' q0 j& }1 |1 ?
input mcasp_ahclkx,
! F8 v/ W5 \/ {1 X; einput mcasp_aclkx,
( Z- V5 r; ]% Q% g8 dinput axr0,
! y5 l# N: g; }& ]! @" e! H j/ ] T) J& C! @9 J
output mcasp_afsr,
) @2 _" N1 L7 F/ a- Toutput mcasp_ahclkr,* P, [% h+ Y2 y
output mcasp_aclkr,
4 J( T- S+ @/ ` N) noutput axr1,* x! g" T: }9 z* y
assign mcasp_afsr = mcasp_afsx;
! H) d' [, Z* q/ T; _( @' F8 Hassign mcasp_aclkr = mcasp_aclkx;
) \* b0 }: V f1 dassign mcasp_ahclkr = mcasp_ahclkx;/ c1 ~. C) ~0 H5 P
assign axr1 = axr0;
& x7 F! t* ~7 N) i
& Q! w/ B* F* u2 i在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 [) c/ F4 c& I1 L, C2 {* j9 _/ e; _
static void McASPI2SConfigure(void)3 C. ~2 Z: {. w; G0 B) V+ A
{
3 f' ~) V/ s. E; k# vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- i+ ]: k3 D, Q, s1 l3 X
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* [* C3 N# u, v' e: \. qMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& G" _# s$ S1 A2 F5 {' |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) ?) _5 ^6 t+ }; U0 C& uMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 O3 r$ m& A7 s. F6 ^0 WMCASP_RX_MODE_DMA);! `: v2 E) R# q$ Y- C* E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ^: J* _2 z, i
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% P' R! e$ M: _- _: KMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & H6 H* K8 Z$ R7 {
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# J" N0 O$ y3 B8 B# E) K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 ]! Z" ~( h& H ~( A4 gMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* g, \; `& U6 A% q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! _- x0 T4 s) E; o" X% j, m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" D* n( \6 q$ V$ f; ZMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ J3 o9 k5 j6 L& s. C7 c
0x00, 0xFF); /* configure the clock for transmitter */, G, Q. H5 w- C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ e; n$ N+ t2 A, |7 J; \McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) [+ K7 J$ O0 ^' Z6 _- O- u* EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% S, F6 h9 G- D! a+ {
0x00, 0xFF);% J P- c8 d) e, [
0 z9 ?$ z- f4 ]) X1 u/* Enable synchronization of RX and TX sections */ ) p4 q) Q3 _. u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' R* D8 n" O& i. |6 Z) }$ g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 B) y4 f) J6 |5 H4 s! I
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% s" \8 H8 O x9 {3 D** Set the serializers, Currently only one serializer is set as4 m' Z% A) S4 }8 l; n' k
** transmitter and one serializer as receiver.: y- \& Q0 L+ q+ m/ Z+ h7 w' C
*/
: V" x( A! z- kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& E- n ^! R7 ` g0 |7 P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** _* r d0 V) x
** Configure the McASP pins
( ^8 ]8 x+ U4 j3 q** Input - Frame Sync, Clock and Serializer Rx a+ B$ l4 n2 \
** Output - Serializer Tx is connected to the input of the codec " Y1 v' t& p; [% m
*/- {% M! c: m7 t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 q: _4 u; @& [( L0 N( F
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& V6 ?8 f) b- K$ E- m& n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 [' [! M3 w- g9 I, E& I
| MCASP_PIN_ACLKX
5 C+ n5 R' }+ F" C8 {| MCASP_PIN_AHCLKX
& G0 @+ a8 Y4 b. B/ d2 Q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% T, K2 T1 w! S: e { t3 c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) T% g) y* q4 ]5 z" g0 |- t1 Z| MCASP_TX_CLKFAIL
9 B; w( R* B0 u+ p- X; n/ X| MCASP_TX_SYNCERROR
3 t* a+ L* i4 p' }, a1 ]7 b| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * q. B. |5 `. T5 x( I& q
| MCASP_RX_CLKFAIL7 U( g% m- O/ ]% `1 X
| MCASP_RX_SYNCERROR # ]- }5 a$ T# G% F7 ?( T
| MCASP_RX_OVERRUN);
6 C' a7 P( i2 @3 S5 l1 J} static void I2SDataTxRxActivate(void)
! z) j6 ~# h+ \, @0 Z, n1 L{/ M8 f) S0 _7 i
/* Start the clocks */* y2 j+ A% D# i9 V ~, c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 @5 I) i# l. v4 m) yMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 p! _) l; @7 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* {( z& }3 x0 `) b) ?: bEDMA3_TRIG_MODE_EVENT);# L6 e/ p. |% r* u2 _6 A3 w( s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) h( N; s% Z# G5 C: S; M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ F( a5 y/ }5 O/ aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ t( ~3 `3 `/ t0 n0 V5 r% R& t
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; Z/ ?- A. x! |! k+ s3 i. g5 ~! twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
F3 |$ T( A' D5 [McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. E) Q3 ~2 I5 D5 nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& j4 Q, d# o/ |/ H* w+ v! Y$ Q} ; V. X0 |" G0 M: `: p
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ) [$ k- ^- E3 e3 A) Q9 \ z4 c ]
|