嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,7 W6 F# R9 \9 W1 O5 a* a4 ^
input mcasp_ahclkx,% u' g5 Z" r4 }
input mcasp_aclkx,' z) ?6 L9 m) t* b, y2 }& ~$ k% H/ f
input axr0,3 a6 [7 z: D+ a `
4 C+ `' ?1 v6 R, h1 d8 `) @
output mcasp_afsr,' \& l+ |; @ N( O. M$ k
output mcasp_ahclkr,4 f# h% D2 c' Y8 F
output mcasp_aclkr,
/ T# p% k0 h/ P1 z+ `2 a4 ^output axr1,
% ]. S1 x; R4 t
assign mcasp_afsr = mcasp_afsx;/ ~6 Y' m/ O$ O: ~6 l F
assign mcasp_aclkr = mcasp_aclkx; N$ C9 N5 V3 T& u$ u
assign mcasp_ahclkr = mcasp_ahclkx;
/ C4 C7 }# |) n3 f4 Gassign axr1 = axr0;
4 k; ^6 B9 p2 ^7 W
3 s7 |- P4 g8 R0 C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 m6 y' T$ \7 \' Cstatic void McASPI2SConfigure(void). j8 F( F" `" d8 v) Q
{
1 h* A0 [3 L/ t m/ pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 l4 C) V0 Y/ I* b( U+ j" C
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */7 z9 H ^( x; G4 D9 ~; w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ @" N9 E& q2 h6 v2 E" R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
% L# L( c P7 @0 i2 v WMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 z+ y6 J* u( K; e% k$ |
MCASP_RX_MODE_DMA);& j2 M8 b: Z# q0 F7 ~+ D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& e, S' G& Z3 ], t! P v9 ~
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% U" A3 ]- n }2 {' P" O; e1 d9 n) {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 R, \! G3 R9 a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" J. H7 ~ }: C
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, `7 T" {( D$ E+ i
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
5 h& U( Z: x% v) tMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* c! L' k: o5 W, ~5 }# T5 { mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 z5 K9 u; z2 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- ?# j$ T N" s/ x& n0x00, 0xFF);
/* configure the clock for transmitter */
0 d5 } c; d) ]/ e' C9 uMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) X! a5 u+ r) D+ Q$ B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " l: Z# z$ Z( v; @5 F! k1 o# Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ J. [0 U4 S% l+ V- p
0x00, 0xFF);' ~% y' \7 i6 H) w0 f
* o0 @" R) `# @* o2 b9 B
/* Enable synchronization of RX and TX sections */ ( N& ?0 U, q( ]1 F1 v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
: r+ i% H/ ]' O/ H3 yMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* ]( z# Y1 |, E2 w# fMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*/ A. v3 c7 ], d3 v
** Set the serializers, Currently only one serializer is set as
/ ?% d% e7 u( D* c7 H** transmitter and one serializer as receiver.+ r% H8 V# @% R7 C
*/
4 M+ k% k8 N4 \3 e1 L% k5 |McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 L5 ~& K) ]( N, ]4 W2 F) r" ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 ^% Q- O* q1 j$ U: u0 ?& E
** Configure the McASP pins % Y- H6 R+ O5 Y. d& ^7 R" L
** Input - Frame Sync, Clock and Serializer Rx _$ y- X4 Q3 I' B9 ?! q
** Output - Serializer Tx is connected to the input of the codec
, Y( I0 B6 |* K0 J*/& u$ }- V, _$ l3 G* ^" y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 i3 Q- |3 Y+ B) K& V, q @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& O' j+ T( T/ `: I& eMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 c7 _5 k* ]3 `/ S A) g3 O, ]9 _2 P| MCASP_PIN_ACLKX5 B7 j( w8 c" E4 R! f; b
| MCASP_PIN_AHCLKX3 o. U9 p2 b' H. q5 s% r9 P; i
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */7 p9 V% x* @; a5 y Q! s* n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" W5 V8 C/ A- I# d. N| MCASP_TX_CLKFAIL ! |7 A- p& M: @
| MCASP_TX_SYNCERROR
# Q2 E) N$ j$ X9 B/ o- l| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- D) v7 u5 Y& s2 A9 O4 o| MCASP_RX_CLKFAIL
: A( O! m5 L C# g1 d| MCASP_RX_SYNCERROR
7 N9 b7 c" u7 O0 x2 A| MCASP_RX_OVERRUN);
/ Y% u; |$ y. h5 _4 r: R: F: s}
static void I2SDataTxRxActivate(void)
( X: A% w5 }3 W4 K/ ^4 z{
6 D9 U& u( w4 B+ J/ t t7 |/* Start the clocks */& G/ b) B7 Y, d( u
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) V% d, a O# f3 _# b5 e
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 w$ q; u+ m8 M$ w% i1 Z4 q( aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
7 c3 j2 }9 S$ C; k8 Y; D; K& IEDMA3_TRIG_MODE_EVENT);' n, Y! J% O9 t+ w' B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 P7 a3 {2 z/ ?" c1 X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
' m0 L! w1 x1 Q: O/ t- Y1 `9 vMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 t& ~0 j _' \" u% FMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
% Z3 ?4 Z ^* y }+ ~ Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% G' m" X2 ]; T: n, g) Q$ QMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' `) h: w9 p" ?& uMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 v# Y! B+ k" @}
$ n% G( S" b& H0 V& g2 a- ^
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ w* {% [3 X- Y- @0 O7 F' l
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |