HAL库想实现SPI从设备接收并发送数据

2019-07-14 15:06发布

之前用标准库,开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。而我接收完一组数据后,下次数据也许会等比较长的时间......

还有没有别的好的办法供参考?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
建企商务服务
1楼-- · 2019-07-15 18:45
楼主,我和你遇到了基本一样的问题。我也是用cubeMX生成的工程,两个103开发板通过SPI通信,刚开始以为只要连四根线,通信过一会就出错,后来才发现还要两块开发板共地。现在能实现的是SPI主机循环发送8个字节,SPI从机接收8个字节,并在回调函数里再次开启接收中断。仅执行以上的功能是没有问题的。但我稍微改一点,我想SPI从机通过调用DMA发送大量数据给SPI主机,SPI主机需要发送无效字节来读取,而这个读取同样会进入我的接收中断回调函数。。。。后面就各种问题了,然后就再也无法进入接收回调函数了,我感觉接收中断的开启是不是有问题?楼主你的问题解决了么?
谦谦三君子
2楼-- · 2019-07-15 21:40
我现在是按标准库的方式处理spi中断这部分的,在这里卡的时间太长了。
mapleasd
3楼-- · 2019-07-15 22:34
FSP88 发表于 1970-1-1 08:00

你好,请问你还有SPI双机通信的例程吗?我也是用cubeMX生成的工程,做双机主从通信,卡住了,能吧你的程序也发给我看看嘛?邮箱:534840481@qq.com
dingyang598
4楼-- · 2019-07-15 23:38
建企商务服务 发表于 2018-12-20 13:10
楼主,我和你遇到了基本一样的问题。我也是用cubeMX生成的工程,两个103开发板通过SPI通信,刚开始以为只要连四根线,通信过一会就出错,后来才发现还要两块开发板共地。现在能实现的是SPI主机循环发送8个字节,SPI从机接收8个字节,并在回调函数里再次开启接收中断。仅执行以上的功能是没有问题的。但我稍微改一点,我想SP ...

我现在遇到了和你一样的状况,用DMA接收,然后再在中断中启动DMA进行发送,原本以为主机读取的太快,加了延时还是一样,能不能指点一二
建企商务服务
5楼-- · 2019-07-16 02:56
 精彩回答 2  元偷偷看……
哈哈哈欠
6楼-- · 2019-07-16 04:03
亲  能借你的例程参考下吗

一周热门 更多>