嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,5 j/ W% e9 v7 i. g
input mcasp_ahclkx,) q. W6 |5 ~6 T% l
input mcasp_aclkx,
0 ~' T* {3 P7 Y! Ninput axr0,5 O Q5 [. p I, S! H3 i: b8 ]3 O7 e
V3 g+ F2 \1 q( w0 voutput mcasp_afsr,
3 l& N# B. i; H+ r# U" M3 Y, Poutput mcasp_ahclkr,
2 M2 w" J6 B% h) p2 Q7 toutput mcasp_aclkr,! E% b( ^3 @; a+ l( R% `
output axr1,% F! Y9 Y4 g+ ]
assign mcasp_afsr = mcasp_afsx;
6 Y1 w+ w0 Q: k- a& t0 j: passign mcasp_aclkr = mcasp_aclkx;
# U$ ]; a) o1 L$ z& A8 t) I7 Jassign mcasp_ahclkr = mcasp_ahclkx;
6 S3 `$ {2 K, z8 p- p+ a9 Passign axr1 = axr0;
" \/ }& D/ a2 A' P0 Q8 t. m) E. o3 p! b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# A3 p7 v e& ~: G h& X% _; x
static void McASPI2SConfigure(void), [5 T6 t n) `5 I. @, F
{
6 ~1 B0 q% X) I8 c. O0 j( x5 [" t$ iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);) i9 ^0 O( C; L& ^
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
$ u4 R; D# v) m+ C* a% `) ^" B' PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* Q5 |$ }; e. j! tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 [, ~* D" g+ N6 B* NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ X' p8 e4 F# t/ u- ?) }- O; g I- SMCASP_RX_MODE_DMA);
8 N. W! }9 \8 }5 X; cMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- H% z% k7 V6 v8 s$ X2 o; y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */- S5 \! t( c8 D7 g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; B7 k* d3 c2 T& L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ n$ j) {7 y4 T; ?* KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ n) e; [; {0 ]0 d$ d1 h6 |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) ?6 [8 _: v/ mMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! |5 ~0 N3 ?7 O
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 P, j; f+ P6 k. J5 G) w' f% X2 MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 P" b6 w* P: o
0x00, 0xFF);
/* configure the clock for transmitter */
* u% X! O) }. w2 @* hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 n/ ^+ U+ v; a9 |0 r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 P, {/ T& @* F# ~) X% w* r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," }8 U1 c1 M! J; [0 @
0x00, 0xFF);
; {$ x! Y5 D# @0 k# T/ \9 C$ y6 i" l1 H
/* Enable synchronization of RX and TX sections */ ! F1 U7 d3 n! |( g2 I/ Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" b3 x7 p7 |0 a# a$ V9 {! O1 v u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 [3 j" m$ [ K/ ~1 B, n0 f4 HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
9 G- p h3 r! g** Set the serializers, Currently only one serializer is set as
l1 o( i# ~: M! _** transmitter and one serializer as receiver.
: o' S3 X# m, Z* U$ k1 N*/
) I2 ]9 ~. r5 o4 x+ b+ uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, c' C3 N5 j$ o6 ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 h. v5 `: N& Y/ ?+ l0 P** Configure the McASP pins & f4 Y7 {4 w5 H
** Input - Frame Sync, Clock and Serializer Rx+ ?: Y/ P4 C; T( h5 U3 U8 `' E
** Output - Serializer Tx is connected to the input of the codec
! K- K2 N% f5 x* u8 u*/
# |4 i0 W+ |7 o, C. qMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); J% Z/ J/ p& K! j. W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, q4 q4 h8 b5 a' ^& G
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: u0 J( c; @8 F* \9 y& ^* O3 w, y
| MCASP_PIN_ACLKX# P* n0 J+ J' D1 t) I- g- Y% |: ^
| MCASP_PIN_AHCLKX4 O% \5 @" x; n* w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% Q. Q3 M6 |8 t1 g5 u7 J0 ]! f' g5 P
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 H5 ?( y' ?2 O9 `" o, z/ V| MCASP_TX_CLKFAIL
$ ?! X3 A. e: [* s; ^) {8 n9 \| MCASP_TX_SYNCERROR
* u( R$ ~2 r) \| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! ?& ]$ b& @6 x5 o- P: || MCASP_RX_CLKFAIL5 w N2 r; d6 K% l+ J, T4 P5 C
| MCASP_RX_SYNCERROR 5 \, J0 i' K4 |9 X. p! W
| MCASP_RX_OVERRUN);
, W! ?* S) r* k* Q' r# V}
static void I2SDataTxRxActivate(void)
- |( A6 _0 S9 L, W5 H{, a( Q+ X+ [0 i# ~' ]0 \" b
/* Start the clocks */6 k9 [- u. C% O2 k8 }5 a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 t) e7 U( ^: L) C$ a3 _- GMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */% {% z. T- m; M( ?3 K/ i% v& J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( o8 n: e7 g" B- bEDMA3_TRIG_MODE_EVENT);5 e* y* E" }; I0 ]6 O: J, f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 X* X j7 T l; S! l& S) X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
9 S4 B9 A/ w5 K; NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 t3 U; y" H" yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, R0 N+ U/ t! H( J: ]: T$ jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */7 B3 d9 V7 p5 n W' z- c- r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS); z6 g4 A0 H7 m+ t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' o& E e; J9 j7 H) I0 N}
6 z- r3 C2 ^- U4 u7 m
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. A4 L- ~9 h' b
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |