|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" n1 y8 K9 t* K9 s' Ainput mcasp_ahclkx,
- N W8 D) ?! W& [3 c! kinput mcasp_aclkx,$ g6 c0 x" r7 [7 R
input axr0,. B; z/ C- A# O( t1 a- |1 P6 U( c
$ s$ V7 R( L4 S7 f0 ^0 Doutput mcasp_afsr,/ u# \5 E' d- L7 U! q9 G
output mcasp_ahclkr,4 N# O, K; G5 h. ^: L* {
output mcasp_aclkr,
9 F5 ~3 N9 [4 v3 k: X! P# koutput axr1,
" ~" t6 Y/ X1 O' S7 t# Q) } assign mcasp_afsr = mcasp_afsx;& g3 _& h6 `- m( I: d8 B
assign mcasp_aclkr = mcasp_aclkx;8 K! s; K2 ]( ~% k5 V" u
assign mcasp_ahclkr = mcasp_ahclkx;
' ?( h( G# N8 H" f8 g7 }assign axr1 = axr0;
+ n H$ n% D! s6 U% ?# l, w: U: R: d6 Z7 o, ^: `9 h7 M4 r* v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 * H% I6 P9 b& ?
static void McASPI2SConfigure(void)0 D: p, U) j- o. i- A
{
& Q: x! e7 l2 Y) ?% V6 A- T1 WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ \3 Y3 k \- B; M* pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 [/ q. I' k% F! g( a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 }' |5 G7 L" J& U/ t/ E* JMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, l5 C. k0 R$ J1 q+ AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) y5 j! A0 i0 |' i4 y
MCASP_RX_MODE_DMA);) h% s1 l* z8 [
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: f9 K# I6 D; d2 J
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 _" N; H8 ^3 D( _5 |/ cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ f2 r' _8 k: s* x }6 X0 Y7 {
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 j4 b3 X; |( w) D9 ~3 n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! B: p$ F( K4 i' d# Q! `MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */& H7 S6 R( Y' C5 |: H( y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ ~4 i$ v/ q' e: N9 I2 V$ i& ?+ w
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " t3 x7 W1 l. I9 o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) \0 X4 C. V1 A, _: ^2 L4 }0x00, 0xFF); /* configure the clock for transmitter */
! ~2 t, h: x. _( g ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' y9 j) \9 F- {, v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% U$ V; O, D0 @& M; u3 @. a2 OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," Y2 ~5 x; u8 M/ e6 I8 Y# c
0x00, 0xFF); B+ A C! g- R3 m1 P; p1 F
5 d6 V# \7 T; `% H s' t
/* Enable synchronization of RX and TX sections */
/ k" J) n' l' o5 }. LMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, L# c. w9 H3 @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 T1 B1 e; l- b5 f ~& c3 P
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- O4 P7 a ^( W, {* t# L** Set the serializers, Currently only one serializer is set as8 ~" y$ w1 c' k+ ^6 K
** transmitter and one serializer as receiver.
! F5 E" l. Y8 A7 r4 G*/9 d9 E( |* k) ]: e: S6 r
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 T: s; ?7 o6 J) ? W4 ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
; R) y1 E$ r$ L, f! n' p: {** Configure the McASP pins
3 r$ X& b" W& T) |# i** Input - Frame Sync, Clock and Serializer Rx0 x$ n+ ]/ T b% K/ n( D' J
** Output - Serializer Tx is connected to the input of the codec - B2 p- U9 F4 O* W) B, Z, E Z
*/7 g! w" o, R- |1 P% T7 O$ G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* C: v# ^+ M7 n$ \/ K( N8 @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 v" h& |9 ^& F1 g. ?7 l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. q9 ^3 k7 o$ e2 q| MCASP_PIN_ACLKX N% u K& P1 Z, ^+ t4 _+ C$ K
| MCASP_PIN_AHCLKX
: e1 l1 D% l M; `, {" j# K| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */9 w: ~) R0 w! u1 T; E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 I: M3 Z3 @- j L| MCASP_TX_CLKFAIL
9 ?5 a( V* S- A u| MCASP_TX_SYNCERROR( I2 v* j ~1 _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - R6 G. f N& n+ q6 n( H+ ?
| MCASP_RX_CLKFAIL- M* G' ]/ g7 [8 V4 W" k
| MCASP_RX_SYNCERROR
% M6 T+ }' c S) U* |# P| MCASP_RX_OVERRUN);
/ d& Z& d) Q/ i5 J4 b} static void I2SDataTxRxActivate(void)
5 e% M* j4 O+ \3 `5 G+ J/ {# t{
2 m. }$ G. P- t/* Start the clocks */3 T7 Y1 q2 O: G& y8 w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* u' L# ~) r: J" g* M$ O9 ~* `
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */" o& f8 C6 x2 {' L* C4 K) F% F; U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 j# \$ H! o( i$ Y4 H5 `* A
EDMA3_TRIG_MODE_EVENT);, ~& U- R; J$ Y. x% V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 V- f$ m5 z6 m- S) Y0 TEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 {6 E0 q' a* G0 @: A3 S+ v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& c1 `+ x# E+ c9 NMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 u y5 f. M. u" t8 @
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 Q# E$ r! d3 K( e oMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( a& Z3 E; g& x8 `) Z* F( O9 `2 t! KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% N/ d+ M6 H7 J
} 6 N6 P- B9 ~9 J$ ]$ i6 T) c' p: K- p
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 ?% @( I2 c1 j6 c7 x3 C# ^: r |