stm32f7开发板作从机发现通信异常,排查以后发现发送接收的数据全是按一个时钟周期两位来收发的,这是什么问题啊?尝试过更换spi通道、AF组和不同的引脚,都是一样的结果。
主要配置代码如下:
void SPI2_Init(void)
{
u16 tempreg=0;
RCC->AHB1ENR|=1<<8; //使能PORTB时钟
RCC->APB1ENR|=1<<14; //SPI2时钟使能
GPIO_Set(GPIOI,1<<0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_2M,GPIO_PUPD_PU); //PI0~4复用功能输出
GPIO_Set(GPIOI,1<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_2M,GPIO_PUPD_NONE);
GPIO_Set(GPIOI,1<<2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_2M,GPIO_PUPD_NONE);
GPIO_Set(GPIOI,1<<3,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_2M,GPIO_PUPD_PU);GPIO_AF_Set(GPIOI,0,5);//PI0,AF5(NSS)
GPIO_AF_Set(GPIOI,1,5);//PI1,AF5(SCK)
GPIO_AF_Set(GPIOI,2,5);//PI2,AF5(MISO)
GPIO_AF_Set(GPIOI,3,5);//PI3,AF5(MOSI)//这里只针对SPI口初始化
RCC->APB1RSTR|=1<<14; //复位SPI2
RCC->APB1RSTR&=~(1<<14);//停止复位SPI2
SPI2->CR2=7<<8; //8位数据格式
SPI2->CR2|=0<<4; //摩托罗拉模式
// SPI2->CR2|=1<<0; //使能接收DMA传输
SPI2->CR2|=1<<12; //FIFO占用超1字节,即产生RXNE事件(必须正确设置)
tempreg|=0<<10; //全双工模式
tempreg|=0<<9; //硬件nss管理
tempreg|=0<<2; //SPI从机
tempreg|=0<<1; //空闲模式下SCK为0 CPOL=0
tempreg|=1<<0; //数据采样从第2个时间边沿开始,CPHA=1
tempreg|=0<<7; //MSB First
tempreg|=1<<6; //SPI使能
SPI2->CR1=tempreg; //设置CR1
SPI2->I2SCFGR&=~(1<<11);//选择SPI模式
}//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
vu32 *data_reg=&SPI2->DR; //存在FIFO,必须以传输长度访问
while((SPI2->SR&1<<1)==0); //等待发送区空
*(vu8 *)data_reg=TxData; //发送一个byte
while((SPI2->SR&1<<0)==0); //等待接收完一个byte
return *(vu8 *)data_reg; //返回收到的数据
}
附示波器照片如下,黄色是时钟,蓝色是开发板发送的数据(0X8104),红色是主机发送的数据。

|
可以尝试调整从机的时钟极性和相位设置,使其与主机保持一致。具体的设置方法可以参考芯片手册或者开发板的资料。
另外注意:从机发送是要提前准备好数据的,它不知道主机什么时候会发时钟信号过来。
官方库中有很多例程可以参考。