打印
[STM32H7]

SPI CLK响应较慢

[复制链接]
2792|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 回复TA
有点像出警速度 
来自 2楼
Hufei1994|  楼主 | 2023-10-23 20:26 | 只看该作者
本帖最后由 Hufei1994 于 2023-10-23 20:34 编辑
呐咯密密 发表于 2023-10-18 17:21
这是我从STM32H743的HALL库里面找出来的的SPI发送接收函数,从你进入函数开始到真正将数据开始送出,前面 ...
uint16_t SPI_ReadWriteByte(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData)
{               
        uint16_t retry=0;

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

        hspi->Instance->CR1|=1<<0;//SPE=1,使能spi
        hspi->Instance->CR1|=1<<9;//开启spi
        
        while((hspi->Instance->SR&1<<1)==0)//判断SR寄存器第二位TXP是否为1,等待发送区空        
        {
                retry++;
                if(retry>0XFFFE)return 0;
        }                          
        *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
        
        retry=0;
        while((hspi->Instance->SR&1<<0)==0)//判断SR寄存器第一位RXP是否为1,等待接收完一个byte
        {
                retry++;
                if(retry>0XFFFE)return 0;
        }
        *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);

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


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

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


SPI配置.png (292.32 KB )

SPI配置.png

SPI测试.png (254.62 KB )

SPI测试.png

SPI理论传输时间.png (33.29 KB )

SPI理论传输时间.png

使用特权

评论回复
板凳
豌豆爹| | 2023-10-13 15:43 | 只看该作者
这个现象通常不是正常的。在SPI通信中,CS(片选)信号应该是立即响应的,而CLK(时钟)信号也应该在CS信号变化后立即开始发送。

使用特权

评论回复
地板
两只袜子| | 2023-10-13 15:45 | 只看该作者
可能是GPIO(通用输入输出)的驱动能力不足,可以尝试提高GPIO的驱动能力,或者使用更低电阻的连接线。

使用特权

评论回复
5
jcky001| | 2023-10-13 15:45 | 只看该作者
HAL库版本更新一下试试

使用特权

评论回复
6
cr315| | 2023-10-13 15:46 | 只看该作者
可能是SPI的配置存在问题,导致通信延迟。你应该检查你的SPI配置,确保所有的参数(如数据大小,传输顺序,时钟极性和相位等)都是正确的。

使用特权

评论回复
7
玄德| | 2023-10-13 19:50 | 只看该作者

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

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

使用特权

评论回复
8
MessageRing| | 2023-10-13 21:30 | 只看该作者
还是检查下软件配置吧

使用特权

评论回复
9
icecut| | 2023-10-16 11:36 | 只看该作者
软cs就这样, 你如果就一个cs,建议用硬cs

使用特权

评论回复
10
sdlls| | 2023-10-17 10:17 | 只看该作者
SPI接口硬件配置不正确              

使用特权

评论回复
11
呐咯密密| | 2023-10-17 10:43 | 只看该作者
不用任何怀疑,是你的SPI发送函数有问题,在你的CS下拉之后,你并没有立刻传输数据,而是执行了各种校验工作,这是HAL库的诟病,如果能力够,把这个发送过程用寄存器实现,会大大缩小这个时延。

使用特权

评论回复
12
pixhw| | 2023-10-17 11:01 | 只看该作者
检查 STM32 的 SPI 配置参数,确保时序设置合理

使用特权

评论回复
13
everyrobin| | 2023-10-17 11:37 | 只看该作者
SPI接口在硬件上的实现方式可能有所不同,有些硬件可能存在限制,如IO口的速度、电平标准等,这也会影响SPI CLK的响应速度。

使用特权

评论回复
14
yeates333| | 2023-10-17 11:46 | 只看该作者
检查 CLK 信号是否正确连接到 STM32 的 SPI 模块

使用特权

评论回复
15
ingramward| | 2023-10-17 11:59 | 只看该作者
优化软件代码,减少数据传输时序上的误差和延时,提高SPI CLK的响应速度

使用特权

评论回复
16
uptown| | 2023-10-17 12:08 | 只看该作者
例如中断处理程序未正确处理中断、程序执行顺序错误等。

使用特权

评论回复
17
cemaj| | 2023-10-17 12:25 | 只看该作者
SPI 初始化及传输过程中的代码实现不正确

使用特权

评论回复
18
dspmana| | 2023-10-17 12:33 | 只看该作者
SPI接口硬件故障可能会导致SPI CLK响应较慢。

使用特权

评论回复
19
chenci2013| | 2023-10-17 13:02 | 只看该作者
可能是SPI接口的硬件电路设计或者焊接有问题,导致信号传输速度慢。

使用特权

评论回复
20
averyleigh| | 2023-10-17 13:11 | 只看该作者
如果通信速率过高,可能会导致响应时间变慢,可以在保证通信质量的前提下适当降低通信速率。

使用特权

评论回复
21
sheflynn| | 2023-10-17 13:23 | 只看该作者
SPI 时钟频率过高,导致数据传输时间不足以满足要求;或 SPI 引脚上拉电阻设置不当,导致上拉电阻与 SPI 设备的电容影响 CLK 信号的上升沿和下降沿。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

160

帖子

0

粉丝