关于 STM32 SPI 从机模式的问题

你再寻找 关于SPI 作为从机时  而且还没有NSS 信号    而出现数据接收错误的烦恼吧

最近给客户做一个项目 使用到了SPI 从机     在网上找答案  但是没有找到自己满意的  现在来说  都没有 将SPI 通信接收错误的根本原因说明白


网上有很多关于STM32  作为从机来使用 的 问题  主要还是 从机接收数据错误

1  关于主从机的 时钟悬空配置     可以肯定的说 主机与从机的时钟悬空一定要配成一样的 

这点STM 的官方手册说的很明白

2 从机的波特率 只与 主机提供的 CLK 信号有关

3 通信失败  或者 数据接收错误 问题就出在从机对SPI 的起始信号的判断上面


当使用TI 模式  NSS 信号由硬件  从机对数据的捕获 就很容易 

若没有NSS 信号呢    因为STM32  SPI普通模式 根本就没有对数据的捕获 做什么工作    真的有点糊弄我们

它 只是 当我们把SPI 打开  他就开始进行捕获  而不管SCK 此时是闲置的还是忙的    这就造成了 我们读取的SPI 数据错误

解决这个问题也很简单  只要在软件中 对 SPI 信号进行处理  得到SPI 线路是 忙的 还是空闲的

根本就是对 SPI 信号的 捕获时机

当我们要进行捕获前先对总线SPI 进行判断 若总线SPI 是空闲的  那么就开启SPI 进行数据捕获

若总线SPI 是忙的 就等待 总线空闲了  在进行捕获   经过验证这个方法通信成功率 几乎是没有问题的

QQ475503748 


STM32 SPI (Serial Peripheral Interface)模块作为从设备发送数据通常需要遵循以下几个步骤: 1. **初始化SPI模块**: - 首先,你需要配置SPI的时钟频率、工作模式数据线方向等,这通过STM32提供的GPIO和SPI寄存器完成。 ```c SPI_HandleTypeDef SpiHandle; GPIO_InitTypeDef GPIO_InitStructure; // 初始化GPIOs GPIO_InitStructure.Pin = ...; // 确定哪些GPIO脚作为SPI数据线、SCK、MISO/MOSI GPIO_InitStructure.Mode = ...; // 设置模式为推挽或开漏 GPIO_Init(..., &GPIO_InitStructure); // 初始化SPI SpiHandle.Instance = ...; // 指定SPI外设实例 SpiHandle.Init.ClockPrescaler = ...; // 设置时钟分频 SpiHandle.Init.BaudRatePrescaler = ...; // 设置波特率预分频 SpiHandle.Init.Direction = ...; // 设置SPI总线方向 HAL_SPI_Init(&SpiHandle); ``` 2. **开启中断**: 如果你想接收数据,可能需要启用中断,以便在接收到数据时能够处理。 ```c HAL_NVIC_EnableIRQ(SPI_IRQn); // 开启SPI中断 ``` 3. **发送数据**: 使用`HAL Spi_Transmit()`函数发送数据到主设备。例如: ```c uint8_t txData[] = {0x01, 0x02, 0x03}; // 待发送的数据 uint16_t len = sizeof(txData); HAL_StatusTypeDef status = HAL_SPI_Transmit(&SpiHandle, txData, len, timeout); // timeout是超时时间 if(status != HAL_OK){ // 处理错误 } ``` 4. **设置接收缓冲区**(如果需要接收): 在主设备开始传输数据之前,可能需要设置一个接收缓冲区。 5. **接收数据**: 如果开启了接收,可以在主设备发送数据后使用`HAL Spi_Receive()`来读取接收缓冲区的内容。 ```c uint8_t rxData[...]; // 接收缓冲区 uint16_t rxLength = ...; status = HAL_SPI_Receive(&SpiHandle, rxData, rxLength, timeout); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值