嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," ?! _! F. V+ Q% I# H8 ]$ k# ?. d
input mcasp_ahclkx,) U* E, l+ o0 _- s
input mcasp_aclkx,
1 r5 }+ s' a: S3 K/ c9 S9 f1 cinput axr0,
" a. E3 ^( o N8 {- a2 j5 s5 C; B
output mcasp_afsr,
1 I6 a- x- P( a+ J. B7 p/ q) i( u1 `output mcasp_ahclkr,
1 ~1 Z# o3 r2 u( t2 |output mcasp_aclkr,4 B! U$ s0 S( S9 m5 M8 N1 l
output axr1,1 Y4 y! ~7 ^: ~. Q1 x/ D
assign mcasp_afsr = mcasp_afsx;
# Q2 }8 L' s K* \assign mcasp_aclkr = mcasp_aclkx;+ U2 ~5 t5 q* K/ h0 W
assign mcasp_ahclkr = mcasp_ahclkx;: B8 B8 B" _: t" g
assign axr1 = axr0;
6 f c t2 i$ i! n% Y
+ t7 p5 Q# |4 D$ E) k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) _, c( ?- S. U5 O+ F. {static void McASPI2SConfigure(void)6 G9 F4 Z- }) {- c! a% V: D
{
3 {$ H8 t! p9 }$ o' }. w5 S9 UMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! p- p2 s/ U. b: kMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( O) c4 Q0 }8 ~1 k) J& y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 F1 V. N' l9 [3 K; ^5 tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */" G0 `" b4 G. H5 U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ O5 N# }# X8 m$ i8 i: N+ y9 ~MCASP_RX_MODE_DMA);1 C% B' i8 B4 H5 n& h5 A& `! g
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# h4 i- j0 t# E+ d# X5 x% \MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */. f# |" C N- e. v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
w% @% I! I2 V& |6 g% m* |MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 B: l' q( a1 q- w
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" j2 t$ Y5 I3 [, Q$ DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */3 M, P- @7 ?4 m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% y" Y; c3 Y8 q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & I) l+ Q) ~+ e* R0 W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 h" @! X/ J" D/ P+ Z- M
0x00, 0xFF);
/* configure the clock for transmitter */$ b. P7 N7 W: @% f. [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& F: P0 i: [) x: Y2 ], ~
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - r& T* u; w3 T0 E* f
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 E7 n% a. M2 j+ U
0x00, 0xFF);
# _0 @# f: t- j# k9 |: K0 n
% u/ a7 c5 L2 _: C- R/* Enable synchronization of RX and TX sections */ ' t: n x @8 O0 [1 ?$ c
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 N( P$ P# x, d& Y* l* nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 z1 c: G# o7 r) @
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
1 d' q b, x% Q; N% ~/ m** Set the serializers, Currently only one serializer is set as" P9 W8 G. ^+ o/ M
** transmitter and one serializer as receiver.
/ \: ?4 n0 o4 l6 A% R a8 s*/
, U; Q3 c7 _7 FMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 ^' E1 Q% u9 `2 OMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/** y$ m& J3 ]* X5 F' `$ \+ y7 V
** Configure the McASP pins
9 v6 y, K$ C, r** Input - Frame Sync, Clock and Serializer Rx$ r1 X3 F2 @8 [
** Output - Serializer Tx is connected to the input of the codec ' k. J2 M. K, w1 d; t. `
*/
1 r. ]7 c: }) hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 J1 P6 i% |5 A0 A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); O3 N L8 I- i" B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 Y+ w* `# T, N
| MCASP_PIN_ACLKX
\* K+ x9 C* s1 y2 _) ]) p$ F* ]| MCASP_PIN_AHCLKX
- A# q4 p" L5 Q5 y( p, J5 b| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 T2 K. a* k/ p; b. C$ oMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ ~8 b6 o3 r9 e| MCASP_TX_CLKFAIL $ T; C* Q! I+ T
| MCASP_TX_SYNCERROR
/ }& E W: @" \7 y| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # j% L8 G" `7 d4 y
| MCASP_RX_CLKFAIL/ m6 T, W/ `) [. y; B
| MCASP_RX_SYNCERROR
4 k3 u; y2 J2 ?9 Q. i2 u| MCASP_RX_OVERRUN);
; S$ G8 M' y+ ` V0 \}
static void I2SDataTxRxActivate(void)0 P. k+ ?4 L. }& o- n
{
0 g9 W) I4 X8 O% c/* Start the clocks */5 }. ^4 g$ o) T
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 s# e' O, v. m! EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */6 ]! L+ H" ~$ X7 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- |( @% T, a- O- g8 CEDMA3_TRIG_MODE_EVENT);
: L3 g% e7 e; _1 f# a" CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " g0 f7 M/ J& ]) E1 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
. |4 X4 h2 [% d. y5 v2 LMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. A5 F/ j) ?3 L2 z0 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
# B2 o9 |. {2 q: @3 n4 _# Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */! N6 z4 k7 M! s( F" |$ I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 S! X# P: J$ eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 s' e( \) H! F4 |3 l9 O' W}
) I0 K: W+ _1 m请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 M* g" m; w; ?8 u0 @& x% E3 P7 y$ O$ I
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |