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

HAL库,想实现SPI从设备接收并发送数据,求个思路。

[复制链接]
any012 提问时间:2016-11-25 11:46 /
悬赏10ST金币已解决
之前用标准库,开SPI接收中断,接收后到数据后判断是否位帧首,是的话,置个标志位,将再接收的数据存放到一个数组里。接收的同时,发送下一个将要发送的数据,等待下一次接收时自动发送出去。接收到一定数量后,判断校验位,清标志位。

现在改用HAL库了,HAL_SPI_Receive_IT( )函数使调用一次开启一次中断,执行完后关闭中断及SPI,然后执行回调函数。
我尝试在回调函数里,再次调用HAL_SPI_Receive_IT( ),以使设备一直处于接收状态。结果,没调成功。
后改成在void SPI2_IRQHandler(void)里,再次调用HAL_SPI_Receive_IT( )函数,暂时可以正常接收。
帧首尾的判断也放在了void SPI2_IRQHandler(void)里,现在接收完一组数据后,通过串口发送过来,是正确的。
按原来的思路,接收一个数据后,就应准备发送下一个准备发送的数据,于是就调用HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数,可最后一个参数,是超时判断用的,超时后,貌似会自动关闭SPI中断及SPI。而我接收完一组数据后,下次数据也许会等比较长的时间......

还有没有别的好的办法供参考?

最佳答案

查看完整内容

之前实现了HAL库下的楼主想要实现的功能,简单介绍一下。比如SPI从机设备实现接收到0XA1命令码后,准备发送1K个字节,主机之后读取这1K的数据,使用cubeMX实现的思路如下: 1、配置基础工程,我这里开启了SPI DMA传输; 2、上电后,开启一个字节命令码DMA接收中断 HAL_SPI_Receive_DMA(&hspi1,spi_cmd,1); 3、SPI接收完成回调函数中判断接收到的命令码是否为0xA1,并准备发送1K数据 if(spi_cmd[0] == 0xA1){ HAL_SPI_Transmi ...
1 收藏 3 评论24 发布时间:2016-11-25 11:46

举报

24个回答
我不怕2106 回答时间:2016-11-25 11:46:17
之前实现了HAL库下的楼主想要实现的功能,简单介绍一下。比如SPI从机设备实现接收到0XA1命令码后,准备发送1K个字节,主机之后读取这1K的数据,使用cubeMX实现的思路如下:
1、配置基础工程,我这里开启了SPI DMA传输;
2、上电后,开启一个字节命令码DMA接收中断 HAL_SPI_Receive_DMA(&hspi1,spi_cmd,1);
3、SPI接收完成回调函数中判断接收到的命令码是否为0xA1,并准备发送1K数据
if(spi_cmd[0] == 0xA1){                       
    HAL_SPI_Transmit_DMA(&hspi1,test_buf,1024);
}
4、从机准备好发送的数据,当主机读取1K数据完成时进入发送完成回调函数,此时再次开启一个字节命令码DMA接收中断
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){
       
        if(hspi->Instance == SPI1){
               
                HAL_SPI_Receive_DMA(&hspi1,spi_cmd,1);
        }       
}
5、以上述简单的例子,举一反三实现更多相关的应用;
stary666 回答时间:2016-11-25 12:30:37
思路在Datasheet里
wolfgang2015 回答时间:2016-11-25 13:19:41
"HAL_SPI_Receive_IT( ),以使设备一直处于接收状态。"
HAL_SPI_Receive_IT( ) 调用的回调函数里改变状态的.

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2016-11-25 13:47:25
wolfgang2015 发表于 2016-11-25 13:19
"HAL_SPI_Receive_IT( ),以使设备一直处于接收状态。"
HAL_SPI_Receive_IT( ) 调用的回调函数里改变状态的 ...

HAL_SPI_Receive_IT( ) 调用的回调函数里改变状态的.

没明白,能否细说下?
any012 回答时间:2016-11-25 15:00:20
想不用HAL_SPI_Receive_IT( )函数,而是用HAL_SPI_TransmitReceive_IT( )函数,这样,发送和接收用一个函数就完成了。可发现读取的数不对,感觉像是接收和发送都触发了中断。而再次发送的操作,我是放在了中断里进行的。
yyyef 回答时间:2016-11-25 16:36:34
不懂帮顶
yyyef 回答时间:2016-11-25 16:37:03
不懂帮顶
helium133135412 回答时间:2016-11-25 20:49:08
不懂帮顶
我不怕2106 回答时间:2016-12-10 15:39:19
楼主,我和你遇到了基本一样的问题。我也是用cubeMX生成的工程,两个103开发板通过SPI通信,刚开始以为只要连四根线,通信过一会就出错,后来才发现还要两块开发板共地。现在能实现的是SPI主机循环发送8个字节,SPI从机接收8个字节,并在回调函数里再次开启接收中断。仅执行以上的功能是没有问题的。但我稍微改一点,我想SPI从机通过调用DMA发送大量数据给SPI主机,SPI主机需要发送无效字节来读取,而这个读取同样会进入我的接收中断回调函数。。。。后面就各种问题了,然后就再也无法进入接收回调函数了,我感觉接收中断的开启是不是有问题?楼主你的问题解决了么?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版