单总线线(1-wire)是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线,在主机和从机之间通信。
常见的w1芯片:at21cs01,ds18b20,ds28e05等。
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 特殊处理的问题
- arm linux延迟ns实际采用的是us,延迟1us实测延迟接近2us(lpj计算延迟)。
- 读写字节时关中断,否则可能时序错误。
- 读写数据芯片没有响应时应重试。
- 读写数据时偶尔数据异常,时序错误,采用标准速度操作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次读测试无问题。
参考
- 美信DS28E05单总线EEPROM通信方式详解(以STM32F030为例)
- 单总线协议及LINUX DS18B20驱动
- Linux驱动开发:基于全志A40i的Linux单总线驱动的开发
- W1: Dallas’ 1-wire bus - kernel
- 学习温度传感器ds18b20的驱动编写过程
- w1-slaves-kconfig
- kernel(十三)1-wire (DS18B20)