void McBSP_Init(void)
{
// McBSP-A register settings
McbspaRegs.SPCR2.all=0x0000; // 关闭采样率发生器,发送器,发送中断,清空相关标志位
McbspaRegs.SPCR1.all=0x0000; // 关闭时钟停止模式,数字回环模式,接收中断,接收器,清空相关标志位
McbspaRegs.PCR.all=0x0F08; // 0000111100001110,FSXM=FSRM=1,表明帧同步信号由采样率发生器生成
// CLKXM=CLKRM=1,在处于时钟停止模式下,将McBSP配置为SPI主机,时钟由采样率发生器提供
// SCLKME=0,时钟由DSP内部低速时钟(LSPCLK:37.5MHz)提供,根据具体分频系数决定时钟频率
// FSXP=1,帧同步脉冲低电平有效
McbspaRegs.SPCR1.bit.DLB = 1;
McbspaRegs.SPCR1.bit.CLKSTP = 2; // 时钟停止模式,无时钟延迟
McbspaRegs.PCR.bit.CLKXP = 1; // CLKXP=1,CLKRP=0,对应SPI的模式CPOL = 1,CPHA = 1
McbspaRegs.PCR.bit.CLKRP = 0;
McbspaRegs.RCR2.bit.RDATDLY=01; // 接收数据延迟,在SPI主模式下需要设置为1
McbspaRegs.XCR2.bit.XDATDLY=01; // 发送数据延迟,在SPI主模式下需要设置为1
McbspaRegs.RCR1.bit.RWDLEN1=2; // 16-bit word
McbspaRegs.XCR1.bit.XWDLEN1=2; // 16-bit word
McbspaRegs.SRGR2.all=0x2000; // 0010000000000000,GSYNC=0,CLKSM=1, FPER=0,FSGM=0,配置帧同步信号的周期和触发方式
McbspaRegs.SRGR1.all= 0x0003; // 0000000000000011,帧同步脉冲信号的宽度为1个周期,CLKG的频率为LSPCLK/4=9.375MHz
Delay_loop();
McbspaRegs.SPCR2.bit.GRST=1; // 使能采样率发生器
Clkg_delay_loop(); // 等待至少两个时钟周期
McbspaRegs.SPCR2.bit.XRST=1; // 启用发送器
McbspaRegs.SPCR1.bit.RRST=1; // 启动接收器
McbspaRegs.SPCR2.bit.FRST=1; // 启用帧同步逻辑
}
请教一下这个把McBSP配置为SPI的代码有没有问题,我用逻辑分析仪看接口的输出一直为高电平没有变化,以下还有一部分主函数代码:
void main()
{
//程序固化到flash所需要的函数
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
InitSysCtrl();
InitMcbspGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
McBSP_Init();
sdata1 = 0x55aa;
// Main loop to transfer 16-bit words through MCBSP in SPI mode periodically
while(1)
{
McbspaRegs.DXR1.all = sdata1;
while(McbspaRegs.SPCR1.bit.RRDY == 0 ) {} // Master waits until RX data is ready
rdata1 = McbspaRegs.DRR1.all; // Then read DRR1 to complete receiving of data
if(rdata1 != sdata1) error( ); // Check that correct data is received.
Delay_loop();
sdata1^=0xFFFF;
__asm(" nop"); // Good place for a breakpoint
}
}
建议不要完全自己写,应该先参考一些现成的例子。
TMS320F28335的开发资源很多,比如C2000WARE等,都在下面链接:
https://www.ti.com/product/TMS320F28335#software-development
大体看下来,数据延迟设置XDATDLY和RDATDLY似乎有些问题,在SPI主模式下可能需要设置为0。
其他的请自己结合上面的资源再检查一下。