通过wiringPi等library, 在user space 通过/dev/i2c来读写i2c设备的方案不在本文讨论了。

编译SENSORS_PCF8591 模块

在Default raspberryPi的内核中,pcf591模块是没有编译的。

查看drivers\hwmon\Makefile

obj-$(CONFIG_HWMON)        += hwmon.o
... obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o
...

修改arch\arm\configs\bcm2709_defconfig, 增加一行 CONFIG_SENSORS_PCF8591=m

CONFIG_HWMON=m
...
CONFIG_SENSORS_PCF8591=m

执行

make mrproper
make modules

将pcf8591.ko copy到raspberryPi板子

如果单独编译hwmon下的模块,

make modules SUBDIRS=drivers/hwmon/

install module

pi@raspberrypi:/lib/modules/4.14.48-v7+/kernel/drivers/hwmon $ sudo insmod pcf8591.ko

查看module是否install

pi@raspberrypi:/lib/modules/4.14.48-v7+/kernel/drivers/hwmon $ lsmod
Module Size Used by
pcf8591 16384 0

insmode 参数

The PCF8591 has 4 analog inputs programmable as single-ended or

differential inputs :

- mode 0 : four single ended inputs

Pins AIN0 to AIN3 are single ended inputs for channels 0 to 3

  • mode 1 : three differential inputs

    Pins AIN3 is the common negative differential input

    Pins AIN0 to AIN2 are positive differential inputs for channels 0 to 2

  • mode 2 : single ended and differential mixed

    Pins AIN0 and AIN1 are single ended inputs for channels 0 and 1

    Pins AIN2 is the positive differential input for channel 3

    Pins AIN3 is the negative differential input for channel 3

  • mode 3 : two differential inputs

    Pins AIN0 is the positive differential input for channel 0

    Pins AIN1 is the negative differential input for channel 0

    Pins AIN2 is the positive differential input for channel 1

    Pins AIN3 is the negative differential input for channel 1

/* Insmod parameters */
I2C_CLIENT_INSMOD_1(pcf8591); static int input_mode;
module_param(input_mode, int, 0);
MODULE_PARM_DESC(input_mode,
"Analog input mode:\n"
" 0 = four single ended inputs\n"
" 1 = three differential inputs\n"
" 2 = single ended and differential mixed\n"
" 3 = two differential inputs\n");

创建i2c device

查看i2c总线上的设备。 在使用中的0x68为RTC. 0x48为PCF8591

pi@raspberrypi:~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

创建设备

pi@raspberrypi:/sys/class/i2c-adapter/i2c-1 $ echo pcf8591 0x48 | sudo tee new_device
pcf8591 0x48
pi@raspberrypi:/sys/class/i2c-adapter/i2c-1 $ ls
1-0048 delete_device i2c-dev new_device power uevent
1-0068 device name of_node subsystem

再次查看总线,可以看到0x48设置为UU, 表示在使用中

pi@raspberrypi:/sys/class/i2c-adapter/i2c-1 $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

查看

pi@raspberrypi:/sys/class/i2c-adapter/i2c-1/1-0048 $ ls
driver in0_input in2_input modalias out0_enable power uevent
hwmon in1_input in3_input name out0_output subsystem

/sys Interface

The PCF8591 is plainly impossible to detect! Thus the driver won’t

even try. You have to explicitly instantiate the device at the

relevant address (in the interval [0x48..0x4f]) either through

platform data, or using the sysfs interface. See

Documentation/i2c/instantiating-devices for details.

Directories are being created for each instantiated PCF8591:

/sys/bus/i2c/devices/<0>-<1>/ where <0> is the bus the chip is

connected to (e. g. i2c-0) and <1> the chip address ([48..4f])

Inside these directories, there are such files: in0_input, in1_input,

in2_input, in3_input, out0_enable, out0_output, name

Name contains chip name.

The in0_input, in1_input, in2_input and in3_input files are RO.

Reading gives the value of the corresponding channel. Depending on the

current analog inputs configuration, files in2_input and in3_input may

not exist. Values range from 0 to 255 for single ended inputs and -128

to +127 for differential inputs (8-bit ADC).

The out0_enable file is RW. Reading gives “1” for analog output

enabled and “0” for analog output disabled. Writing accepts “0” and

“1” accordingly.

The out0_output file is RW. Writing a number between 0 and 255 (8-bit

DAC), send the value to the digital-to-analog converter. Note that a

voltage will only appears on AOUT pin if aout0_enable equals 1.

Reading returns the last value written.

Reference

https://www.kernel.org/doc/Documentation/hwmon/pcf8591

