我使用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);
}
}
期待工程师们的回复!