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: 传输格式每帧4字每字8位时,使用MCBSP_write32()命令后示波器在DX0引脚上无法检测到电平变化

Part Number: TMS320VC5509A


我使用TMS320VC5509A的Mcbsp模块配置为SPI进行数据传输。

当传输数据格式为每帧1字每字32位时,DSP的DX0引脚上能检测到正确的输出(0x00FF0000),但每帧4字每字8位却不能:

每帧1字每字32位:

每帧4字每字8位:

同时,比较疑惑的是,每帧4字每字8位进行传输时,CLKX0输出的信号有些字是8位有些字是10位:

我的代码很简单,初始化Mcbsp后就是一个输出语句:

MCBSP_Config Mcbsptest;

/*McBSP set,we use mcbsp0 to send and recieve the data between DSP and 74HC595*/
MCBSP_Config SPI_MASTER = {
		MCBSP_SPCR1_RMK(
				MCBSP_SPCR1_DLB_OFF,					/* DLB    = 0,禁止自闭环方式 */
				MCBSP_SPCR1_RJUST_LZF,					/* RJUST  = 2,左检验,低位填0*/
				MCBSP_SPCR1_CLKSTP_NODELAY,  	 			/*CLKSTP  = 11b,时停模式有延迟*/
				MCBSP_SPCR1_DXENA_NA,	    			/* DXENA  = 1,不允许DX数据延迟 */
				0,	                        			/* ABIS   = 0 */
				MCBSP_SPCR1_RINTM_RRDY,	    			/* RINTM  = 0 ,RRDY bit从0到1产生接收中断*/
				0,	                        			/* RSYNCER = 0,无同步错误*/
				MCBSP_SPCR1_RRST_DISABLE				/* RRST   = 0,串口复位 */
		),
		MCBSP_SPCR2_RMK(
				MCBSP_SPCR2_FREE_NO,               		/* FREE   = 0,时钟受SOFYT bit控制 */
				MCBSP_SPCR2_SOFT_NO,                   	/* SOFT   = 0,调试出现断点时时钟立即停止 */
				//MCBSP_SPCR2_FRST_RESET,  				//帧同步关闭
				MCBSP_SPCR2_FRST_FSG,                	/* FRST   = 0 */
				//MCBSP_SPCR2_GRST_RESET,                 /* GRST   = 0,采样率发生器复位,CLKG频率为CPU时钟周期的一半 */
				MCBSP_SPCR2_GRST_CLKG,
				MCBSP_SPCR2_XINTM_XRDY,                	/* XINTM  = 0,XRDY bit从0到1产生发送中断 */
				0,                                  	/* XSYNCER = N/A,无同步错误 */
				MCBSP_SPCR2_XRST_DISABLE               	/* XRST   = 0,发送串口复位 */
		),
		/*单数据相,接受数据长度为16位,每相2个数据*/
		MCBSP_RCR1_RMK(
				MCBSP_RCR1_RFRLEN1_OF(3),              	/* RFRLEN1 = 0,接收帧每帧4字 */
				MCBSP_RCR1_RWDLEN1_8BIT               	/* RWDLEN1 = 5,每字8位 */
		),
		MCBSP_RCR2_RMK(
				MCBSP_RCR2_RPHASE_SINGLE,              	/* RPHASE  = 0,单段帧 */
				MCBSP_RCR2_RFRLEN2_OF(0),              	/* RFRLEN2 = 0,该帧无字 */
				MCBSP_RCR2_RWDLEN2_8BIT,               	/* RWDLEN2 = 0,每字8bit */
				MCBSP_RCR2_RCOMPAND_MSB,               	/* RCOMPAND = 0,无压缩,先传输高位数据 */
				MCBSP_RCR2_RFIG_YES,                   	/* RFIG    = 0,每个帧同步信号启动一次数据接收 */
				MCBSP_RCR2_RDATDLY_1BIT                	/* RDATDLY = 1,1bit数据延迟 */
		),
		MCBSP_XCR1_RMK(
				MCBSP_XCR1_XFRLEN1_OF(3),              /* 发送帧每帧4字 */
				MCBSP_XCR1_XWDLEN1_8BIT               /* 每字8位 */

		),
		MCBSP_XCR2_RMK(
				MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0,单段帧 */
				MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2 = 0,该帧无字 */
				MCBSP_XCR2_XWDLEN2_32BIT,              /* XWDLEN2 = 5,每字32bit */
				MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0,无压缩,先传输高位数据 */
				MCBSP_XCR2_XFIG_YES,                   /* XFIG    = 0,每个帧同步信号启动一次数据发送 */
				MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY = 1,1bit数据延迟 */
		),
		MCBSP_SRGR1_RMK(
				MCBSP_SRGR1_FWID_OF(1),                /* 停止模式无效**重要FWID    = 0 帧同步信号的脉宽周期数*/
				MCBSP_SRGR1_CLKGDV_OF(33)               /* 停止模式无效**重要CLKGDV  =9 CLKG时钟频率*/
		),
		MCBSP_SRGR2_RMK(
				0,//MCBSP_SRGR2_GSYNC_FREE,                	/* FREE    = 0 内部时钟帧同步 (每FPER+1个CLKG周期产生FSG脉冲时钟同步)*/
				MCBSP_SRGR2_CLKSP_RISING,              		/* 重要CLKSP   = 0 CLKS 引脚极性,CLKS上升沿产生CLKG和FSG*/
				MCBSP_SRGR2_CLKSM_INTERNAL,            		/* 重要CLKSM   = 1 cpu时钟(叠加93行SCLKME=0)*/
				MCBSP_SRGR2_FSGM_DXR2XSR,              		/* FSGM    = 0 发送帧同步模式,如果FXSM=1,当DXR->XSR时,McBSP产生帧同步信号*/
				MCBSP_SRGR2_FPER_OF(32)    					/*重要 FPER    = 0 FSG信号帧同步时钟周期数,应该是7*(每个FSG周期为FPER+1个CLKG时钟周期)*/
		),
		MCBSP_MCR1_DEFAULT,
		MCBSP_MCR2_DEFAULT,
		MCBSP_PCR_RMK(
				MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0,当PERIPH域idle时MCBSP保持有效   */
				MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0,CLKX,FSX,DX,CLKS用作串口引脚   */
				MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0,CLKX,FSX,DX,CLKS用作串口引脚   */
				MCBSP_PCR_FSXM_INTERNAL,                /* FSXM     = 1,发送帧同步信号由MCBSP提供,当DXR复制到XSR,MCBSP产生一个发送帧同步脉冲   */
				MCBSP_PCR_FSRM_INTERNAL,                /* FSRM     = 1,接收帧同步信号由MCBSP提供   */
				MCBSP_PCR_CLKXM_OUTPUT,                  /* CLKXM    = 1,MCBSP作为SPI主设备   */
				MCBSP_PCR_CLKRM_INPUT,                  /* CLKRM    = 0,外部通过CLKR引脚提供接收时钟(叠加27行DLB=0)   */
				MCBSP_PCR_SCLKME_NO,					/*SCLKME	=0,CPU时钟(叠加79行CLKSM=1)	*/
				//MCBSP_PCR_CLKSSTAT_0,
				MCBSP_PCR_DXSTAT_0,                      /* DXSTAT	 = 0,DX引脚设为低电平   */
				//MCBSP_PCR_DRSTAT_0,						/*DRSTAT	=0,DR引脚设为低电平	*/
				MCBSP_PCR_FSXP_ACTIVELOW,              /* FSXP     = 1,发送帧同步信号低有效  */
				MCBSP_PCR_FSRP_ACTIVELOW,              /* FSRP     = 1,接收帧同步信号低有效   */
				MCBSP_PCR_CLKXP_RISING,                /* CLKXP    = 0,CLKX上升沿发送数据   */
				MCBSP_PCR_CLKRP_RISING                  /* CLKRP    = 1,CLKR上升沿接收数据(CLKR输出数据信号时内部CLKR经过转换后送到CLKR引脚)   */
				/*低电平无效,有延迟,MCBSP在CLKX上升沿之前半个周期发送数据,在CLKR上升沿接收数据*/
		),
		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
};



/*定义McBSP的句柄*/
MCBSP_Handle hMcbsp1,hMcbsp2;

Uint16 i,temp;

void delay(Uint32 k)
{
	while(k--);
}


void delay_ms(uint32_t time)
{
	uint32_t i=0;
	while(time--)
	{
		i=12000;
		while(i--) ;
	}
}





void main(void)
{
	Uint32 tmp;
	int i;
	uint32_t data;
	/* Initialize CSL library - This is REQUIRED !!! */
	/*初始化CSL库*/
	CSL_init();

	PLL_config(&myConfig);

	/*初始化McBSP0*/
	tmp=0;

	hMcbsp1 = MCBSP_open(MCBSP_PORT0,MCBSP_OPEN_RESET);
	MCBSP_config(hMcbsp1,&SPI_MASTER);
	MCBSP_write32(hMcbsp1,tmp);
	MCBSP_start(hMcbsp1,MCBSP_SRGR_START | MCBSP_XMIT_START | MCBSP_RCV_START,0x0110);



	while(1)
	{
		while(!MCBSP_xrdy(hMcbsp1));
		MCBSP_write32(hMcbsp1,0x00FF0000);
	}




}

期待工程师们的回复!