[STM32H7] SPI CLK响应较慢

[复制链接]
5256|87
 楼主| Hufei1994 发表于 2023-10-13 15:11 | 显示全部楼层 |阅读模式
Hi,大家好

请教一个关于SPI的问题,我使用STM32H7A3ZI芯片进行SPI通讯时发现当CS置位后(通过软件写GPIO实现),CLK不立刻响应发出,大概等了几十个周期后CLK才发出。不管是低速1M还是稍高点10M波特率都有这个问题。

SPI驱动是由HAL库生成的

请问这个现象是正常的么?这样会大大浪费SPI通讯的时间

评论

xch
有点像出警速度  发表于 2023-10-13 17:52
 楼主| Hufei1994 发表于 2023-10-23 20:26 | 显示全部楼层
本帖最后由 Hufei1994 于 2023-10-23 20:34 编辑
呐咯密密 发表于 2023-10-18 17:21
这是我从STM32H743的HALL库里面找出来的的SPI发送接收函数,从你进入函数开始到真正将数据开始送出,前面 ...
  1. uint16_t SPI_ReadWriteByte(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData)
  2. {               
  3.         uint16_t retry=0;

  4.         hspi->pRxBuffPtr  = (uint8_t *)pRxData;
  5.         hspi->pTxBuffPtr  = (const uint8_t *)pTxData;

  6.         hspi->Instance->CR1|=1<<0;//SPE=1,使能spi
  7.         hspi->Instance->CR1|=1<<9;//开启spi
  8.         
  9.         while((hspi->Instance->SR&1<<1)==0)//判断SR寄存器第二位TXP是否为1,等待发送区空        
  10.         {
  11.                 retry++;
  12.                 if(retry>0XFFFE)return 0;
  13.         }                          
  14.         *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
  15.         
  16.         retry=0;
  17.         while((hspi->Instance->SR&1<<0)==0)//判断SR寄存器第一位RXP是否为1,等待接收完一个byte
  18.         {
  19.                 retry++;
  20.                 if(retry>0XFFFE)return 0;
  21.         }
  22.         *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);

  23.         hspi->Instance->IFCR|=3<<3;//EOTC和TXTFC置1,清除EOT和TXTFC位
  24.         hspi->Instance->CR1&=~(1<<0);//SPE=0,关闭SPI2,会执行状态机复位/FIFO重置等操作
  25. }
  1. uint16_t SPI_ReadWrite_OneByte(uint16_t _txdata)
  2. {
  3.         uint16_t rxdata;
  4.         
  5.         HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_RESET);
  6.         SPI_ReadWriteByte(&hspi5, (uint8_t *)&_txdata, (uint8_t *)&rxdata);
  7.           HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_SET);
  8.         
  9.         return rxdata;
  10. }


  11. uint16_t AS5047_read(uint16_t add)
  12. {
  13.         uint16_t data;
  14.         add |= 0x4000;        //读指令 bit14 置1
  15.         if(Parity_bit_Calculate(add)==1) add=add|0x8000; //如果前15位 1的个数位偶数,则Bit15 置1
  16.         SPI_ReadWrite_OneByte(add);                //发送一条指令,不管读回的数据
  17.         data=SPI_ReadWrite_OneByte(NOP|0x4000); //发送一条空指令,读取上一次指令返回的数据。
  18.         data &=0x3fff;
  19.         return data;
  20. }

我按照HAL库实现的形式,用指针重写了SPI的传输代码,基本上全是寄存器操作,但是用时并没有预期的大大减小,总体角度读取用时由9.5us下降到了6.5us,仍然存在CS下拉后不立刻发CLK的现象(延迟了约1us),可能是cubemx配置的问题?理论的SPI纯传输时间约为3.6us(实际SPI纯CLK时间也是为3.6us左右),时间主要浪费在了CLK延迟响应上了


SPI测试.png
SPI配置.png
SPI理论传输时间.png
豌豆爹 发表于 2023-10-13 15:43 | 显示全部楼层
这个现象通常不是正常的。在SPI通信中,CS(片选)信号应该是立即响应的,而CLK(时钟)信号也应该在CS信号变化后立即开始发送。
两只袜子 发表于 2023-10-13 15:45 | 显示全部楼层
可能是GPIO(通用输入输出)的驱动能力不足,可以尝试提高GPIO的驱动能力,或者使用更低电阻的连接线。
jcky001 发表于 2023-10-13 15:45 | 显示全部楼层
HAL库版本更新一下试试
cr315 发表于 2023-10-13 15:46 | 显示全部楼层
可能是SPI的配置存在问题,导致通信延迟。你应该检查你的SPI配置,确保所有的参数(如数据大小,传输顺序,时钟极性和相位等)都是正确的。
玄德 发表于 2023-10-13 19:50 | 显示全部楼层

往 SPI ->DR 寄存器写入数据,SCK 才会出现。
你的 CS 是用 IO 方式产生的,它的边沿和 SCK 没有任何关系。

几十个 CLK 的延时,是“产生 CS ”和“往 DR 写数据”这两件事之间的延时。
你要尽量缩短这个延时。

MessageRing 发表于 2023-10-13 21:30 | 显示全部楼层
还是检查下软件配置吧
icecut 发表于 2023-10-16 11:36 | 显示全部楼层
软cs就这样, 你如果就一个cs,建议用硬cs
sdlls 发表于 2023-10-17 10:17 | 显示全部楼层
SPI接口硬件配置不正确              
呐咯密密 发表于 2023-10-17 10:43 | 显示全部楼层
不用任何怀疑,是你的SPI发送函数有问题,在你的CS下拉之后,你并没有立刻传输数据,而是执行了各种校验工作,这是HAL库的诟病,如果能力够,把这个发送过程用寄存器实现,会大大缩小这个时延。
pixhw 发表于 2023-10-17 11:01 | 显示全部楼层
检查 STM32 的 SPI 配置参数,确保时序设置合理
everyrobin 发表于 2023-10-17 11:37 | 显示全部楼层
SPI接口在硬件上的实现方式可能有所不同,有些硬件可能存在限制,如IO口的速度、电平标准等,这也会影响SPI CLK的响应速度。
yeates333 发表于 2023-10-17 11:46 | 显示全部楼层
检查 CLK 信号是否正确连接到 STM32 的 SPI 模块
ingramward 发表于 2023-10-17 11:59 | 显示全部楼层
优化软件代码,减少数据传输时序上的误差和延时,提高SPI CLK的响应速度
uptown 发表于 2023-10-17 12:08 | 显示全部楼层
例如中断处理程序未正确处理中断、程序执行顺序错误等。
cemaj 发表于 2023-10-17 12:25 | 显示全部楼层
SPI 初始化及传输过程中的代码实现不正确
dspmana 发表于 2023-10-17 12:33 | 显示全部楼层
SPI接口硬件故障可能会导致SPI CLK响应较慢。
chenci2013 发表于 2023-10-17 13:02 | 显示全部楼层
可能是SPI接口的硬件电路设计或者焊接有问题,导致信号传输速度慢。
averyleigh 发表于 2023-10-17 13:11 | 显示全部楼层
如果通信速率过高,可能会导致响应时间变慢,可以在保证通信质量的前提下适当降低通信速率。
sheflynn 发表于 2023-10-17 13:23 | 显示全部楼层
SPI 时钟频率过高,导致数据传输时间不足以满足要求;或 SPI 引脚上拉电阻设置不当,导致上拉电阻与 SPI 设备的电容影响 CLK 信号的上升沿和下降沿。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

160

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部