嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- X9 J. O; w4 g1 F1 zinput mcasp_ahclkx,, H5 v- |, ^: [+ v6 u% @
input mcasp_aclkx,/ t) B: l! `+ `$ A, X B
input axr0,
. ]) q; h, f; z9 q+ o% ?8 F
, r, W- U( ~5 d- l+ Doutput mcasp_afsr,% p$ X1 C4 j9 ~' ]: b) M/ S
output mcasp_ahclkr,2 G' v2 g& b0 Q8 N" p2 f) P" P
output mcasp_aclkr,3 `8 S% t: M1 F g) R& U
output axr1,1 p: L" Z# F' |' K
assign mcasp_afsr = mcasp_afsx;
1 y$ A9 p) z. r$ d) |assign mcasp_aclkr = mcasp_aclkx; X' J' V7 n: e$ h. o: l
assign mcasp_ahclkr = mcasp_ahclkx;, Y& K T4 y3 O. @
assign axr1 = axr0;
3 T a' c8 U ~. s3 f
! M( d9 B! Q/ ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ r% t: q1 r3 T0 b& O% |static void McASPI2SConfigure(void)/ Y9 s$ ~. s+ G4 K% D
{
, l: y j2 {) s4 \9 v- oMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& N z/ C2 `' v9 O- w1 RMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */4 x% ?3 l$ q- Y& H, _! N `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 @( w7 |1 p$ l n( }/ S% n
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */& \2 i* Y/ F" {8 c3 n
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ^1 N5 s' ]" O( B1 Q G* M# ~MCASP_RX_MODE_DMA);! d: o7 _# c* |3 C3 f J: G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% ]5 P: |5 x$ [
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ @0 Z/ L/ c8 H: ]- y) ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . A8 O( a5 d3 r& I( B8 {6 e7 u+ q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ H: u& S; V1 l7 `6 ^McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) F, H/ _1 U9 `) S4 J& u. N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */- b! w1 `$ y3 `8 e1 X$ [3 @' L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 T. G/ e5 J8 Q% @
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 j$ F' U3 C/ j7 a; Q1 ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 ^# B! C: R0 Z5 \ r3 O7 v
0x00, 0xFF);
/* configure the clock for transmitter */
5 g: v5 U/ G3 p9 Y; FMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 t/ e0 ^4 W9 x1 _4 e2 Z* d
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 B$ B1 y! e! e5 {( `# o7 W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: ^5 n r& v, b# m. b2 p0x00, 0xFF);) L" g3 O9 k {6 z6 \$ N
0 f# j2 n* Z+ {/* Enable synchronization of RX and TX sections */ $ s1 \) s! w1 n. i2 _2 \9 L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) p5 j, O( W! x! x& |; s# l. LMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); C u4 g4 q) A% u' O+ F
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*5 a6 q& S. b' N' Q) z" _( l
** Set the serializers, Currently only one serializer is set as
' J3 Q& s$ K5 }3 Q' @" E** transmitter and one serializer as receiver.1 Y1 w3 A, d; m
*/8 c8 \/ p. N; `: Y! q7 o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. b' I! Q/ }& `( R) G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' I- l; A4 g' n3 m
** Configure the McASP pins * a% `: D# i9 o$ N! N: l
** Input - Frame Sync, Clock and Serializer Rx; f( r1 }9 }, }" E
** Output - Serializer Tx is connected to the input of the codec / c# W- g8 s$ d$ T! \& u. A7 y
*/$ i* y* z2 W( M4 T0 G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; x. @# B3 e: P" R' M- `
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- ?* @, J5 q" Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& i; y8 i+ N2 G* n7 f& r8 `
| MCASP_PIN_ACLKX, L' n/ f- e$ P6 O- P8 ^# I4 P0 L
| MCASP_PIN_AHCLKX+ @ p: i! r: A* f+ @8 S: b
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
) I- Y0 X+ `: fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
s+ U7 g5 E/ Y D6 t8 W& J! t| MCASP_TX_CLKFAIL " f2 P2 C* A" L
| MCASP_TX_SYNCERROR
2 n9 V! o( ~5 ^% M| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ e3 A$ C$ i9 I5 E| MCASP_RX_CLKFAIL
2 ?* Q* G9 M8 j) m| MCASP_RX_SYNCERROR A( }4 Z' A+ M: b+ U
| MCASP_RX_OVERRUN);
8 o* D- m/ m* y5 E) x3 y. `}
static void I2SDataTxRxActivate(void). C- S3 e: N* S
{
& x) j2 [' A5 d/* Start the clocks */
+ {$ x7 h* X, D6 m- S# oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: h3 Y4 r8 }- Q8 s+ i% _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */. a v- c- o8 h/ d! x/ U. K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 ~! }- A" c) }" z/ M" W
EDMA3_TRIG_MODE_EVENT);
+ U l# B6 e' \# F1 I ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * T: a; @" P& W/ f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
( G& S' z& k4 ?+ N$ qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 s: t3 A( }& R* Z& j5 E- c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
- k7 ? m& v* c* n6 y' Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% o; Z J5 K4 z6 i% o3 g# U, j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 J9 y9 k+ M! y" `! u0 [
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" ^) P' C2 O0 ]9 L
}
1 A6 ], x( ?* |
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" Y1 T" `' n- [6 ]3 z y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |