找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1210|回复: 5
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
HAL库函数编程,同一块板子里SPI1做主机,SPI2做从机,SPI和相关GPIO口配置完成后,主程序里用HAL_SPI_Receive_IT()准备接受数据。图片里是main.c中发送数据的程序和中断回调函数(片选NSS写在SPI2下了,不过设置NSS为软件控制,这个应该不影响)目前遇到的情况是:
1、可以进入一次中断但只能进入一次。怀疑是没有清除中断标志位,但是我甚至不知道keil调试中应该加什么寄存器来查看(手册里写的寄存器好像都是SPI2S->TXDR这样,难道对于SPI1和SPI2都是这个寄存器吗?)

2、从机部分接收不到数据,主机也收不到从机发回的数据。这个也许是我函数调用错了,但是HAL_SPI_Receive_IT()应该能接受数据才对吧?

3、刚进入中断的时候会修改全局变量Slave_Tx_value为0,本来前面初始化为6,所以我在中断中又设置了一次

HAL_SPI_Receive_IT()能进入中断是否说明至少spi引脚配置得没问题?

在这个问题上纠结了两天了也没解决,希望能得到大佬指点,万分万分感谢!!

4Q)76F6QPH$EIJN7G{5)$]B.png (46.77 KB, 下载次数: 30)

while发送数据以及查询

while发送数据以及查询

40Z7CW5JJ63MVJOV_W@9USP.png (33.73 KB, 下载次数: 31)

中断回调函数

中断回调函数

(T`@`1N2TY}KA7]}U4%3M94.png (41.58 KB, 下载次数: 30)

(T`@`1N2TY}KA7]}U4%3M94.png

KU`5[9_DN)FHZHQ3IJ`PJ`S.png (62.08 KB, 下载次数: 33)

KU`5[9_DN)FHZHQ3IJ`PJ`S.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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在干什么?
能理顺、解决好时序关系,问题就解决了。
编程不是简单地抄写语句。
回复

使用道具 举报

板凳
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-20 16:53 | 只看该作者
一个CPU在任何任何时刻只能做一件事!!!
CPU发送时,不可能接收。
CPU接收时,不可能发送。
CPU发出一个字节,这个字节就瞬间被写入了嵌入式的串行模块,由模块进行移位,再从串口串出一位位地数据,这个过程通常需要几ms。优秀的程序不会让CPU在此死等这个字节串行发完,再发第二个数据。而是转去干其它的活。模块发完了一个字节会通知CPU,这时CPU再回来发下个字节。
同样, 优秀的接收程序也不会让CPU死等RI信号,而是在模块告诉CPU它收到了一个串来字节后,才转来收这个字节,收到后,通常先存放起来,就去办别的事了,决不在此花更多的时间。待下次再收到模块的通知后,才再过来收下另一个字节。如此,当CPU收到一定的数量数据后(一帧)再集中处理。

你调用的是别人的程序(函数),根本无法控制收、发过程,也不知道别人的程序是否合理。这就悲催了。
仔细研读你调用的函数吧。
回复

使用道具 举报

5#
ID:1048225 发表于 2022-10-22 09:18 来自触屏版 | 只看该作者
yzwzfyz 发表于 2022-10-20 16:53
一个CPU在任何任何时刻只能做一件事!!!
CPU发送时,不可能接收。
CPU接收时,不可能发送。

学习了,感谢大佬相助,这就老老实实研究一下库函数
回复

使用道具 举报

6#
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机数据是否可以回传。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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