通信协议——单总线

单总线概述

  • 单总线是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。 这种协议由一个总线主节点、或多个从节点组成系统,通过根信号线对从芯片进行数据的读取。每一个符合OneWire协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的家族代码和8位的CRC代码。主芯片根据64位寻址对各个芯片进行双向通信,因此其协议对时序的要求较严格,初始化、写bit或读bit都有严格的时序要求,但是位于位之间没有严格要求
  • 单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围
  • 这种传输方式信号线上既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。

单总线应用

目前,单总线器件主要有数字温度传感器(如DS18B20)、A/D转换器(如DS2450)、门标、身份识别器(如DS1990A)、单总线控制器(如DS1WM)等。

单总线硬件结构

单总线即只有一根数据线:重要的是每一个挂在总线上的器件都能在适当的时间驱动它。每次每一个总线上的器件都必须是漏极开路或三态输出。下面是以DS18B20为例的结构图。
在这里插入图片描述单总线的空闲状态为高电平。无论任何理由需要暂停某一执行过程时,如果还行恢复执行的话,总线必须停留在空闲状态。在恢复器件如果单总线处于高电平,位于位间的恢复时间可以无限长。如果总线停留在低电平超过480us,总线上的所有器件都将被复位

单总线通信原理

由于单总线是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线命令序列,即初始化、ROM命令和功能命令。如果出现序列混乱,器件将不响应主机(搜索ROM命令、报警搜索命令除外)。单总线通信步骤如下:

  • 初始化
  • ROM操作命令
  • 存储器操作命令
  • 执行/数据

单总线通信时序

  1. 初始化
    在这里插入图片描述
  2. 写时序图
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  3. 读时序图
    在这里插入图片描述在这里插入图片描述
### FPGA 实现单总线通信协议 #### 单总线协议概述 单总线是一种简单的双向通讯方式,仅需一根数据线即可完成主机与多个从机之间的数据交换。常见的单总线器件有DHT11湿度温度传感器、DS18B20数字温度计等[^1]。 #### FSM设计原理 为了实现单总线通信,通常采用有限状态机(FSM)的设计方法。FSM可以有效地管理不同阶段的操作流程,确保每个命令按顺序执行而不发生冲突。对于像DHT11这样的设备来说,其工作周期分为初始化、发送指令、等待响应及接收/传送数据四个主要部分。 #### 数据交互机制 当FPGA作为主控端时,它负责发起所有的读写动作,并遵循特定的时间序列来保证数据的有效性和准确性。例如,在处理来自DS18B20的数据请求时,除了正常的复位脉冲外,还需要精确控制写入'0'/'1'和读取相应电平的过程以匹配目标芯片的要求[^2]。 #### Verilog代码实例 下面给出一段简化版的Verilog代码片段用于说明如何利用状态机结构在FPGA上构建基本的单总线接口: ```verilog module one_wire_interface( input wire clk, // 主时钟输入 output reg data_out, // 输出至单总线的数据信号 input wire data_in, // 来自单总线的状态反馈 ... ); // 定义状态枚举类型 typedef enum logic [3:0] { IDLE, INIT_PULSE, WRITE_0, WRITE_1, READ_DATA, /* 更多可能的状态 */ } state_t; state_t current_state; // 当前所处的工作状态 always @(posedge clk or negedge rst_n) begin : fsm_process if (!rst_n) current_state <= IDLE; else case (current_state) IDLE: ... ; INIT_PULSE: ... ; // 发送初始低电平脉冲给所有连接着的单总线设备 WRITE_0: ... ; // 将逻辑‘0’编码成适合单总线传输的形式 WRITE_1: ... ; // 对于逻辑‘1’做相同的事情但是保持高电平更长时间 READ_DATA: ... ; // 解码从其他节点返回的信息流 default: // 默认情况下回到IDLE态准备下次操作 current_state <= IDLE; endcase end ... endmodule ``` 此模块展示了基于状态转移的思想去模拟实际物理层面上发生的事件链路——即先发出启动条件再依次进行各种类型的IO活动直至获取所需的结果为止。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值