树梅派 -- 通过/sys读写ADC芯片 pcf8591的更多相关文章

  1. 树梅派配置ad-hoc网络

    树梅派配置ad-hoc网络 更新与安装 1.更改源/etc/apt/source.list: http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian ...

  2. 树梅派(Raspberry Pi 3b)安装kali linux 2.0

    最近终于入手了一枚树梅派3B,忘记是什么时候到手了,买回来,也没有激动无比,也没有心情澎湃,也就扔到床头,并没有像以前超想拥有的感觉,像是失去了对这些东西都兴趣,没有以前那么强烈了,对于这些对信仰有些 ...

  3. ARM裸板开发:07_IIC 通过IIC总线接口读写时钟芯片时间参数实现的总结

    问题一:程序直接在iRAM内部可正常执行,而程序搬移(Nand ->SDRAM)之后,就不能正常运行了 #define NAND_SECTOR_SIZE 2048 /* 读函数 */ void ...

  4. 树梅派3B kali2.0 启用SSH进行远程登录

    工具/原料 kali 2.0 ssh SSH连接工具(XShell)or PUTTY vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉, ...

  5. 对ADC(DAC)的线性度(INL和DNL)的一点理解 [转]

    大家在使用ADC的时候,往往最关注位数,而对ADC的线性度往往会忽略. 其实这个线性度也是ADC非常重要的指标,ADC(或DAC,其实ADC也是由DAC组成的)线性度指标有两个: INL:翻译过来叫“ ...

  6. DSP基础学习-ADC同步采样

    DSP基础学习-ADC同步采样 彭会锋 2015-04-28 20:31:06 在DSP28027 LauchPad学习过程中,关于ADC同步采样和顺序采样的区别稍加研究了一下,发现里面还真有些门道, ...

  7. (转载)高速ADC的关键指标:量化误差、offset/gain error、DNL、INL、ENOB、分辨率、RMS、SFDR、THD、SINAD、dBFS、TWO-TONE IMD

    (一)一个基本概念 分贝(dB):按照对数定义的一个幅度单位.对于电压值,dB以20log(VA/VB)给出:对于功率值,以10log(PA/PB)给出.dBc是相对于一个载波信号的dB值:dBm是相 ...

  8. MySQL的B树索引与索引优化

    MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  9. FPGA高速ADC接口实战——250MSPS采样率ADC9481

    一.前言 最近忙于硕士毕业设计和论文,没有太多时间编写博客,现总结下之前在某个项目中用到的一个高速ADC接口设计部分.ADC这一器件经常用于无线通信.传感.测试测量等领域.目前数字系统对高速数据采集的 ...

随机推荐

  1. weui button的使用

    1.迷你按钮的使用 <a href="javascript:;" class="weui-btn weui-btn_primary weui-btn_mini&qu ...

  2. 第四篇 .NET高级技术之结构体及值类型引用类型

    结构体 在平时的开发中很少自己去写结构体,他是一种值类型的数据.对于结构,不像类那样存在继承,一个结构体不能从另一个结构或类继承.但是结构体从基类Object继承. 语法: //struct是定义结构 ...

  3. Qt文本读写之一:输入输出设备和文件操作

    一.输入输出设备 QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile.QBuffer和 QTcpSocket等支持读/写数据块的设备提供了一个抽象接口.QIODevice类是抽象 ...

  4. [NOIP2018校模拟赛]T1 阶乘

    题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...

  5. Jumping on Walls CodeForces - 198B

    Jumping on Walls CodeForces - 198B 应该是一个隐式图的bfs,或者叫dp. 先是一个TLE的O(nklogn) #include<cstdio> #inc ...

  6. POJ 1692 Crossed Matchings dp[][] 比较有意思的dp

    http://poj.org/problem?id=1692 这题看完题后就觉得我肯定不会的了,但是题解却很好理解.- - ,做题阴影吗 所以我还是需要多思考. 题目是给定两个数组,要求找出最大匹配数 ...

  7. collection接口的实现:set,list,queue

    在java.util包中提供了一些集合类,常用的有List.Set和Map类,其中List类和Set类继承了Collection接口.这些集合类又称为容器,长度是可变的,数组用来存放基本数据类型的数据 ...

  8. Unity3d的Sprite Packer用法介绍

    我们用来做sprite 的图片,通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了.如果想避免这些资源上的浪费,我们可以把各个sprite做成图集,把图片上的空间尽 ...

  9. spring boot jar启动

    1.依赖包输出 记得禁用热加载 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactI ...

  10. calc() 计算CSS属性值

    calc()是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pading.font-size和width等属性设置动态值.calc() ...