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

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

因此在使用一根线对外传输数据时,需要自定义一个通信协议,它至少要包含格式头+数据,格式头应该占整个数据发送周期的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的时间间隔。

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

相关推荐
森焱森1 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
brave and determined3 小时前
国产MCU学习Day11——CW32F030C8T6 低电压检测器(LVD)详解与应用
单片机·嵌入式硬件·嵌入式·国产mcu·cw32f030c8t6·cw32f030c8t6lvd·低电压检测器
金色光环7 小时前
stm32与tp-linkv2接线、解决识别不到芯片问题
stm32·单片机·嵌入式硬件
森焱森9 小时前
APM与ChibiOS系统
c语言·单片机·算法·架构·无人机
Wangshanjie_9810 小时前
【STM32】-单片机数据通讯基本概念
stm32·单片机
不落的太陽11 小时前
让测距功能与时俱进
单片机·嵌入式硬件
Funing711 小时前
stm32地址偏移:为什么相邻寄存器的地址偏移量0x04表示4个字节?
stm32·单片机·嵌入式硬件
竹照煜_ysn20 小时前
蓝桥杯51单片机设计
单片机·嵌入式硬件·51单片机
Electron-er21 小时前
汽车LIN总线通讯:从物理层到协议栈的深度解析
单片机·汽车电子·lin总线·lin总线通讯