嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( {1 W* t" w6 P4 {: R8 Q Pinput mcasp_ahclkx,
" J- |# X, s$ L7 s6 o4 k W. r/ Ginput mcasp_aclkx,
6 s: t7 R6 g& m6 |/ ~input axr0,
$ r+ m7 t1 L3 ~: v) }' K, J5 R/ K& ^) H
output mcasp_afsr,4 g* r$ }8 D& y8 X& Z: l( y
output mcasp_ahclkr,
; p* F/ x" j) S) N) P5 qoutput mcasp_aclkr,
+ D; B2 x9 S- B3 B# G9 ?output axr1,* z+ g8 V; N! N; [, o3 {
assign mcasp_afsr = mcasp_afsx;
+ ]2 n9 l- V: P+ r( Iassign mcasp_aclkr = mcasp_aclkx;7 Q4 [1 K( V- V7 q6 O. ^
assign mcasp_ahclkr = mcasp_ahclkx;9 N x. F( y' s( b0 a
assign axr1 = axr0;
9 b) V7 o1 v* L' d& S
2 {0 Q( b3 T, G; [5 N# a在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 B9 r0 h# A- ~4 h
static void McASPI2SConfigure(void) \% X; F5 x2 u
{- O( r0 u A/ V! x2 U7 P. l
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' k a: @, m, s* \9 o8 B
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */; n( K$ `; W1 p7 S
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 M& P: _5 ^. p7 G wMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */' ]7 P9 O* {, J& u+ ]5 F4 ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ t# E7 V, X/ I& T" p3 T
MCASP_RX_MODE_DMA);: \* Y' Q$ z* X' x/ R% B$ G8 q& m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( ?1 ~% }% u& c$ CMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# E w7 l* }1 u+ e F+ S
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: v/ E$ T* ?7 b$ a/ `1 cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 G5 P( K! M9 S& U1 RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! t! I9 Y, v% i8 J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 T& n5 X2 u$ T# m7 LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 J; x% G4 a2 G3 hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 q {& ^: a+ e) @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ \. u5 \- x0 r' y4 e
0x00, 0xFF);
/* configure the clock for transmitter */
- G' o- q x3 m% e( ~6 H* RMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, t7 {3 U' a( |$ _" }1 bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# Y9 R3 B6 M/ I& ?( D. T0 U5 fMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( s7 `: |4 i, ~, w/ x
0x00, 0xFF);5 W& S! ^- i6 m8 L" W$ g
3 `% P2 K/ z# B' f+ B: T3 E/* Enable synchronization of RX and TX sections */ ; O) l& @ z; q0 @" F) a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* ?% R% L2 [! \ U: z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# p6 l8 O# k9 _0 XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( Y0 P6 h& s* n, a3 g) ^6 c3 R
** Set the serializers, Currently only one serializer is set as5 k4 ~- Y9 h- c: [( s
** transmitter and one serializer as receiver.& e4 [. s8 t' I1 b; e) Y/ e* y
*/
8 {: F1 Y/ `4 i& d& iMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 \' l3 {6 I- S6 c, ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 Y( Q% p- @: G) S: K. e
** Configure the McASP pins * y# ~( |* |% P( Y5 H
** Input - Frame Sync, Clock and Serializer Rx
0 P6 |# @! Y& C** Output - Serializer Tx is connected to the input of the codec 2 P& u# a" V, A4 I$ K7 {% q$ G; q
*/
~4 s! N* r8 m$ vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' @) U) _( w/ _3 YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 \9 y7 C- _, v) ]4 S, S
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 {; g- ?0 Y! a) C# A| MCASP_PIN_ACLKX1 }% p( N1 L0 u' h7 c
| MCASP_PIN_AHCLKX
9 o9 m( h; K1 ^! c& a4 Q1 M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
; X0 z7 j5 @7 v- |/ EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 N, S; C a/ D4 |: `: O. s| MCASP_TX_CLKFAIL - i; S( {4 _# Q0 Q
| MCASP_TX_SYNCERROR
4 y' e( o, p% r| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; W3 t8 c9 O% G| MCASP_RX_CLKFAIL: T, z& H# G$ ~4 _7 `; a
| MCASP_RX_SYNCERROR
8 u- |# ~. f8 j# s1 y| MCASP_RX_OVERRUN);
! x3 ]2 [/ {; l}
static void I2SDataTxRxActivate(void)* d: k' @( u& i# P2 D/ q9 n
{
6 `! }- @1 L+ f! B/* Start the clocks */
9 @+ O {' M+ z0 z5 y+ B. c5 pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 }" ]' h, g" l' ]
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */# }) k# X3 S9 n- e; y1 g- q! |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 p) N+ s% E% `$ v
EDMA3_TRIG_MODE_EVENT);
3 k* O( V' f$ N2 q/ TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. A9 v& V- G1 T9 n1 oEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
- x l3 t# b% s9 g! rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) p" x% Y# h1 P* G0 @McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */; s0 S1 Y9 m7 M: |# g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) a% @$ Q G7 x) b" @" BMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 A3 w! j: c' Z R7 o
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) W( O9 u; G/ O! Y# \ U2 L9 G
}
7 v& i% |8 U, u+ J% Z请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" m* p4 F' C6 s1 r# h; z. P" [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |