嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,, `4 V6 X( X2 a2 c5 I( H/ s2 ^
input mcasp_ahclkx,. P: E/ z0 L A- y; {6 \5 D
input mcasp_aclkx,; { s' K& ?/ H4 k
input axr0,( C3 R1 {( g2 Q. E& |: R
/ S- {* h' k8 f* I
output mcasp_afsr,& G5 o3 E- w9 E. L" D7 P8 k
output mcasp_ahclkr,
0 Z& X8 ^$ R" s, b5 Z; |$ Boutput mcasp_aclkr,
* D. K% y& ]" Q/ `# a; ^output axr1,
9 K7 H8 s8 j( h2 V- q* O7 [- C
assign mcasp_afsr = mcasp_afsx;4 x4 r# E: r) z, b% [ E& ?
assign mcasp_aclkr = mcasp_aclkx;
2 H: A/ I9 \% e6 x n) T2 x- Uassign mcasp_ahclkr = mcasp_ahclkx;+ f) G1 Y6 v1 G* t; Q5 F/ i
assign axr1 = axr0;
' v" V: M$ i" U. W2 m2 A _- U
W3 S y' ~% r- S- \! t在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; N5 |/ I& m" \5 e' \( M. z+ tstatic void McASPI2SConfigure(void)
`$ _! ]9 t. i+ \& D+ {{
4 i2 k$ W* Y) e( T0 ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! l+ w+ O: _& P+ X( j- yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ w4 S9 ?3 e8 X0 ?! P1 J# i8 k9 s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
}7 c; {, ], [6 iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
^1 e$ {2 O7 f S7 CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ \ i3 B R9 J, t6 K/ YMCASP_RX_MODE_DMA);
/ t4 Z Y* E' g/ vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 O' Y! x1 y2 }4 O9 k
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
q# d' K" x) U: D6 v Y' _$ @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 E+ E/ B1 \: I) B/ J8 K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 d9 @ i( \4 U$ H/ u& } k1 FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 j* S- R" \$ ]7 _$ c& m4 ^8 b2 k4 U7 H( ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# ^ H4 p% N i' N' w! YMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& G( B4 s( p) W% q# @0 KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) j( }$ H& K }" IMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 Y- W1 B4 ~8 D6 O* X: [+ \0x00, 0xFF);
/* configure the clock for transmitter */, ?) ^" ]$ I/ D( G+ W% |% ^2 C. j
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( u9 ^$ |# z- W8 O1 ?+ F/ BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 s( P% ~5 A3 H9 a) R2 iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 P2 W$ j- A0 b5 q1 R$ W
0x00, 0xFF);
) v. }0 I: E# O' }: t8 Q6 D8 l! @+ T
/* Enable synchronization of RX and TX sections */ / W$ {" |+ [# W# a' v6 h) r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */4 I1 [1 e2 W& [: v
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ b4 K+ `8 [/ `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
l0 _; T; x9 A- r* \" M1 K** Set the serializers, Currently only one serializer is set as
/ Z9 ^! K4 G/ q2 f# X5 ~** transmitter and one serializer as receiver.
. H% ]; r8 S& @ h, r. s: \0 s5 P*/9 u$ j1 `9 E3 u: j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, O9 d% U+ H( G+ o' p% T2 t- \9 y0 fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 M: G$ W+ T0 F** Configure the McASP pins
; H1 I2 y( Y/ B8 t7 ^8 c( X** Input - Frame Sync, Clock and Serializer Rx
$ Z$ w) p3 A+ _/ j. v, z2 J** Output - Serializer Tx is connected to the input of the codec
9 o. t6 c6 ~( m1 r! g*/
# F+ @$ v) ?# NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 i+ j8 s+ l3 D7 j
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ p" t$ C2 Q& I0 E/ C9 M4 sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 |& b. m! v3 D U2 t7 A
| MCASP_PIN_ACLKX
8 g1 e5 i0 ]: z! D5 e0 \& w9 I c5 V| MCASP_PIN_AHCLKX1 r- Z- |7 F9 R4 f
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */7 M( b$ O# ~4 [! E# w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( b \- c1 W" v| MCASP_TX_CLKFAIL
6 u# p% I; [3 N l7 b1 O| MCASP_TX_SYNCERROR
$ j+ _3 g8 I- t) r0 c| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" P' G1 W. i- o$ q; p7 G$ ?| MCASP_RX_CLKFAIL" S0 ?$ X- E# R# |8 }# ~- Y
| MCASP_RX_SYNCERROR
8 M; n2 e+ J8 v* O| MCASP_RX_OVERRUN);+ U$ a2 j' X5 t$ T7 g% z/ I
}
static void I2SDataTxRxActivate(void)
* @, {! V$ M! i2 M* Y{+ N: n Y$ K9 M h! E3 t. L
/* Start the clocks */' T, N. v: K2 _5 z7 w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% K7 S h: ^* J7 AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */& Q1 r) B1 u5 V3 ?3 P# ]% g3 y) W3 ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# h7 `$ |% t4 [: z" D; ]- F' }
EDMA3_TRIG_MODE_EVENT);/ L4 L, D: ~5 F# r8 h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 }# j: z5 C. ~
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */, G: v0 Q8 P: p; t- M# H: }4 g
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 T B7 T3 b+ b4 ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
. x# L) E0 D ]while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ J( r8 k2 W$ [; s& |4 b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 b0 _; W$ [# E( Q7 Y! n+ I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- K9 J0 |/ g3 o( [, J* Q) ~9 w}
1 q1 J# a- ^; F( F: N N请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( ~+ ]* _* ~8 N( v; z( w0 ?
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |