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

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个回答
我不怕 回答时间: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里
wolfgang 回答时间: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
不懂帮顶
我不怕 回答时间:2016-12-10 15:39:19
楼主,我和你遇到了基本一样的问题。我也是用cubeMX生成的工程,两个103开发板通过SPI通信,刚开始以为只要连四根线,通信过一会就出错,后来才发现还要两块开发板共地。现在能实现的是SPI主机循环发送8个字节,SPI从机接收8个字节,并在回调函数里再次开启接收中断。仅执行以上的功能是没有问题的。但我稍微改一点,我想SPI从机通过调用DMA发送大量数据给SPI主机,SPI主机需要发送无效字节来读取,而这个读取同样会进入我的接收中断回调函数。。。。后面就各种问题了,然后就再也无法进入接收回调函数了,我感觉接收中断的开启是不是有问题?楼主你的问题解决了么?

评分

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

查看全部评分

any012 回答时间:2016-12-10 21:26:02
我现在是按标准库的方式处理spi中断这部分的,在这里卡的时间太长了。
斜阳 回答时间:2016-12-11 10:01:13
我觉得可以实现一个类似于串口的超时中断机制;当这一帧数据接收完毕之后超过多长时间未收到数据视作超时;开始解析收到的数据;

评分

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

查看全部评分

zbber 回答时间:2016-12-11 13:54:58
不懂帮顶,感恩无私的分享与奉献
any012 回答时间:2016-12-29 10:11:38
斜阳__ 发表于 2016-12-11 10:01
我觉得可以实现一个类似于串口的超时中断机制;当这一帧数据接收完毕之后超过多长时间未收到数据视作超时; ...

现在想想,是一开始定的通讯协议不太合理造成的。
主设备发送数据的同时,从设备接收数据同时发送相应反馈数据。这个可能不太合理,如果是主设备发送命令后,等待一段时间,重设备处理完数据后,主设备再发送SCL信号,从设备发送反馈数据,这样就好了。

现在这种情况的话,只能降低发送速率,从设备中断接收尽量简短。主设备也是STM32,用的是硬件SPI,要是能控制每帧里面各数据的间隔长度就好了。
我不怕 回答时间:2017-2-3 17:30:47
我已经实现了cubeMX下的两机SPI通信,中间有些需要注意的地方!等我有空的时候再写一下!
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版