找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

stm32用spi协议在同一块板子之间实现数据收发遇到的问题

查看数: 1231 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-10-19 00:35

正文摘要:

HAL库函数编程,同一块板子里SPI1做主机,SPI2做从机,SPI和相关GPIO口配置完成后,主程序里用HAL_SPI_Receive_IT()准备接受数据。图片里是main.c中发送数据的程序和中断回调函数(片选NSS写在SPI2下了,不过设置NSS ...

回复

ID:624769 发表于 2022-10-22 16:12
yzwzfyz 发表于 2022-10-19 08:15
设有A,B二机。
1、A在发送时,必须保证B在接收。否则数据会丢失。
2、B在反回数据时,必须保证A在接收。 ...

spi有主从关系,a机发,b机收,需要确保b机状态,但b机返回时,不是考虑a机状态,时钟控制在a机手里,所以此时应当依然是a机考虑b机是否准备好了数据,所以很多伪spi传输会有busy线,用来从b机通知a机数据是否可以回传。
ID:1048225 发表于 2022-10-22 09:18
yzwzfyz 发表于 2022-10-20 16:53
一个CPU在任何任何时刻只能做一件事!!!
CPU发送时,不可能接收。
CPU接收时,不可能发送。

学习了,感谢大佬相助,这就老老实实研究一下库函数
ID:123289 发表于 2022-10-20 16:53
一个CPU在任何任何时刻只能做一件事!!!
CPU发送时,不可能接收。
CPU接收时,不可能发送。
CPU发出一个字节,这个字节就瞬间被写入了嵌入式的串行模块,由模块进行移位,再从串口串出一位位地数据,这个过程通常需要几ms。优秀的程序不会让CPU在此死等这个字节串行发完,再发第二个数据。而是转去干其它的活。模块发完了一个字节会通知CPU,这时CPU再回来发下个字节。
同样, 优秀的接收程序也不会让CPU死等RI信号,而是在模块告诉CPU它收到了一个串来字节后,才转来收这个字节,收到后,通常先存放起来,就去办别的事了,决不在此花更多的时间。待下次再收到模块的通知后,才再过来收下另一个字节。如此,当CPU收到一定的数量数据后(一帧)再集中处理。

你调用的是别人的程序(函数),根本无法控制收、发过程,也不知道别人的程序是否合理。这就悲催了。
仔细研读你调用的函数吧。
ID:1048225 发表于 2022-10-19 09:39
yzwzfyz 发表于 2022-10-19 08:15
设有A,B二机。
1、A在发送时,必须保证B在接收。否则数据会丢失。
2、B在反回数据时,必须保证A在接收。 ...

感谢帮助
程序里是用receive_it准备在接受到数据的时候进入中断,然后在中断里发送数据回主机,此时两者应该都处于收发数据的状态。
刚接触单片机不久,stm32的标准库还能看个大致,但是感觉hal库对我来说太绕了,手上设备还只能支持hal,代码确实是在网上找了例程照着大概写的,因为我不是很能看懂hal库怎么用
ID:123289 发表于 2022-10-19 08:15
设有A,B二机。
1、A在发送时,必须保证B在接收。否则数据会丢失。
2、B在反回数据时,必须保证A在接收。同理。
想一想SPI的通讯过程序吧,假设A要发送1,2,3,4,5。程序是送一个数据等一等,还是一齐发完5个数。当A在发数据的时候CPU在干什么?是在进行B等待吗?还是在A的发送中?
B接收会在何时发产中断,当B在返回数据时,CPU在干什么?
能理顺、解决好时序关系,问题就解决了。
编程不是简单地抄写语句。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表