嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& J5 k! t& {, @# e% ]% k3 }input mcasp_ahclkx,
' M$ ]# f# a4 @% v# Z& W3 Binput mcasp_aclkx,
( P) h, [3 k; ]3 q; Einput axr0,
! a$ y' _ v8 G/ o- {% d' `9 V/ H7 N; g4 x
output mcasp_afsr," k1 k# R0 @' j! i7 C
output mcasp_ahclkr,
) p; \6 y% F c, y4 t3 V) _1 n' foutput mcasp_aclkr,
. f0 m7 @$ l8 d: [, k' eoutput axr1,& d3 D% y* w9 C' J
assign mcasp_afsr = mcasp_afsx;6 Z' B2 s$ Z& }: \; v( a; E
assign mcasp_aclkr = mcasp_aclkx;
% @: V1 r% @. H0 @# ]* r- D* Aassign mcasp_ahclkr = mcasp_ahclkx;
$ ?2 ~. S7 }( `assign axr1 = axr0;
" w+ V: Z3 K% V$ f7 O/ f) h6 |
- u% R. F2 t/ M% o4 c( B在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ }" J% T( \( Q3 Z& ]$ Z+ ^static void McASPI2SConfigure(void)
$ R$ |. U8 p& n. H+ b* P{
x8 o3 u- o# }- }; ? ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);1 v! r! U6 \: e9 G: K3 v" k
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) l) `4 r; g: b
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( v# `& w6 r X2 e" w$ M/ IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */9 a4 G6 I$ W1 s7 o8 d/ I5 O- L
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 L: t% z' _; \$ a4 q/ g# j* XMCASP_RX_MODE_DMA);2 L; D* f; r% Q1 O4 H: l- [0 Y
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 w6 d: T. ^# r) P$ _
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ I1 k& p- G* N
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: r) \# q3 n; f; E* s! xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& _6 Z3 i* P- S* f- q$ K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! _: `: t6 [0 aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */& @$ k( F Z8 ~% R. u
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 o( G: j ?5 B4 C7 [8 \3 x9 JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ u4 K8 P t4 O" UMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ T7 ^5 l" v0 D& U# m
0x00, 0xFF);
/* configure the clock for transmitter */. }- L6 B v/ |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 p) m0 X! a' WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% u+ E. O1 a- T$ u3 W* x% ]' v% _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
K+ _2 j; i5 H, S* I) M: I- Q' \3 \( i0 ~( y0x00, 0xFF);
9 i& T( l9 s$ {& J
; G+ S5 D, B& ]/* Enable synchronization of RX and TX sections */ / [0 h5 l# q4 p% V# p7 n1 [+ j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 ]# t* u6 O2 e2 x
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- O/ ^% m$ U" lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*; s3 m# z4 ^, t* ?: y& o
** Set the serializers, Currently only one serializer is set as8 t+ Y4 u9 d& j. X) V
** transmitter and one serializer as receiver.
$ y3 u @" Q" `7 r. R% {*/
# T- p% y8 f- |4 _3 A3 u* U$ ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ t$ D4 }: m& u n1 k, _- cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
0 ]( z, A# f; A- H0 W+ H** Configure the McASP pins
' t" W' `0 P) Z; M3 X: n% j** Input - Frame Sync, Clock and Serializer Rx0 V3 n# j/ e M6 d D( X
** Output - Serializer Tx is connected to the input of the codec & h7 W$ o, n4 l1 ]7 c* K4 G: I
*/2 _, N( d4 }: j M) y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); H+ c% V, D9 t) W, |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. Y+ h* s) S/ v
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! C, z/ ]0 |5 v& {
| MCASP_PIN_ACLKX+ U2 u0 o/ V- u8 K+ J
| MCASP_PIN_AHCLKX
; ?+ } t" f" \6 v7 h* ^5 A4 [1 n| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */+ Z8 E) F2 b$ u) ~
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. x" i4 M1 d, C1 g| MCASP_TX_CLKFAIL
$ w6 ~7 R9 N: P8 Q( K& \| MCASP_TX_SYNCERROR
. R# w3 I$ Z* X/ x| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / F3 `5 }5 x3 e, z, Z) X- S; K
| MCASP_RX_CLKFAIL; c* x6 J# }8 ]9 @" z( @1 N
| MCASP_RX_SYNCERROR
6 p' T1 m+ y7 U5 o0 `| MCASP_RX_OVERRUN);
* Y* k @. R1 c8 c2 W5 j7 c}
static void I2SDataTxRxActivate(void)9 d/ c+ g0 g0 b" w& t$ C6 a# s
{! c( g1 W) j9 ~0 e
/* Start the clocks */6 R! w. y8 M9 r Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ a3 {5 W3 i% @- ^
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
' V7 d9 h% @, Q6 Y" y1 ]- qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, v. k- ^8 T1 Q# z U% zEDMA3_TRIG_MODE_EVENT);: I9 U, a1 W; f3 K P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # R* O+ i5 {6 f9 q$ t2 M+ L
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 |! h7 A: i z: [, C/ i! nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 L% O; W* ~- M5 i0 a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 W6 y: E9 S2 ?. ~. Z' V
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
4 [3 D$ N" O1 Q& W/ n6 zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);' N9 \8 X* T; T9 ~% ?6 D( ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; u- t" o7 R! l3 ]; \( }: T
}
" ^0 {! u" B/ ` R* G1 [! f2 d# g
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 R1 M2 N( F0 U
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |