28335中使用Mcbsp模拟SPI slave,使用自带的SPI做master,不论发送还是读取数据都会出错,而反过来,使用Mcbsp模拟SPI master,SPI使用slave模式时,是正常工作了;后有使用GPIO口模拟SPI给Mcbsp发数据,在时钟周期为20us时可正常工作,但是提高时钟周期后则又出现相似错误。
请问,在使用Mcbsp模拟SPI Slave模式时,有哪些方面的限制,比如时钟周期之类,或者是我设置的有不对的地方,下方附Mcbsp B配置成SPIslave模式的程序。
void InitMcbspb(void)
{
// McBSP-B register settings,Configuring McBSP-B for SPI slave
McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitter
McbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word
McbspbRegs.SPCR1.bit.CLKSTP = 2 ; // 时钟停止模式,有时钟延迟
McbspbRegs.PCR.bit.CLKXP = 0; // 上升沿发送 McbspbRegs.PCR.bit.CLKRP = 0; // 下升沿接收
McbspbRegs.PCR.bit.CLKXM = 0; // 主设备,给外界提供时钟
McbspbRegs.PCR.bit.CLKRM = 0; //same
McbspbRegs.PCR.bit.SCLKME = 0;
McbspbRegs.SRGR2.bit.CLKSM = 1; // CPU内部时钟提供CLK
McbspbRegs.SRGR1.bit.CLKGDV = 49; // 150/4/50 = 750KHz = CLKG
McbspbRegs.PCR.bit.FSXM = 0; // 帧同步信号由采样频率发生器驱动
McbspbRegs.SRGR2.bit.FSGM = 0; // 数据从DXR1到XSR1时,在FSX脚上产生一个同步脉冲
McbspbRegs.PCR.bit.FSXP = 1; // FSX低电平有效
McbspbRegs.RCR2.bit.RDATDLY = 0; // 数据延迟必须为0,配合SPI
McbspbRegs.XCR2.bit.XDATDLY = 0; // same
McbspbRegs.SPCR1.bit.RJUST = 01; // 右对齐,高位符号扩展
McbspbRegs.XCR1.bit.XFRLEN1 = 0; // 每帧一个数据字
McbspbRegs.XCR1.bit.XWDLEN1 = 2; // 每个数据字16位
McbspbRegs.RCR1.bit.RFRLEN1 = 0;
McbspbRegs.RCR1.bit.RWDLEN1 = 2; // 接收每个数据字16位
McbspbRegs.SPCR2.bit.GRST = 1; // 采样频率发生器启动
delay_loop1();
McbspbRegs.SPCR2.bit.XRST=1; // Enable Transmitter
McbspbRegs.SPCR1.bit.RRST=1; // Enable Receiver
McbspbRegs.SPCR2.bit.FRST=1; // 启动帧同步发生器
delay_loop1();
}
Tony Chopper:
我怎么感觉这个配置是对的
28335中使用Mcbsp模拟SPI slave,使用自带的SPI做master,不论发送还是读取数据都会出错,而反过来,使用Mcbsp模拟SPI master,SPI使用slave模式时,是正常工作了;后有使用GPIO口模拟SPI给Mcbsp发数据,在时钟周期为20us时可正常工作,但是提高时钟周期后则又出现相似错误。
请问,在使用Mcbsp模拟SPI Slave模式时,有哪些方面的限制,比如时钟周期之类,或者是我设置的有不对的地方,下方附Mcbsp B配置成SPIslave模式的程序。
void InitMcbspb(void)
{
// McBSP-B register settings,Configuring McBSP-B for SPI slave
McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitter
McbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word
McbspbRegs.SPCR1.bit.CLKSTP = 2 ; // 时钟停止模式,有时钟延迟
McbspbRegs.PCR.bit.CLKXP = 0; // 上升沿发送 McbspbRegs.PCR.bit.CLKRP = 0; // 下升沿接收
McbspbRegs.PCR.bit.CLKXM = 0; // 主设备,给外界提供时钟
McbspbRegs.PCR.bit.CLKRM = 0; //same
McbspbRegs.PCR.bit.SCLKME = 0;
McbspbRegs.SRGR2.bit.CLKSM = 1; // CPU内部时钟提供CLK
McbspbRegs.SRGR1.bit.CLKGDV = 49; // 150/4/50 = 750KHz = CLKG
McbspbRegs.PCR.bit.FSXM = 0; // 帧同步信号由采样频率发生器驱动
McbspbRegs.SRGR2.bit.FSGM = 0; // 数据从DXR1到XSR1时,在FSX脚上产生一个同步脉冲
McbspbRegs.PCR.bit.FSXP = 1; // FSX低电平有效
McbspbRegs.RCR2.bit.RDATDLY = 0; // 数据延迟必须为0,配合SPI
McbspbRegs.XCR2.bit.XDATDLY = 0; // same
McbspbRegs.SPCR1.bit.RJUST = 01; // 右对齐,高位符号扩展
McbspbRegs.XCR1.bit.XFRLEN1 = 0; // 每帧一个数据字
McbspbRegs.XCR1.bit.XWDLEN1 = 2; // 每个数据字16位
McbspbRegs.RCR1.bit.RFRLEN1 = 0;
McbspbRegs.RCR1.bit.RWDLEN1 = 2; // 接收每个数据字16位
McbspbRegs.SPCR2.bit.GRST = 1; // 采样频率发生器启动
delay_loop1();
McbspbRegs.SPCR2.bit.XRST=1; // Enable Transmitter
McbspbRegs.SPCR1.bit.RRST=1; // Enable Receiver
McbspbRegs.SPCR2.bit.FRST=1; // 启动帧同步发生器
delay_loop1();
}
linfeng duan:
回复 Tony Chopper:
您好,我问一下,这个F28335的配置寄存器 在哪个文档里面有呀?我都不知道怎么去配置,玛法您发我一份好不?353092242@qq.com