原创SPI双机通信,分频系数受限求助

2019-07-21 02:12发布

最近自己写了一个SPI双机通信的工程,遇到了点问题。
需求:两块stm32f4的板子通过SPI进行全双工通信,主机可以向从机写入数据或者读取数据。设计方案:
主机写入从机:发送包含实际数据的完整帧,发送完后等待从机的确认字节,完成任务;
主机读取从机:发送包含所要数据的信息的指令帧,从机接收到后准备好包含实际数据的完整帧,在主机的驱动下返回;
主机采用软件片选,从机采用硬件片选。(这一块花了蛮久时间搞懂)
整个机制建立在中断基础上:主机初始化时仅使能接收中断,从机初始化时使能发送接收中断,所以从机初始化后会立即向发送缓冲区填入一个字节。当主机想要发送一帧时,在准备好实际的数据后,使能发送中断就可以将整个帧数据逐字节的发送出去。
问题描述:
初始化时分频系数最低到16可以正常工作,但4和8均会出现丢失数据导致无法正常通信。
主从机代码采用预编译的方式写在同一个工程中,下面贴代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
bleemcs
1楼-- · 2019-07-21 17:34
本帖最后由 bleemcs 于 2019-4-29 11:19 编辑

这是我的工程,默认使用stm32f407zg,主从切换在spi.h中调整宏定义即可,led和key中可能有一些宏定义需要修改;主机默认使用的是正点原子探索者,按键中断开启一次主机读写任务。经过简单的测试在16分频下能够正常工作。其中有关于通信解包的内容,我使用的通信协议如下:
帧头 1Byte:0x24
收发方 1Byte:0x48/0x84代表是主机给从机或从机给主机
功能码 1Byte:0xA1主机读,0xA2主机写
数据长度 1Byte:主机写时代表帧中的payload长度,主机读时代表想要读回的字节长度
基地址 2Byte:主从机背后有一个相同的数据结构体,数据读取主要是在这两个结构体之间的数据交换
实际数据(主机写时会有,主机读时无此项)
待定功能字节 1Byte
校验和 1Byte

目前测试过16分频下读写正常,但8分频开始就会丢字节,不稳定,会不会是我本身的中断机制设计的不行或者是我的硬件连接太简陋?中断机制在上面有简单的介绍,硬件连接发了图.感谢大家!
bleemcs
2楼-- · 2019-07-21 21:46

一周热门 更多>