你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F767作为spi从机一个时钟发送了两位数据

[复制链接]
xzq11 提问时间:2023-8-21 14:38 / 未解决

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),红色是主机发送的数据。

b1feacc881cf59584c2df9a8420fc69.jpg

收藏 评论2 发布时间:2023-8-21 14:38

举报

2个回答
STMCU-管管 回答时间:2023-8-21 18:12:05
可能是SPI时钟极性或相位设置不正确导致的。请检查SPI时钟极性和相位设置是否与主机设置一致。在SPI通信中,时钟极性和相位设置会影响数据传输的时序。如果从机与主机的时钟极性和相位设置不一致,就可能会导致数据传输异常。
可以尝试调整从机的时钟极性和相位设置,使其与主机保持一致。具体的设置方法可以参考芯片手册或者开发板的资料。

butterflyspring 回答时间:2023-8-22 09:59:51
STM32F767 没有说支持双边沿发送或接收数据呀,不会多出这么个功能吧。所以数据不对可能是其他原因。
另外注意:从机发送是要提前准备好数据的,它不知道主机什么时候会发时钟信号过来。
官方库中有很多例程可以参考。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版