TI中文支持网
TI专业的中文技术问题搜集分享网站

MCBSP1的接收采用DSP模式,发送采用SPI模式,使用完spi模式后,用不了dsp模式

MCBSP1发送spi命令到wm8768,MCBSP1接收ak5702的数据

//16bit spi设置
MCBSP_Config mcbspCfg_daControl_16 =
{
MCBSP_SPCR1_RMK(MCBSP_SPCR1_DLB_OFF,
MCBSP_SPCR1_RJUST_LZF,
MCBSP_SPCR1_CLKSTP_DELAY,
MCBSP_SPCR1_DXENA_NA,
MCBSP_SPCR1_ABIS_DISABLE,
MCBSP_SPCR1_RINTM_RRDY,
MCBSP_SPCR1_RSYNCERR_NO,
MCBSP_SPCR1_RRST_DISABLE),
MCBSP_SPCR2_RMK(MCBSP_SPCR2_FREE_NO,
MCBSP_SPCR2_SOFT_NO,
MCBSP_SPCR2_FRST_RESET,
MCBSP_SPCR2_GRST_RESET,
MCBSP_SPCR2_XINTM_XRDY,
MCBSP_SPCR2_XSYNCERR_NO,
MCBSP_SPCR2_XRST_DISABLE),
MCBSP_RCR1_RMK( MCBSP_RCR1_RFRLEN1_OF(0),
MCBSP_RCR1_RWDLEN1_16BIT),
MCBSP_RCR2_RMK( MCBSP_RCR2_RPHASE_SINGLE,
MCBSP_RCR2_RFRLEN2_OF(0),
MCBSP_RCR2_RWDLEN2_8BIT,
MCBSP_RCR2_RCOMPAND_MSB,
MCBSP_RCR2_RFIG_YES,
MCBSP_RCR2_RDATDLY_1BIT),
MCBSP_XCR1_RMK( MCBSP_XCR1_XFRLEN1_OF(0),
MCBSP_XCR1_XWDLEN1_16BIT),
MCBSP_XCR2_RMK( MCBSP_XCR2_XPHASE_SINGLE,
MCBSP_XCR2_XFRLEN2_OF(0),
MCBSP_XCR2_XWDLEN2_8BIT,
MCBSP_XCR2_XCOMPAND_MSB,
MCBSP_XCR2_XFIG_YES,
MCBSP_XCR2_XDATDLY_1BIT),
MCBSP_SRGR1_RMK(MCBSP_SRGR1_FWID_OF(1),
MCBSP_SRGR1_CLKGDV_OF(240)), MCBSP_SRGR2_RMK(MCBSP_SRGR2_GSYNC_FREE,
MCBSP_SRGR2_CLKSP_RISING,
MCBSP_SRGR2_CLKSM_INTERNAL,
MCBSP_SRGR2_FSGM_DXR2XSR,
MCBSP_SRGR2_FPER_OF(15)), MCBSP_MCR1_DEFAULT,
MCBSP_MCR2_DEFAULT,
MCBSP_PCR_RMK( MCBSP_PCR_IDLEEN_RESET,
MCBSP_PCR_XIOEN_SP,
MCBSP_PCR_RIOEN_SP,
MCBSP_PCR_FSXM_INTERNAL,
MCBSP_PCR_FSRM_EXTERNAL,
MCBSP_PCR_CLKXM_OUTPUT,
MCBSP_PCR_CLKRM_INPUT,
MCBSP_PCR_SCLKME_NO,
MCBSP_PCR_DXSTAT_0,
MCBSP_PCR_FSXP_ACTIVELOW,
MCBSP_PCR_FSRP_ACTIVEHIGH,
MCBSP_PCR_CLKXP_RISING,
MCBSP_PCR_CLKRP_FALLING),
MCBSP_RCERA_DEFAULT,
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
};

