This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320VC5509A的MCBSP配置为主SPI模式,无法接收数据

Other Parts Discussed in Thread: TMS320VC5509A, ADS1298R, TMS320F28335

请教:TMS320VC5509A的MCBSP配置为主SPI模式,CLKSTP已经配置为10,能正确发送数据,接收数据时CLKX端口不产生时钟, 但从设备必须有时钟才能发送数据给5509,是怎么回事

  • 你好,

    在SPI slave receive模式下, 往DXR寄存器里随便写个数(Dummy data), 这样会产生CLKX和FSX信号来接收数据.

  • 谢谢,但是我接收到的数据是两次接收之前的数据,我想每写一次,能读到实时收到的数据,有什么办法呢

  • 你接的什么slave device, 为什么会接收的是两次接收之前的数据?

  • 接的是ADS1298R,之前用的自闭环方式来测试,命令while (!MCBSP_xrdy(hMcbsp));MCBSP_write16(hMcbsp,testda)用来发送数据,接下来用rcv = MCBSP_read16(hMcbsp);来接收数据,testda循环加1然后接收,发现收到的是三次前数据

  • 参考一下CSL中的McBSP DLB例程吧
    http://www.ti.com/tool/sprc133

  • 是按照例程做的,另外我把C:\c55xx_csl_3.00\ccs_v3.3_examples\gpio\example1拷贝到CCS3.3中运行,编译发现很多头文件找不到,复制其中的头文件到CCS3.3中后编译也出现莫名其秒错误,是什么原因呀

  • 看一下Build Option->Compiler->Preprocessor->Include Search Path (-i)中指定的头文件目录是否正确.

  • 请问,MCBSP设置为主SPI,发送一帧数据的时候,比如设置为8BIT数据,每帧三个数据的话,第一个数据是8位,后面两个数据都成10位了呢,后面的都会多二位,是什么原因啊

  • 你是抓时序看到后面两个数据发送成了10位? 多出来的两位数据是随机的还是跟前一个数据有关系?

  • 是用示波器看到的,不是随机的,我连续发送同一个8位数据的话,后面的10位的前两位也是8位的前两位,

  • XDATDLY, RDATDLY是否配成了01?

  • 都是配成的01

    MCBSP_SPCR1_RMK(
    MCBSP_SPCR1_DLB_OFF, /* DLB = 0,禁止自闭环方式 */
    //MCBSP_SPCR1_DLB_ON,
    MCBSP_SPCR1_RJUST_LZF, /* RJUST = 2 */
    //3,
    //MCBSP_SPCR1_CLKSTP_DISABLE, /* CLKSTP = 0 */
    2,
    MCBSP_SPCR1_DXENA_ON, /* DXENA = 1 */
    0, /* ABIS = 0 */
    MCBSP_SPCR1_RINTM_RRDY, /* RINTM = 0 */
    0, /* RSYNCER = 0 */
    MCBSP_SPCR1_RRST_DISABLE /* RRST = 0 */
    ),
    MCBSP_SPCR2_RMK(
    MCBSP_SPCR2_FREE_NO, /* FREE = 0 */
    MCBSP_SPCR2_SOFT_NO, /* SOFT = 0 */
    MCBSP_SPCR2_FRST_FSG, /* FRST = 0 */
    MCBSP_SPCR2_GRST_CLKG, /* GRST = 0 */
    //1,
    MCBSP_SPCR2_XINTM_XRDY, /* XINTM = 0 */
    0, /* XSYNCER = N/A */
    MCBSP_SPCR2_XRST_DISABLE /* XRST = 0 */
    ),
    /*单数据相,接受数据长度为16位,每相2个数据*/
    MCBSP_RCR1_RMK(
    //MCBSP_RCR1_RFRLEN1_OF(1), /* RFRLEN1 = 1 */
    2,
    MCBSP_RCR1_RWDLEN1_8BIT /* RWDLEN1 = 2 */
    ),
    MCBSP_RCR2_RMK(
    MCBSP_RCR2_RPHASE_SINGLE, /* RPHASE = 0 */
    MCBSP_RCR2_RFRLEN2_OF(0), /* RFRLEN2 = 0 */
    MCBSP_RCR2_RWDLEN2_8BIT, /* RWDLEN2 = 0 */
    MCBSP_RCR2_RCOMPAND_MSB, /* RCOMPAND = 0 */
    MCBSP_RCR2_RFIG_YES, /* RFIG = 0 */
    MCBSP_RCR2_RDATDLY_1BIT /* RDATDLY = 1 */
    ),
    MCBSP_XCR1_RMK(
    //MCBSP_XCR1_XFRLEN1_OF(1), /* XFRLEN1 = 1 */
    2,
    MCBSP_XCR1_XWDLEN1_8BIT /* XWDLEN1 = 2 */

    ),
    MCBSP_XCR2_RMK(
    MCBSP_XCR2_XPHASE_SINGLE, /* XPHASE = 0 */
    MCBSP_XCR2_XFRLEN2_OF(0), /* XFRLEN2 = 0 */
    MCBSP_XCR2_XWDLEN2_8BIT, /* XWDLEN2 = 0 */
    MCBSP_XCR2_XCOMPAND_MSB, /* XCOMPAND = 0 */
    MCBSP_XCR2_XFIG_YES, /* XFIG = 0 */
    MCBSP_XCR2_XDATDLY_1BIT /* XDATDLY = 1 */
    ),
    //MCBSP_SRGR1_DEFAULT,
    MCBSP_SRGR1_RMK(
    0,
    50
    ),
    MCBSP_SRGR2_DEFAULT,
    MCBSP_MCR1_DEFAULT,
    MCBSP_MCR2_DEFAULT,
    MCBSP_PCR_RMK(
    MCBSP_PCR_IDLEEN_RESET, /* IDLEEN = 0 */
    //MCBSP_PCR_XIOEN_GPIO, /* XIOEN = 1 */
    0,
    //MCBSP_PCR_RIOEN_GPIO, /* RIOEN = 1 */
    0,
    //MCBSP_PCR_FSXM_EXTERNAL, /* FSXM = 0 */
    1,
    //MCBSP_PCR_FSRM_EXTERNAL, /* FSRM = 0 */
    1,
    //MCBSP_PCR_CLKXM_INPUT, /* CLKXM = 0 */
    1,
    //MCBSP_PCR_CLKRM_INPUT, /* CLKRM = 0 */
    1,
    MCBSP_PCR_SCLKME_NO, /* SCLKME = 0 */
    MCBSP_PCR_DXSTAT_1, /* DXSTAT = 1 */
    //MCBSP_PCR_FSXP_ACTIVEHIGH, /* FSXP = 0 */
    1,
    MCBSP_PCR_FSRP_ACTIVEHIGH, /* FSRP = 1 */
    //MCBSP_PCR_CLKXP_FALLING, /* CLKXP = 1 */
    0,
    MCBSP_PCR_CLKRP_RISING /* CLKRP = 1 */
    ),
    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
    };

    上面是我的配置,是例子改的

  • RFRLEN1, XFRLEN1的配置有问题,  在SPI模式下, 只能配成0, 见下面的文档第93页Table 6−1. Bits Used to Enable and Configure the Clock Stop Mode描述.
    http://www.ti.com/lit/ug/spru592e/spru592e.pdf

  • 哦,谢谢,就是一帧只能收发一个数据

  • 是的, SPI模式下只能收发一个数据, 你改一下帧长试试.

  • 您好,你的意思是串行时钟和使能信号都是由DXR寄存器中是否有数据来触发吗,只有SPI master才能触发这两个信号

  • 是的,在SPI协议中,clock是由master提供。

  • 是,SPI协议中时钟由master提供这我知道,我的疑问是McBSP配置成SPI master 或者本身就是SPI master,SPI master发给slaxe的使能信号和串行时钟由什么触发的,谢谢!

  • 由对DXR dummy write(随便写个数)触发。

    另外,有问题的话,麻烦另起新帖,这样也方便其他客户参考,谢谢。

  •  
    我要操作M95640(EERROM掉电保持存储器),其读状态寄存器的时序要求如下图所示:
    如果将MCBSP配置在时钟停止模式下时,按照手册上所说的1次只能传送1个WORD,
    那要怎么才能满足M95640的时序要求呢?
    我现在遇到的问题是发送1个WORD之后,从机使能信号就会被置成高电平,
    没法让其在3个WORD传送过程中,从机使能信号一直保持低电平?
    目前配置的是1帧传送1个WORD,WORD长度配置的是8Bit。如果我改成1帧传送3个WORD,
    则从机使能信号能在此其间一直保持低电平,但是时钟输出的个数就又不对了
    (理论上是24个时钟脉冲,而实际上要多几个,不知道为什么?)。
    以前直接用的TMS320F28335的SPI接口则可以满足其时序的要求。
    现在因为其SPI接口改成用来操作W5200以太网口芯片了。
    所以EEPROM掉电保持存储器就想用MCBSP接口配置成SPI时钟停止模式来操作。