通过单总线实现单片机之间的数据传输

单总线、没有时钟线的通信时,不能使用简单的高低电平来通信,因为接收方不知道此时发送的数据是第几位数据,容易造成错乱。

因此在使用一根线对外传输数据时,需要自定义一个通信协议,它至少要包含格式头+数据,格式头应该占整个数据发送周期的20%左右(时间不用很严谨,因为不同的单片机内部的时钟不同,可以允许一定范围内的误差)。

例如:发送16位的数据,总共要12.8ms,那么可以在它前面加个5ms的格式头。

一个简单的格式头可以根据引脚空闲状态的低电平来设置,假设引脚的空闲状态为高电平,那么可以使用连续的低电平来作为格式头。

数据位肯定是不能用高电平和低电平来表示逻辑1和0了。这里要用稍微复杂一些的信号,例如使用600us的高电平+200us的低电平表示逻辑1,用200us的高电平+600us的低电平来表示逻辑0。

这样组合起来,可以轻易的分辨出当前接收的是0还是1,也可以避免当多个相同的0或1连续发送/接收时,对于接收方来说无法分辨这其中有几个0和1的情况。

自定义的单总线协议使用案例:

  1. 自定义逻辑1和逻辑0对应的有规律的电平组合

假设用600us的高电平+200us的低电平表示逻辑1 ,用200us的高电平+600us的低电平来表示逻辑0

  1. 确定整个数据发送所要的周期

那么发送一位信号要800us,一共要发送16位,一帧(16位)要12.8ms。

  1. 确定格式头的电平和时间长度

假设引脚空闲时由外部的上拉电阻将总线电平拉高,即引脚空闲时为高电平 ,那么使用5ms(占整个数据帧发送周期的25.6%)的低电平来作为格式头

补充:在两帧信号之间,应该加一个时间间隔,方便发送方准备数据、接收方处理上一次收到的数。在这里,对信号的传输速度没有严格要求,便使用5~10ms的时间间隔。

最后,试着使用它来发送信号,在逻辑分析仪上可以看到:

相关推荐
蓝斯49713 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
伟大的前程14 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工15 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip16 小时前
CAN与CANopen的本质区别
单片机
神罚天下ET17 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
Zevalin爱灰灰19 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥19 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5
Hello_Damon_Nikola20 小时前
LIS3DH从入门到精通_三轴加速度计实战指南
单片机·嵌入式硬件·3d
Tyfrank1 天前
Linux内核收包路径及中断
linux·运维·单片机
csdn杰哥1 天前
瑞萨单片机开发教程[二十六] DMAC 存储器数据传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5