STM32硬件SPI从机模式问题记录

背景

最近需要进行一个三线通信的接口,ENABLE,CLK,DATA三根线,只有接收的状态,这种情形比较符合STM32作为SPI从机接收信号。
如果是用IO逻辑来判断这三线的时序,比较占用CPU时间,同时也有可能因为其他任务,错过判断的情况。理论上进都用IO边沿中断,也可以比较好地满足时序判定,并没有进行尝试,这里不下结构
而硬件SPI是可以比较符合这个通信时序的使用场景的,在配置好之后是可以相对方便接收相应的通信数据。
需要只有接收数据,此文只记录从机仅接收模式(slave receive only mode)

操作步骤

使用中断来完成接收数据
配置CUBEMX
image
image

//中断只有响应接收到数据,同时再次打开接收数据操作
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef * hspi)
{
	if(hspi->Instance == SPI1)
	{
		isSpiValUpdated = 1;
		HAL_SPI_Receive_IT(&hspi1, spiReceiveData, 1);
	}
}

问题记录

软件无NSS管脚

这样情况可以处于一直接收的状态,不过由于一直处于接收的状态,信号有所干扰很容易引起SPI出错,SPI需要重置才可以恢复正常
有时表现的是OVERRUN错误,或是BSY_FLAG一直处于置位的状态。

//出现错误时可以重置SPI,来恢复正常,BSY_FLAG有时必须SPI模块才能恢复正常
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi->Instance == SPI1)
	{
		__HAL_RCC_SPI1_FORCE_RESET();
		__HAL_RCC_SPI1_RELEASE_RESET();
		MX_SPI1_Init();
		HAL_SPI_Receive_IT(&hspi1, spiReceiveData, 1);
	}
}

BSY_FLAG一直置位的情况,软件方式无法清零

可是能芯片本身的问题,没有在F1的errata sheet里面找到说明,不过F2系列里有这个说明,其他系列也有
需要重置SPI才可以恢复正常,不重置的情况下,HAL代码有一直判定BSY_FLAG会导致响应异常。
image
image

软件SSI寄存器置位,清除来实现类似于硬件NSS使能的操作

static void bsp_spi_soft_enbale(void)
{
	uint32_t regTmp = 0;
	regTmp = hspi1.Instance->CR1;
	regTmp &= ~SPI_CR1_SSI;
	WRITE_REG(hspi1.Instance->CR1, regTmp);
}

static void bsp_spi_soft_disable(void)
{
	uint32_t regTmp = 0;
	regTmp = hspi1.Instance->CR1;
	regTmp |= SPI_CR1_SSI;
	WRITE_REG(hspi1.Instance->CR1, regTmp);
}

image

硬件NSS输入

image
配置PA4作为NSS输入,低电平有效

配合SPI使能,无论是软件方式,还是硬件方式相对软件使能一直有效的情况下,都可以减少SPI出错的概率

DEBUG时RXNE自动清零的情况

DEBUG时遇到一个奇怪的小问题,进入中断断点时,下一步时RXNE自动清零
原因是调试时SWD读取了,DR寄存器,触发RXNE清零操作(个人主观猜测,没有找到依据,仅供参考)

第一次接收的SPI数据错误,引发OVERRUN错误置位导致发送接收的个数对应不上

初始化之后,第一次接收的数据异常,之后接收都正常
将管脚根据主机SPI_SCK默认状态配件相应的上下拉,初始化之后就正常,没有发现数据丢失
SCK没配置上下拉时,初始化时可能存在干扰,多产生了一bit的时序导致OVERRUN错误置位

小结

硬件SPI个别使用细节需要注意
简单记录调试时遇到的问题,方便回顾。

参考

RXNE自动清零
BSY_FLAG一直置位问题
HAL SPI使用代码参考
STM32使用SPI通信时的一些常见问题及解决方法

posted @   cau_par  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示