单总线协议

单总线线(1-wire)是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线,在主机和从机之间通信。
常见的w1芯片:at21cs01,ds18b20,ds28e05等。
一般情况下,单总线对时序要求严格,不应用于linux(需要关调度,甚至关中断)。

1. 驱动

基于zynq7020采用gpio方式模拟读写at21cs01器件。

1.1 基础信息

gpio: PS_MIO11, 即板卡上PS_KEY1。

电路: 上拉电阻 1K

设备号:major 244, minor 0 (系统分配的设备号,可能变化)

设备文件: /dev/eeprom

设备树节点:

        eeprom_gpio {
                compatible = "canaan,eeprom-gpio";
                status = "okay";
                eeprom-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
                reg = <0xE000A040 0x4
                        0xE000A060 0x4
                        0xE000A204 0x4
                        0xE000A208 0x4
                        0xE000A214 0x4
                        0xF800012C 0x4
                        >;
        };

1.2 特殊处理的问题

  1. arm linux延迟ns实际采用的是us,延迟1us实测延迟接近2us(lpj计算延迟)。
  2. 读写字节时关中断,否则可能时序错误。
  3. 读写数据芯片没有响应时应重试。
  4. 读写数据时偶尔数据异常,时序错误,采用标准速度操作at21cs01。

1.3 程序控制

#define DDEVICE_SPEED_STD		0			/* 标准速度还是高速,标准速度为1, 高速为0 */
#define DDEVICE_GPIO_MODE_REG	        0			/* 使用GPIOLIB方式还是直接读写寄存器,REG:1,GPIOLIB:0 */
#define DDEVICE_RW_RETRIES		5			/* 读写最大尝试次数, 最小为1 */	

通过3个宏可分别控制读写速度模式、读写方式和读写尝试次数。

2. 测试

insmod eeprom.ko

./App /dev/eeprom [read_times]

./App /dev/eeprom
./App /dev/eeprom 100
./App /dev/eeprom 1000

测试结果:

多次读写128bytes测试,偶尔有读取数据错误发生。时序错误导致。

采用标准速度读写128bytes时,多次1000次读测试无问题。

参考

  1. 美信DS28E05单总线EEPROM通信方式详解(以STM32F030为例)
  2. 单总线协议及LINUX DS18B20驱动
  3. Linux驱动开发:基于全志A40i的Linux单总线驱动的开发
  4. W1: Dallas’ 1-wire bus - kernel
  5. 学习温度传感器ds18b20的驱动编写过程
  6. w1-slaves-kconfig
  7. kernel(十三)1-wire (DS18B20)
  8. w1-gpio
  9. mxc_w1
posted @ 2023-11-12 22:31  yuxi_o  阅读(207)  评论(0编辑  收藏  举报