|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, O2 {9 E+ C' _7 n0 l6 A, xinput mcasp_ahclkx,' f4 ]; B1 M* j
input mcasp_aclkx,6 m! Y4 m' v! m
input axr0,$ \; Y" ]# c" H5 q' X+ P
4 [ G' G. s F% koutput mcasp_afsr,' U: H3 R" X4 A8 s
output mcasp_ahclkr,! R n0 d5 N+ N7 G0 i" h
output mcasp_aclkr,
5 r v& C& Z8 n2 M7 Joutput axr1,, ], v" C0 y/ z4 T2 b
assign mcasp_afsr = mcasp_afsx;& L' Z5 k8 L% N; L+ q
assign mcasp_aclkr = mcasp_aclkx;# F8 O/ P9 @- o+ F) G
assign mcasp_ahclkr = mcasp_ahclkx;7 K! x+ L7 Z/ @) K* ?& A4 ]5 \% S
assign axr1 = axr0;
- j, \! k0 W0 G& F2 n# z# _1 S" d C( P; x4 z' N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& \# H' P, d, V5 z# x* [2 \6 i' }static void McASPI2SConfigure(void)& T2 w, s9 P3 ^/ ` S. A
{( a: A; X! ?) F/ Y! D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 d4 h4 }+ E' B9 {) HMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
- `& Q9 }5 n9 f7 m6 _8 tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ r G8 Y- r/ @. Z1 Y6 a& i* T, k- _) i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ ~3 a9 M; d3 J9 IMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' L. E! A. O$ X V% f7 Z' Y. G$ q
MCASP_RX_MODE_DMA);" i0 P1 j2 x! ~3 N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 r" F! N5 h$ gMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ j7 ]! x2 |- |8 u) h; N
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; G5 A9 u1 S8 x
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& H2 W; q; H+ } G$ I lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* i: E9 h$ b/ K' ]3 X; wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 R" _/ {5 l/ g* s* H, r* {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, c% J, k D9 O& g( U2 g$ A* I! KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 l0 V' M/ ?' x& v7 Y- q- EMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* ^/ `0 P L, x5 Z
0x00, 0xFF); /* configure the clock for transmitter */
6 B& `% ^. S/ K% e( gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ }$ U% h: ]5 b2 ?& s
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, _6 b9 k' q' D* dMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 w; \4 _: m# O2 A# c
0x00, 0xFF);
. f A. f0 s: q1 G: W% Z( r8 v/ k
/* Enable synchronization of RX and TX sections */
! f- w& \/ m! q/ T, [# CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* a' P7 A4 h& e7 j" s+ V7 b, QMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 O8 N7 O6 `7 Z$ S+ a# d0 E
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 }5 _# H$ [" o4 F
** Set the serializers, Currently only one serializer is set as" w. U0 Y& r: T8 S
** transmitter and one serializer as receiver.
+ ^; B9 c4 T/ P- V3 b- v+ \*/
/ D* s/ B% G0 }, E. V6 P! Y) `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); p" O% @" v+ U+ W L1 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*/ i" C( W, ?/ h$ d- N1 ]4 o# t
** Configure the McASP pins
; S7 Z) v$ n, s% S- T: j: b8 a** Input - Frame Sync, Clock and Serializer Rx, S. T" A/ R5 [0 k
** Output - Serializer Tx is connected to the input of the codec 3 h3 ~% Y/ F5 _$ @% T+ W
*/) B* i/ N+ U; S. B: q# d4 h: u! u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ b% B+ m* }# o1 F U7 v( oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& m5 x7 K! \8 g: G) s- DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" p4 d8 l+ {6 q# E7 Z! E( f
| MCASP_PIN_ACLKX
, _8 h4 f, f) C9 _5 J- t E, r| MCASP_PIN_AHCLKX) l) f( E3 n8 R: i8 Q$ V: X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( g# X+ J5 }' H" Z' AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; Y; i8 p4 N5 f
| MCASP_TX_CLKFAIL 9 T3 ?2 R% K1 @1 O( S
| MCASP_TX_SYNCERROR
Y- C' | O7 d+ Q7 T! K| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ u% O, J6 Y5 s9 h' t& J0 t| MCASP_RX_CLKFAIL
8 Y+ H- y# m; n3 c8 c| MCASP_RX_SYNCERROR ' Q B& {6 o2 R% f
| MCASP_RX_OVERRUN);5 Z8 {9 {" S/ S, m4 k
} static void I2SDataTxRxActivate(void)+ B( D% M( H! n" {
{
* G: T, b6 i2 G+ d% _- h# {: i; B) i: B/* Start the clocks */
1 D. i8 n' L6 A4 PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( `# l2 k6 R) ]3 L, l. _# D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */+ ^# G0 u1 T5 [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# y. d( F8 Z* ^EDMA3_TRIG_MODE_EVENT);
5 f* N+ G5 c1 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 r9 r/ R, l5 c; }3 O W) kEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ Z9 q4 C! w8 [/ }McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 j: z7 V' p( D7 mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 x" r: {9 n7 j& V: w; p
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# `" L0 U# ?+ V# z; i7 O2 @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 x% I4 |# d6 j/ j9 A: h0 CMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% c; C& ~3 _8 v}
% S0 G. A- A& a$ E& X请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; Q0 Z8 b% o3 C* I2 p) z* f |