//audio接口配置
MCBSP_Config mcbspCfg_audioData =
{
MCBSP_SPCR1_RMK(MCBSP_SPCR1_DLB_OFF, //DLB = 0,禁止自闭环方式
MCBSP_SPCR1_RJUST_LZF, //RJUST = 2左对齐低位补0
MCBSP_SPCR1_CLKSTP_DISABLE, //CLKSTP = 0 ,禁止clock stop模式
MCBSP_SPCR1_DXENA_NA,
MCBSP_SPCR1_ABIS_DISABLE,
MCBSP_SPCR1_RINTM_FRM,
MCBSP_SPCR1_RSYNCERR_NO,
MCBSP_SPCR1_RRST_DISABLE),
MCBSP_SPCR2_RMK(MCBSP_SPCR2_FREE_NO,
MCBSP_SPCR2_SOFT_NO,
MCBSP_SPCR2_FRST_RESET,
MCBSP_SPCR2_GRST_RESET,
MCBSP_SPCR2_XINTM_XRDY,
MCBSP_SPCR2_XSYNCERR_NO,
MCBSP_SPCR2_XRST_DISABLE),
MCBSP_RCR1_RMK( MCBSP_RCR1_RFRLEN1_OF(7), //RFRLEN1 = 7 ,接收帧长8个字节
MCBSP_RCR1_RWDLEN1_16BIT), //RWDLEN1 = 2 ,一个字节16bit
MCBSP_RCR2_RMK( MCBSP_RCR2_RPHASE_SINGLE, //RPHASE = 0 ,单相
MCBSP_RCR2_RFRLEN2_OF(0),
MCBSP_RCR2_RWDLEN2_8BIT,
MCBSP_RCR2_RCOMPAND_MSB,
MCBSP_RCR2_RFIG_YES,
MCBSP_RCR2_RDATDLY_0BIT), //RDATDLY = 0,接收帧0bit数据延迟
MCBSP_XCR1_RMK( MCBSP_XCR1_XFRLEN1_OF(7), //XFRLEN1 = 7,发送帧长8个字节
MCBSP_XCR1_XWDLEN1_16BIT), // XWDLEN1 = 2 ,一个字节16bit
MCBSP_XCR2_RMK( MCBSP_XCR2_XPHASE_SINGLE,
MCBSP_XCR2_XFRLEN2_OF(0),
MCBSP_XCR2_XWDLEN2_8BIT,
MCBSP_XCR2_XCOMPAND_MSB,
MCBSP_XCR2_XFIG_YES,
MCBSP_XCR2_XDATDLY_1BIT), //XDATDLY = 1 ,发送帧1bit延迟
MCBSP_SRGR1_RMK(MCBSP_SRGR1_FWID_OF(1),
MCBSP_SRGR1_CLKGDV_OF(1)), MCBSP_SRGR2_RMK(MCBSP_SRGR2_GSYNC_FREE,
MCBSP_SRGR2_CLKSP_RISING,
MCBSP_SRGR2_CLKSM_CLKS,
MCBSP_SRGR2_FSGM_DXR2XSR,
MCBSP_SRGR2_FPER_OF(15)), //MCBSP_MCR1_DEFAULT,
MCBSP_MCR1_RMK(0,0,0,0,1), //rmcm:receiver multiple channel mode
MCBSP_MCR2_DEFAULT,
MCBSP_PCR_RMK( MCBSP_PCR_IDLEEN_RESET, //IDLEEN = 0 , 当PERIPH域空闲时,MCBSP保持使能
MCBSP_PCR_XIOEN_SP, //XIOEN = 0 , CLKX,FSX,DX,CLKS脚是串口脚
MCBSP_PCR_RIOEN_SP, //RIOEN = 0 , CLKR,FSR,DR,CLKS脚是串口脚
MCBSP_PCR_FSXM_EXTERNAL, // FSXM = 0 , 发送帧同步脉冲由外部FSR脚提供
MCBSP_PCR_FSRM_EXTERNAL, // FSRM = 0 , 接收帧同步脉冲由外部FSR脚提供
MCBSP_PCR_CLKXM_INPUT,
MCBSP_PCR_CLKRM_INPUT, //CLKRM = 0 , 接收器时钟由CLKR引脚获得
MCBSP_PCR_SCLKME_NO,
MCBSP_PCR_DXSTAT_0,
MCBSP_PCR_FSXP_ACTIVEHIGH, //FSXP = 0 , 发送帧脉冲高电平使能
MCBSP_PCR_FSRP_ACTIVEHIGH, //FSRP = 0 ,接收帧脉冲高电平使能
MCBSP_PCR_CLKXP_FALLING, //发送数据被驱动在CLKX的下降沿
//MCBSP_PCR_CLKRP_FALLING),
MCBSP_PCR_CLKRP_RISING), //MCBSP rising edge matched for AD
// MCBSP_RCERA_DEFAULT,
MCBSP_RCERA_RMK(0x00ff), //receiver TDM enable total 8 channels
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
};

