嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. q! r+ O4 E0 cinput mcasp_ahclkx,4 l/ B0 d- G6 y! S
input mcasp_aclkx,
( M$ B' \5 C7 n$ ?input axr0,5 B8 ` A* W7 i- D! j
. m2 q5 W) p1 u4 ^2 s8 Z! i+ a
output mcasp_afsr,% q. R$ D( R/ H; `6 d# c
output mcasp_ahclkr,
6 o) o J: K) \! G- T6 |/ Boutput mcasp_aclkr,# {4 S" I! k4 k& A1 w- Y
output axr1,
9 t; d( K! M$ Z0 h: E% m* H
assign mcasp_afsr = mcasp_afsx;
& L. q* u* _) O7 nassign mcasp_aclkr = mcasp_aclkx;/ i$ ?9 M0 q" ^( M8 I
assign mcasp_ahclkr = mcasp_ahclkx;, O# }/ ^2 S& W1 e
assign axr1 = axr0;
& S6 V0 Q5 ~5 c2 S- @& l
0 `( H' C, f8 T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& b' e: ?: |) f# O/ e7 E
static void McASPI2SConfigure(void)/ z, f' S- L. E3 ]1 Z! a0 k
{
' b5 E5 R/ O' D7 t6 ?0 ?McASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 h. `3 u! V7 {5 y6 y0 \McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 M# _& T1 E+ b# p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 c1 ?5 L0 y( `! K
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% p. F5 x* B7 g* _) N
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 Z& b( B/ v" Y Z8 p. U }
MCASP_RX_MODE_DMA);
0 K5 z5 E# p% u. ?5 H- K5 c/ v# g! KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% {0 g. d" ]! @8 M1 B- D! PMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 S, m6 H7 k j* W2 LMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: a! l3 }. n$ m' ^+ iMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& O7 [: L5 R0 l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # E& j/ E! P. |! i) Y9 }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" F0 } @ X+ f" B3 j2 ^
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ b9 D) D8 T9 c$ |2 H1 XMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 B* z' }. I9 m7 ]& P& LMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,' |& r# d5 p2 S# o7 i; z2 z6 }8 r
0x00, 0xFF);
/* configure the clock for transmitter */6 K- t' R5 ^# m2 A" V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* A& q; Z4 p; S8 d0 d/ _) HMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ N) L9 \( s0 A/ [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 s; Q: q/ n4 H
0x00, 0xFF);; y d9 ]& {7 i2 B8 v
* g7 ~3 W3 N$ l2 C
/* Enable synchronization of RX and TX sections */ . r0 N/ N0 V# O2 ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 V% [) ?, Y7 Q( b
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 E+ R. g* P% i/ ^& Z F& R
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! e5 X' |2 k3 r/ ?* O, U5 e* L** Set the serializers, Currently only one serializer is set as
" |' }1 E" k" T, E3 ]6 f" b** transmitter and one serializer as receiver.6 k, y) n& Y' P2 h
*/% v! V8 @! n/ {. f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' t2 i5 \% |9 g& L' Y2 F, e
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*& w1 X# a- o& G$ Z0 ]
** Configure the McASP pins - ?6 x$ }2 q: B0 V, x7 z" ~
** Input - Frame Sync, Clock and Serializer Rx
" {* o0 @- }3 R" ^/ M4 h** Output - Serializer Tx is connected to the input of the codec $ J( E& s: V- V& C
*/
3 X, n1 L7 {$ E1 q7 C6 p+ N* L* l- CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) B1 y3 h% C$ V! ~$ m; c, M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. y5 `3 _4 I3 j- z( zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, c C( z4 ]. I
| MCASP_PIN_ACLKX& Z _. X5 D/ `8 E+ c) Y
| MCASP_PIN_AHCLKX/ D1 P7 ?2 | Z r# w1 F& _
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */ U/ u1 Q) c3 Q) s3 u
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 ^/ Q" Q- b& w+ F, q! A4 f& M$ Z" E0 x| MCASP_TX_CLKFAIL
7 M% G$ V- {# o. q% s" T| MCASP_TX_SYNCERROR
+ E F, n# }% e) a| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: S/ f/ D* K ]6 [| MCASP_RX_CLKFAIL) e, R# ~: H! R& G/ D
| MCASP_RX_SYNCERROR 7 M# f1 O1 B X8 B' I8 D. h
| MCASP_RX_OVERRUN);
3 y h+ o/ v. ]( J}
static void I2SDataTxRxActivate(void)3 l" Z G2 g+ j' ]# P
{7 z& M& w/ }$ N9 W$ ~9 A) \+ A+ ?
/* Start the clocks */
3 o+ D* R' m# iMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* u$ O8 l8 R# S+ |( r- BMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ n0 o! n" j" a4 q0 g" ] BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) i2 Y7 {, r' r2 ^: p8 W7 H3 V; uEDMA3_TRIG_MODE_EVENT);$ s4 b: S6 c% r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 o! [; q f, N' d5 @% [ Q5 b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ j( _4 p# f n7 i( ]5 e
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- i, r( O) v5 t* u; W# d
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */1 g6 l& |+ d O9 D# J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
* ]4 X4 y+ a) C* ?McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 H/ R8 v- X% q% n6 L3 E( K! d$ Z- YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ b7 u6 ^' |& a}
- S, b5 y4 z1 E. p2 E L! L请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 T0 c6 |- r0 M; S( o0 H( F% L4 d
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |