你好!我需要用TMS320C6701的MCBSP作为SPI接口和W5500进行通信,参考官网文档spra478c,对MCBSP进行了初始化,寄存器配置程序如下:
MCBSP_Config mcbspCfg0 = {
MCBSP_SPCR_RMK(
MCBSP_SPCR_FRST_DEFAULT,
MCBSP_SPCR_GRST_DEFAULT,
MCBSP_SPCR_XINTM_DEFAULT,
MCBSP_SPCR_XSYNCERR_DEFAULT,
MCBSP_SPCR_XRST_DEFAULT,
MCBSP_SPCR_DLB_DEFAULT,
MCBSP_SPCR_RJUST_DEFAULT,
MCBSP_SPCR_CLKSTP_DELAY, /* CLKSTP=11b with CLKXP=0, clock
starts with */
MCBSP_SPCR_RINTM_RRDY, /* rising edge with delay*/
MCBSP_SPCR_RSYNCERR_DEFAULT,
MCBSP_SPCR_RRST_DEFAULT
),
MCBSP_RCR_RMK(
MCBSP_RCR_RPHASE_SINGLE,
MCBSP_RCR_RFRLEN2_DEFAULT,
MCBSP_RCR_RWDLEN2_DEFAULT,
MCBSP_RCR_RCOMPAND_DEFAULT,
MCBSP_RCR_RFIG_NO,
MCBSP_RCR_RDATDLY_1BIT,
MCBSP_RCR_RFRLEN1_DEFAULT, //每帧最多128个字节
MCBSP_RCR_RWDLEN1_32BIT /* receive element length phase 1 is 32 bits */
),
MCBSP_XCR_RMK(
MCBSP_XCR_XPHASE_DEFAULT,
MCBSP_XCR_XFRLEN2_DEFAULT,
MCBSP_XCR_XWDLEN2_DEFAULT,
MCBSP_XCR_XCOMPAND_DEFAULT,
MCBSP_XCR_XFIG_DEFAULT,
MCBSP_XCR_XDATDLY_1BIT, /* 1 bit data delay */
MCBSP_XCR_XFRLEN1_DEFAULT, //每帧最多128个字节
MCBSP_XCR_XWDLEN1_32BIT /* transmit element phase 1 is 32 bits */
),
MCBSP_SRGR_RMK(
MCBSP_SRGR_GSYNC_FREE,
MCBSP_SRGR_CLKSP_RISING,
MCBSP_SRGR_CLKSM_INTERNAL, /* SRGR clock mode from internal source */
MCBSP_SRGR_FSGM_DEFAULT,
MCBSP_SRGR_FPER_DEFAULT,
MCBSP_SRGR_FWID_DEFAULT,
MCBSP_SRGR_CLKGDV_OF(0x5F) /* divide clock by factor of 95 */
),
MCBSP_MCR_DEFAULT,
MCBSP_RCER_DEFAULT,
MCBSP_XCER_DEFAULT,
MCBSP_PCR_RMK(
MCBSP_PCR_XIOEN_SP,
MCBSP_PCR_RIOEN_SP,
MCBSP_PCR_FSXM_INTERNAL, /* frame sync generation */
MCBSP_PCR_FSRM_EXTERNAL,
MCBSP_PCR_CLKXM_OUTPUT, /* tans. clock mode from internal SRGR*/
MCBSP_PCR_CLKRM_INPUT,
MCBSP_PCR_CLKSSTAT_0,
MCBSP_PCR_DXSTAT_0,
MCBSP_PCR_FSXP_ACTIVELOW, /* active low trans. frame sync. polarity */
MCBSP_PCR_FSRP_ACTIVEHIGH,
MCBSP_PCR_CLKXP_RISING, /* trans. clk pol. from rising edge of CLKX */
MCBSP_PCR_CLKRP_FALLING
)
SPI收发函数是这样写的:
unsigned int IINCHIP_SpiSendData(unsigned int byte)
{
unsigned int SPIRXD;
while(MCBSP_xrdy(hMcbsp0) == 0);
MCBSP_write(hMcbsp0,byte);
while(MCBSP_rrdy(hMcbsp0) == 0);{} //Wait until data is received
SPIRXD = MCBSP_read(hMcbsp0);
return SPIRXD;
}
在主程序中调用一次收发函数,发送一个32位的数据0x12345678,逻辑分析仪测出的波形如下图,没有问题:
然后把XCR和RCR寄存器中的MCBSP_XCR_XFRLEN1_DEFAULT参数由0改为2后(即每帧包括3个32位的数据),主函数中调用3次收发函数,分别发送数据0x12345678、0x87654321、0x12345678,逻辑分析仪测出的波形如下图,最终多出来6个时钟,去掉它们后其余的数据是对的。
所以,想请你们看下这个多出来的时钟和数据是哪里的问题?是收发不对?还是哪里没配置对?谢谢!
user5846346:
能看到图吗?我再发一遍
Tony Tang:
回复 user5846346:
不能理解为什么现在还用C6701。如果是因为老产品沿用,就不应该有新问题,如果是新设计,有许多新替代型号可以选择。
user5846346:
回复 Tony Tang:
是在老产品上加新功能,实际情况比较复杂,不是我们能决定的,没办法。上面的问题有建议的解决方法吗?谢谢