程序在运行阶段时

1. 先往spi写命令初始化wm8768

hMcbsp_daControl = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
MCBSP_config(hMcbsp_daControl, &mcbspCfg_daControl_16);

MCBSP_start(hMcbsp_daControl,
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
0x0300);

MCBSP_start(hMcbsp_daControl,
MCBSP_RCV_START | MCBSP_XMIT_START,
0);

// Wait for MCBSP ready to transmit
while (!MCBSP_xrdy(hMcbsp_daControl)) {}

MCBSP_write16(hMcbsp_daControl, cmd);
SPIEnd_Delay();

MCBSP_close(hMcbsp_daControl);

2. 然后再重新初始化mcbsp1

hMcbsp_audioData = MCBSP_open(MCBSP_PORT2, MCBSP_OPEN_RESET);
MCBSP_config(hMcbsp_audioData, &mcbspCfg_audioData);

MCBSP_start(hMcbsp_audioData,
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
0x0300);

MCBSP_start(hMcbsp_audioData,
MCBSP_RCV_START | MCBSP_XMIT_START,
0);

结果MCBSP1就收不到数据,为什么呢?

奇怪的时,程序初始化时先写spi再配置dsp模式,mcbsp1就可以收到数据。在程序运行中,要改往wm8768写个spi命令时,先stopmcbsp,再写spi(此时写wm8768写成功),再配置mcbsp1为接收,就收不到数据了

Shine:

请问具体用的是哪款器件?

第二步重新初始化mcbsp后,如果mcbsp做主,要在收数据之前先做一次dummy写(往DXR寄存器里随便写个数)

chunying wu:

回复 Shine:

用的是5507。如果mcbsp做主,要在收数据之前先做一次dummy写(往DXR寄存器里随便写个数),为什么要这样做。mcbsp1用来收数据,应该是从吧,发数据才是主,是这样吗

chunying wu:

回复 Shine:

我用的是dma来接收

chunying wu:

回复 chunying wu:

我用的是dma来接收mcbsp1的数据

Shine:

回复 chunying wu:

做主的时候,空写一次是为了产生时钟和帧同步信号。

主和从的概念不是以收发为标准,而是看clock是由谁提供的。谁提供clock就是做主,不管是收数据还是发数据。

chunying wu:

回复 Shine:

MCBSP_PCR_CLKXM_INPUT,MCBSP_PCR_CLKRM_INPUT, //CLKRM = 0 , 接收器时钟由CLKR引脚获得

我的配置是从,不是主

mcbsp1接受采用dma方式

Shine:

回复 chunying wu:

收数据做从的话,看一下ak5702是否提供了时钟和同步信号以及数据,可以量一下mcbsp1的时序是否正确。

chunying wu:

回复 Shine:

hMcbsp_audioData = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET); MCBSP_config(hMcbsp_audioData, &mcbspCfg_audioData);

MCBSP_start(hMcbsp_audioData, MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 0x0300);

MCBSP_start(hMcbsp_audioData, MCBSP_RCV_START | MCBSP_XMIT_START, 0);

时序正确,以上代码初始化不成功,为什么这样呢。有没有其它代码可以代替以上操作,直接写寄存器应该怎么写

Shine:

回复 chunying wu:

初始化是就寄存器没配进去吗?

可以直接写寄存器,格式如下:

#define I2CMDR          (*(volatile ioport unsigned short*)0x3c09)I2CMDR &=0xffdf;         

chunying wu:

回复 Shine:

是的。不知道为什么这样。重启有时可以,重启有时又不可以

赞(0)
未经允许不得转载:TI中文支持网 » MCBSP1的接收采用DSP模式,发送采用SPI模式,使用完spi模式后,用不了dsp模式
分享到: 更多 (0)