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

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

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

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

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

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

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

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

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 16:00:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 16:00:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 16:00:01       82 阅读
  4. Python语言-面向对象

    2024-05-11 16:00:01       91 阅读

热门阅读

  1. 用python写一个自动生成android开机动画的工具

    2024-05-11 16:00:01       35 阅读
  2. C语言中 #include<>与 include ““的区别

    2024-05-11 16:00:01       34 阅读
  3. 找第二大的数(分治法)

    2024-05-11 16:00:01       32 阅读
  4. 个人如何做股指期货交易?

    2024-05-11 16:00:01       36 阅读
  5. 间隔采样视频的代码

    2024-05-11 16:00:01       31 阅读
  6. 低方差过滤

    2024-05-11 16:00:01       33 阅读
  7. how do i get chat‘s members‘s ids by bot in telegram

    2024-05-11 16:00:01       26 阅读
  8. GO:流程控制

    2024-05-11 16:00:01       29 阅读
  9. MYSQL变量的定义与使用

    2024-05-11 16:00:01       32 阅读
  10. Rust教程:贪吃蛇游戏(第 1/2 部分)

    2024-05-11 16:00:01       22 阅读
  11. 神经网络模型里面权重衰减的理解

    2024-05-11 16:00:01       25 阅读
  12. Oracle 10/11g 修改默认占用8080端口

    2024-05-11 16:00:01       30 阅读