精华内容
下载资源
问答
  • Python Smbus库简介

    2021-12-16 10:36:31
    因此想要用树莓派调一下这个模块,于是找了下树莓派控制模块的文章,发现都是从smbus的read byte封装的,可是按照I2C协议一次肯定可以读多个数据,于是想找库函数文档看下,发现Py官网文档上smbus库没有函数描述,但...

    背景

    手头有个树莓派,又有个I2C通信的模块,因此想要用树莓派调一下这个模块,于是找了下树莓派控制模块的文章,发现都是从smbus的read byte封装的,可是按照I2C协议一次肯定可以读多个数据,于是想找库函数文档看下,发现Py官网文档上smbus没有函数描述,但找到了语法与其相同的smbus2, 于是记录下库函数用法。不过找到了smbus的源码, 源码中有函数接口。

    结果

    smbus支持的函数列表:

    static PyMethodDef SMBus_methods[] = {
    	{"open", (PyCFunction)SMBus_open, METH_VARARGS | METH_KEYWORDS,
    		SMBus_open_doc},
    	{"close", (PyCFunction)SMBus_close, METH_NOARGS,
    		SMBus_close_doc},
    	{"write_quick", (PyCFunction)SMBus_write_quick, METH_VARARGS,
    		SMBus_write_quick_doc},
    	{"read_byte", (PyCFunction)SMBus_read_byte, METH_VARARGS,
    		SMBus_read_byte_doc},
    	{"write_byte", (PyCFunction)SMBus_write_byte, METH_VARARGS,
    		SMBus_write_byte_doc},
    	{"read_byte_data", (PyCFunction)SMBus_read_byte_data, METH_VARARGS,
    		SMBus_read_byte_data_doc},
    	{"write_byte_data", (PyCFunction)SMBus_write_byte_data, METH_VARARGS,
    		SMBus_write_byte_data_doc},
    	{"read_word_data", (PyCFunction)SMBus_read_word_data, METH_VARARGS,
    		SMBus_read_word_data_doc},
    	{"write_word_data", (PyCFunction)SMBus_write_word_data, METH_VARARGS,
    		SMBus_write_word_data_doc},
    	{"process_call", (PyCFunction)SMBus_process_call, METH_VARARGS,
    		SMBus_process_call_doc},
    	{"read_block_data", (PyCFunction)SMBus_read_block_data, METH_VARARGS,
    		SMBus_read_block_data_doc},
    	{"write_block_data", (PyCFunction)SMBus_write_block_data, METH_VARARGS,
    		SMBus_write_block_data_doc},
    	{"block_process_call", (PyCFunction)SMBus_block_process_call,
    		METH_VARARGS, SMBus_block_process_call_doc},
    	{"read_i2c_block_data", (PyCFunction)SMBus_read_i2c_block_data,
    		METH_VARARGS, SMBus_read_i2c_block_data_doc},
    	{"write_i2c_block_data", (PyCFunction)SMBus_write_i2c_block_data,
    		METH_VARARGS, SMBus_write_i2c_block_data_doc},
    	{NULL},
    };
    

    该函数库是C库,smbus2是纯python库;

    用法

    常用函数用法介绍及示例:

    1. 读单字节;
      from smbus import SMBus
      
      # Open i2c bus 1 and read one byte from address 80, offset 0
      bus = SMBus(1)
      b = bus.read_byte_data(80, 0)
      print(b)
      bus.close()
      
      上面的代码如果句柄忘记了关闭,存在安全性风险, 可以使用with语句进行自动释放资源:
      from smbus import SMBus
      
      with SMBus(1) as bus:
          b = bus.read_byte_data(80, 0)
          print(b)
      
      更进一步可以打开包错误校验(Packet Error Checking, PEC):
      from smbus import SMBus
      
      with SMBus(1) as bus:
          bus.pec = 1  # Enable PEC
          b = bus.read_byte_data(80, 0)
          print(b)
      
    2. 读取一块数据
      from smbus import SMBus
      
      with SMBus(1) as bus:
          # Read a block of 16 bytes from address 80, offset 0
          block = bus.read_i2c_block_data(80, 0, 16)
          # Returned value is a list of 16 bytes
          print(block)
      
      一次最多可以读取32字节;
    3. 写入一个字节
      from smbus import SMBus
      
      with SMBus(1) as bus:
          # Write a byte to address 80, offset 0
          data = 45
          bus.write_byte_data(80, 0, data)
      
    4. 写入一块数据
      from smbus import SMBus
      
      with SMBus(1) as bus:
          # Write a block of 8 bytes to address 80 from offset 0
          data = [1, 2, 3, 4, 5, 6, 7, 8]
          bus.write_i2c_block_data(80, 0, data)
      
      一次最多写入32字节;

    参考文档

    1. smbus2-project description
    2. smbus源码;
    3. 树莓派(Raspberry Pi)python smbus 函数说明
    展开全文
  • 刚开始学习树莓派,在使用I2C接口时遇到了一些问题,比如不了解smbus有那些函数和这些函数的使用方法,网上找了很久也没有找到具体说明smbus函数的文档,现将我整理的一些说明资料归档如下,一方面便于自己后期学习...

    刚开始学习树莓派,在使用I2C接口时遇到了一些问题,比如不了解smbus有那些函数和这些函数的使用方法,网上找了很久也没有找到具体说明smbus函数的文档,现将我整理的一些说明资料归档如下,一方面便于自己后期学习,二方面便于刚接触树莓派,想要更深入学习I2C接口功能的朋友们,希望对大家有所帮助:

           使用方法:

    首先在程序中导入“smbus”模块,方法如下:

    #导入方法一:
    import smbus
    
    #导入方法二:
    from smbus import SMBus
    
    #创建一个smbus实例
    b = smbus.SMBus(1)
    
    b = SMBus(1)    # 0 代表 /dev/i2c-0, 1 代表 /dev/i2c-1
                    #具体看使用的树莓派那个I2C来决定。
    
    #实例创建好了就可以使用i2c函数了
    b.read_byte_data(0x2f,0x58)
    

     

     

    function

    description

    parameters

    return value

     

                                                                                    SMBus Access

     

    write_quick (addr)

    Quick transaction.

    int addr

    long

     

    read_byte (addr)

    Read Byte transaction.

    int addr

    long

     

    write_byte (addr, val)

    Write Byte transaction.

    int addr, char val

    long

     

    read_byte_data (addr, cmd)

    Read Byte Data transaction.

    int addr, char cmd

    long

     

    write_byte_data (addr, cmd, val)

    Write Byte Data transaction.

    int addr, char cmd, char val

    long

     

    read_word_data (addr, cmd)

    Read Word Data transaction.

    int addr, char cmd

    long

     

    write_word_data (addr, cmd, val)

    Write Word Data transaction.

    int addr, char cmd, int val

    long

     

    process_call (addr, cmd, val)

    Process Call transaction.

    int addr, char cmd, int val

    long

     

    read_block_data (addr, cmd)

    Read Block Data transaction.

    int addr, char cmd

    long [ ]

     

    write_block_data (addr, cmd, vals)

    Write Block Data transaction.

    int addr, char cmd, long [ ]

    None

     

    block_process_call (addr, cmd, vals)

    Block Process Call transaction.

    int addr, char cmd, long [ ]

    long [ ]

     

                                                                                     I2C Access

     

    read_i2c_block_data (addr, cmd)

    Block Read transaction.

    int addr, char cmd

    long [ ]

     

    write_i2c_block_data (addr, cmd, vals)

    Block Write transaction.

    int addr, char cmd, long [ ]

    None

    函数介绍:

    Checking For Connected Devices

    At the command prompt type one of these depending on whether you are using the I2C0 or I2C1 port: 

    sudo i2cdetect -y 0
    //or
    sudo i2cdetect -y 1
    

    The 7 bit I2C address of all found devices will be shown (ignoring the R/W bit, so I2C address 0000 0110 is displayed as hex 03).

    SMBus (System Management Bus) is a subset from the I2C protocol
    When writing a driver for an I2C device try to use the SMBus commands if possible (if the device uses only that subset of the I2C protocol) as it makes it possible to use the device driver on both SMBus adapters and I2C adapters.

    Note address is the 7 bit address excluding the read / write bit (it will be shifted left 1 bit when added to the read/write bit)

    # Send only the read / write bit 
    long write_quick(int addr)
    
    # Read a single byte from a device, without specifying a device register. 
    long read_byte(int addr)
    
    # Send a single byte to a device 
    long write_byte(int addr, char val)
    
    # Read Byte Data transaction. 
    long read_byte_data(int addr, char cmd)
    
    # Write Byte Data transaction. 
    long write_byte_data(int addr, char cmd, char val)
    
    # Read Word Data transaction. 
    long read_word_data(int addr, char cmd)
    
    # Write Word Data transaction. 
    long write_word_data(int addr, char cmd, int val)
    
    # Process Call transaction. 
    long process_call(int addr, char cmd, int val)
    
    #Read Block Data transaction.  
    long[] read_block_data(int addr, char cmd)
        
    # Write up to 32 bytes to a device.  This fucntion adds an initial byte indicating the 
    # length of the vals array before the valls array.  Use write_i2c_block_data instead! 
    write_block_data(int addr,char cmd,long vals[])
    
    # Block Process Call transaction.  
    long[] block_process_call(int addr, char cmd, long vals[])
     
       
    # I2C Access Functions
    # Block Read transaction. 
    long[] read_i2c_block_data(int addr, char cmd)
    
    #Block Write transaction. 
    write_i2c_block_data(int addr, char cmd, long vals[])
    
    
    #Code Example
    
    #!/usr/bin/python
    
    import smbus
    
    bus = smbus.SMBus(1)    # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
    
    DEVICE_ADDRESS = 0x15      #7 bit address (will be left shifted to add the read write bit)
    DEVICE_REG_MODE1 = 0x00
    DEVICE_REG_LEDOUT0 = 0x1d
    
    #Write a single register
    bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, 0x80)
    
    #Write an array of registers
    ledout_values = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
    bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT0, ledout_values)
    

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     
     
    展开全文
  • 树莓派学习笔记——I2C使用 PCF8574 Python SMBUS

    万次阅读 热门讨论 2014-01-18 15:05:28
    如果使用python+SMBUS库开发的话,你会发现Linux应用开发原来如此简单。(注意SMBUS和I2C存在区别与联系,在本文中两者是相等的概念) 2.相关博文  【 树莓派学习笔记——I2C设备载入和速率设置 】  【 树莓派学习...

    1.前言

        树莓派的GPIO端口数量有限,可通过IO扩展芯片增加GPIO的数量,使得树莓派可以适应更多的应用。PCF8574为一款通过I2C总线扩展IO的芯片,单个PCF8574可扩展8个IO,一个I2C总线最多可挂载8个PCF8574,所以树莓派最多可扩展64个IO。
        树莓派扩展功能的开发方法有很多,例如wiringPi和bcm2835 C library都提供I2C API函数。如果使用python+SMBUS库开发的话,你会发现Linux应用开发原来如此简单。(注意SMBUS和I2C存在区别与联系,在本文中两者是相等的概念)

    2.相关博文

        【树莓派学习笔记——I2C PCF8574 BCM2835 Library】使用BCM2835 Library实现本文相同的内容
        【树莓派学习笔记——I2C PCF8574 SysFs方式】使用SysFS方式实现本文相同的内容

    3.PCF8574使用简述

        PCF8574的采用7位I2C地址,7位I2C地址中的低3位从高到低分别为A2 A1和A0,该3位为地址选择位,若地址选择全部接GND,那么PCF8574的I2C从机地址为0x20。图1为PCF8574的基本信息,左侧为芯片内部结构示意图,其中A2 A1和A0决定从机地址而从机地址直接影响I2C总线控制器,右侧上部为PCF8574引脚图,右侧下部为I2C从机地址组成示意图,从机地址的高4位为0100,该4位数字固定不变。

    图1 PCF8574基本信息
        请注意I2C 7位从机地址和I2C 读控制字或i2C写控制器存在联系与区别,对于7位从机地址为0x20的PCF8574而言,读控制字为0x41,写控制字为0x40。若使用GPIO通过软件法模拟I2C时序时,通常把写控制字0x40定义为I2C从机地址,软件模拟时的I2C地址(0x40)和I2C 7位从机地址(0x41)存在区别。
        PCF8574内部含有8个准双向IO,对PCF8574进行一次写操作可修改IO口的输出状态,对PCF8574进行一次读操作可获取IO口的输入状态。I2C总线的操作较为复杂,各芯片之间的差异较大,例如BH1750、AT24C04和ADXL345虽然均使用I2C接口,但是细节之处存在差异较大。

    图2 PCF8574读写时序


    4.代码实现——python

        【安装python smbus】
        sudo apt-get install python-smbus    

        新建一个名为pcf8574.py的文件
    #!/usr/bin/env python  
    # -*- coding: utf-8 -*-
    
    import smbus
    import time
    
    # 打开 /dev/i2c-1
    bus = smbus.SMBus(1)
     
    while True:
      for i in range(0,4):
    	# 向PCF8574写入一个字节
    	bus.write_byte( 0x20 , (1<<i) )
    	# 延时100ms
    	time.sleep(0.1)

    【代码详解】
        【1】#!/usr/bin/env python
        定义python解析脚本的绝对路径。
        
        【2】# -*- coding: utf-8 -*-
        py文件为utf-8格式,否则无法写入中文注释。

        【3】import smbus
        导入smbus模块。

        【4】bus = smbus.SMBus(1)
        在树莓派版本2中,I2C设备位于I2C-1,所以此处的编号为1

        【5】bus.write_byte( 0x20 , (1<<i) )
        向PCF8574写入一个字节,注意PCF8574和其他I2C芯片不同,该芯片没有寄存器,发送写控制字之后可直接设置IO口输出状态。
        
       【执行程序】
        进入pcf8574.py所在目录,输入以下指令
        sudo python pcf8574.py

       【运行结果】

    图3 运行结果

    5.参考资料
    python SMBUS GitHub】python封装SMBUS操作函数具体代码,值得阅读。

    展开全文
  • 从类型上说,SMBus协议可看成是I2C总线协议的子类,采用Python语言访问I2C设备可直接使用SMBUS库/SMBUS模块。 1. 启动RPi串行I2C接口及安装Python SMBus库 默认情况下,I2C总线是禁止使用的,我们可以在Linux终端用...

    目录

    一、I2C接口技术

    1. I2C总线系统组成

    2. I2C总线的状态及信号

    3. I2C总线基本操作

    4. 启动和停止条件

    5. I2C总线数据传输格式

    二、I2C总线上拉电阻的估算与选取

    三、树莓派与AT24C02接口实验电路及Python SMBus串行I2C EEPROM应用编程

    1. 启动RPi串行I2C接口及安装Python SMBus库

    2. 树莓派与AT24C02 EEPROM接口实验电路

    3. Python SMBus库函数介绍

    4. 使用I2C Tools及Python SMBus读写AT24C02 EEPROM


    一、I2C接口技术

    I2C接口是嵌入式系统中常用的网络接口之一,它采用串行通信方式将MCU/传感器连接到系统总线,通过主机/从机的方式协调工作。

    I2C/IIC(Inter-Integrated Circuit)总线是由PHILIPS公司于1982年针对MCU/传感器等应用需求而研制的一种两线式串行总线,用于连接MCU及传感器等设备。

    I2C总线的主要特点如下:

    (1)I2C总线最主要的优点是其简单性和有效性。

    (2)由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。

    (3)I2C总线的长度可高达25英尺(约7.6m),并且能够以标准模式100Kbps的传输速率支持40个组件。新一代I2C总线还支持高速模式400Kbps传输。

    (4)I2C总线的另一个优点是支持多主控(multi-mastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号传输和时钟频率。当然,在任何时间点上只能有一个主控。

    1. I2C总线系统组成

    I2C总线协议包含两层协议:物理层和数据链路层。

    在物理层,I2C总线仅使用了两条信号线:一个是串行数据线SDA (Serial DAta line),它用于数据的发送和接收;另一个是串行时钟线SCL (Serial Clock Line)构成的串行总线,它用于指示何时数据线上是有效数据,即数据同步。MCU与被控IC之间、IC与IC之间进行双向传送,I2C标准模式最大传送速率为100kbps,I2C快速模式最大传输速率为400kbps。

    在数据链路层,每个连接到I2C总线上的设备都有唯一的地址,设备的地址由系统设计者决定。在信息的传输过程中,I2C总线上并接的每一设备既是主设备(或从设备)又是发送器(或接收器),这取决于它所要完成的功能。

    由I2C总线所构成的系统可以有多个I2C节点设备,并且可以是多主系统,任何一个设备都可以为主I2C;但是任一时刻只能有一个主I2C设备,I2C具有总线仲裁功能,以保证系统正确运行。主I2C设备发出时钟信号、地址信号和控制信号,选择通信的从I2C设备并控制收发。

    I2C总线要求:(1)各个节点设备必须具有I2C接口功能;(2)各个节点设备必须共地;(3)两根信号线必须接上拉电阻Rp。如图1所示。

    图1 多I2C设备接口示意图



     

    2. I2C总线的状态及信号

    (1)空闲状态

    SCL和SDA均处于高电平状态,即为总线空闲状态(空闲状态为何是高电平的道理很简单,因为它们都接上拉电阻)。

    (2)占有总线和释放总线

    若想让器件使用总线应当先占有它,占有总线的主控器向SCL线发出时钟信号。数据传送完成后应当及时释放总线,即解除对总线的控制(或占有),使其恢复成空闲状态。

    (3)启动信号[S]

    启动信号由主控器产生。在SCL信号为高时,SDA产生一个由高变低的电平变化,产生启动信号。

    (4)结束/停止信号[P]

    当SCL线高电平时,主控器在SDA线上产生一个由低电平向高电平跳变,产生停止信号。启动信号和停止信号的产生见图2所示。

    在这里插入图片描述
    图2 启动信号和停止信号的产生

     

    (5)应答/响应信号[A/NA]

    应答信号是对字节数据传输的确认。应答信号占1位,数据接收者接收1字节数据后,应向数据发出者发送一个应答信号。对应于SCL第9个应答时钟脉冲,若SDA线仍保持高电平,则为非应答信号(NA/ACK)。低电平为应答,继续发送;高电平为非应答,结束发送。

    (6)控制位信号[R/nW]

    控制位信号占1位,IIC主机发出的读写控制信号,高为读、低为写(对IIC主机而言)。控制位(或方向位)在寻址字节中给出。

    (7)地址信号

    地址信号为从机地址,占7位,称之为“寻址字节”(见表1)。
     

    在这里插入图片描述
    表1 寻址字节

     

    下面对表1中的各字段进行说明。

    器件地址(DA3-DA0):DA3-DA0是I2C总线接口器件固有的地址编码,由器件生产厂家给定,如AT24C××I2C总线EEPROM器件的地址为1010等。

    引脚地址(A2、A1、A0):引脚地址由I2C总线接口器件的地址引脚A2、A1、A0的高低来确定,接高电平者为1,接地者为0。

    读写控制位/方向位(R/n W):R/nW为1表示主机读,R/nW为0表示主机写。

    7位地址和读写控制位组成1个字节,即寻址字节。

    (8)等待状态

    在IIC总线中,赋予接收数据的器件具有使系统进行等待状态的权力,但等待状态只能在一个数据字节完整接收之后进行。例如,当进行主机发送从机接收的数据传送操作时,若从机在接收到一个数据字节后,由于中断处理等原因而不能按时接收下一个字节;从机可以通过把SCL下拉为低电平,强行使主机进入等待状态;在等待状态下,主机不能发送数据,直到从机认为自己能继续接收数据时,再释放SCL线,使系统退出等待状态,主机才可以继续进行后续的数据传送。
     

    3. I2C总线基本操作

    (1)串行数据线SDA和串行时钟线SCL在连接到总线的器件间传递信息。

    (2)每个器件都有一个唯一的地址标识,无论是MCU、LCD驱动器、存储器或键盘接口。

    (3)每个器件都可以作为一个发送器或接收器,由器件的功能决定。显然,LCD驱动器只是一个接收器,而存储器则既可以接收又可以发送数据。

    (4)除了将器件看作发送器和接收器外,在执行数据传输时它也可以被看作是主机或从机。

    (5)主机是初始化总线的数据传输并产生允许传输时钟信号的器件,此时任何被寻址的器件都被看作是从机。
     

    4. 启动和停止条件

    在SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况称为启动条件。当SCL是高电平时,SDA 线由低电平向高电平切换,称为停止条件。

    启动和停止条件一般由主机产生。总线在启动条件后被认为处于忙的状态,在停止条件的某段时间后,总线被认为再次处于空闲状态。如果产生重复启动条件Sr而不产生停止条件P,总线将一直处于忙状态。
     

    5. I2C总线数据传输格式

    I2C总线数据传输格式见图3所示。在图3中,S为启动信号,R/nW为读写控制位,A/NA为应答信号,P为停止信号。

    在这里插入图片描述
    图3 I2C总线数据传输格式



     

    二、I2C总线上拉电阻的估算与选取

    由于I2C设备的SCL、SDA总线是漏极开路的,因此在前面的图1中, I2C总线的SCL、SDA引脚必须外接上拉电阻Rp。

    一般I2C的上拉电阻Rp在1 kΩ∽10 kΩ之间选取,如,Rp可以取1.5kΩ、1.8kΩ、2.2kΩ、4.7kΩ、5.1kΩ、6.8kΩ、10kΩ等典型值,上拉电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响。

    I2C上拉电阻Rp选取估算公式如下:

    Rpmin={VDD(min)-0.4V}/3mA
    Rpmax=(T/0.874) *C (T=1us, 100KHz; T=0.3us, 400KHz)

    C是总线电容(Bus Capacitance)或总线负载电容。

    Rp最大值由总线电容最大值CBmax决定,Rp最小值由VIO(VDD)与上拉驱动电流(设最大值为3mA)决定;

    关于Rpmin的取值:在5V供电的嵌入式系统中,有Rpmin=5V/3mA≈1.7kΩ;在3.3V供电的嵌入式系统中,有Rpmin=3.3V/3mA=1.1kΩ;在2.8V供电的嵌入式系统中,有Rpmin=2.8V/3mA≈1kΩ。

    关于Rpmax的取值:在I2C标准模式下,100Kbps总线负载电容最大值<=400pF;在I2C快速模式下,400Kbps总线的负载电容最大值<=200pF。根据具体的使用场景、当前的器件制造工艺、PCB的走线距离等因素以及标准向下兼容性,设计中以I2C快速模式为基础,即总线负载电容<200pF时,传输速度达到400Kbps是不成问题的,现按5V供电系统对应于50pF∽200pF估算,有Rpmax取值范围是1.7kΩ∽6.9kΩ。根据Rpmin与Rpmax的限制范围,在5V供电的嵌入式系统中,可取Rp=5.1kΩ, 总线负载电容的环境要求也容易达到;在3.3V供电的嵌入式系统中,可选Rp=1.8kΩ∽4.7kΩ;在2.8V供电的嵌入式系统中,控制台应用可选Rp=1.5kΩ∽2.2kΩ,可穿戴式或便携式等低供耗应用可选Rp=4.7kΩ牺牲速度来换取电池使用时间。总之,电源电压限制了上拉电阻Rp的最小值;总线负载电容(总线电容)限制了上拉电阻Rp的最大值。
     

    三、树莓派与AT24C02接口实验电路及Python SMBus串行I2C EEPROM应用编程

    如果使用树莓派I2C总线控制外设或传感器,则树莓派一般工作于主机模式。树莓派I2C总线遵守SMBus(System Management Bus,系统管理总线)协议。从类型上说,SMBus协议可看成是I2C总线协议的子类,采用Python语言访问I2C设备可直接使用SMBUS库/SMBUS模块。
     

    1. 启动RPi串行I2C接口及安装Python SMBus库

    默认情况下,I2C总线是禁止使用的,我们可以在Linux终端用raspi-config工具启动IC2接口,运行raspi-config工具命令如下:

    $ sudo raspi-config

    运行后按菜单提示,即可启动I2C接口。

    另一种启动I2C接口的方法是在Preferences的主菜单中找到Raspberry Pi Configuration工具启动I2C接口。

    安装Python的I2C库SMBus的方法是输入以下命令:

    $ sudo apt-get install python-smbus

    为了使这些修改有效,需要重新引导树莓派。
     

    2. 树莓派与AT24C02 EEPROM接口实验电路

    以树莓派3B为例,RPi 3B与AT24C02 EEPROM接口实验电路原理图见图4所示。由图4可知,RPi 3B串行I2C总线自带1.8kΩ上拉电阻,因此,RPi 3B串行I2C总线与AT24C02接口无需再外接上拉电阻。需要强调的是,是否在I2C总线外接上拉电阻,要看所使用的开发板是否自带I2C总线上拉电阻;若开发板没有提供I2C总线上拉电阻,则需按前面的I2C总线上拉电阻估算方法外接两个上拉电阻Rp。

    在这里插入图片描述
    图4 RPi 3B与AT24C02 EEPROM接口实验电路原理图

     

    为方便起见,这里使用面包板搭建RPI 3B与AT24C02接口实验电路,ATC24C02的VCC与RPi 3B的3.3V电源Pin1物理引脚连接,GND与RPI 3B的GND接地引脚Pin14连接,SCL与RPI 3B的I2C-1串行时钟线SCL.1的Pin14物理引脚连接,SCL与RPI 3B的I2C-1串行数据线SDA.1的Pin3物理引脚连接。这里,地址线A0、A1、A2都接地,查看AT24C02器件手册可知,在此配置下,I2C设备AT24C02地址是0x50 (注意:树莓派中的I2C设备地址计算是根据I2C器件的实际寻址地址0b1010A2A1A0得出的,故AT24C02设备寻址地址为0b1010000=0x50;如果按I2C器件手册中给出的带读写控制位的寻址地址字节为0b1010A2A1A0R/nW,即写I2C器件寻址地址为0xa0, 读I2C器件寻址地址为0xa1), 写保护WP接地,这样树莓派就能正常读写I2C设备了。实验接口电路连接好后,建议先用万用表检查接口连线是否正确(特别注意电源和地之间不能短路),然后再开机启动树莓派对AT24C02器件进行读写操作(见图5)。

    在这里插入图片描述
    图5 RPI 3B与AT24C02接口实验电路接线图


     

    3. Python SMBus库函数介绍

    在树莓派中,我们可用Python SMBus库函数访问串行I2C设备,导入SMBus模块及常用SMBus库函数介绍如下。

    (1) Import SMBus
    ●To access I2C bus on Raspberry Pi using SMBus Python module, import SMBus module as follows.
    import smbus
    ●Create object of SMBus class to access I2C based Python function.
    = smbus.SMBus(I2C port no.)
    I2C port no : I2C port no. i.e. 0 or 1
    ●Example - Bus = smbus.SMBus(1)
    Now, we can access SMBus class with Bus object.

    (2) Bus.write_byte_data(Device Address, Register Address, Value)
    ●This function is used to write data to the required register.
    Device Address : 7-bit or 10-bit device address
    Register Address : Register address to which we need to write
    Value : pass value which needs to write into the register
    ●Example - Bus.write_byte_data(0x68, 0x01, 0x07)

    (3) Bus.write_i2c_block_data(Device Address, Register Address, [value1, value2,….])
    ●This function is used to write a block of 32 bytes.
    Device Address : 7-bit or 10-bit device address
    Register Address : Register address to which we need to write data
    Value1 Value2…. : write a block of bytes to the required address
    ●Example - Bus.write_i2c_block_data(0x68, 0x00, [0, 1, 2, 3, 4, 5]) # write 6 bytes of data from 0 address.

    (4) Bus.read_byte_data(Device Address, Register Address)
    ●This function is used to read data byte from required register.
    Device Address : 7-bit or 10-bit device address
    Register Address : Register address from which we need to read data
    ●Example - Bus.read_byte_data (0x68, 0x01)

    (5) Bus.read_i2c_block_data(Device Address, Register Address, block of bytes)
    ●This function is used to read a block of 32 bytes.
    Device Address – 7-bit or 10-bit device address
    Register Address – Register address from which we need to read data
    Block of Bytes – read no of bytes from the required address
    ●Example - Bus.read_i2c_block_data(0x68, 0x00, 8) # return value is a list of 6 bytes
     

    4. 使用I2C Tools及Python SMBus读写AT24C02 EEPROM

    在树莓派终端输入以下命令,安装I2C Tools:

    pi@yuanzy:~ $ sudo apt-get install i2c-tools

    接下来,针对图4的实验接口电路,用 I2C Tools 命令对AT24C02基本读写操作功能进行检验。在下面的I2C Tools各命令中, I2C使用树莓派的 I2C-1(SCL.1, SDA.1),AT24C02设备地址为0x50。

    pi@yuanzy:~ $ sudo i2cdetect -l
    i2c-1 i2c bcm2835 I2C adapter
    pi@yuanzy:~ $ sudo i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: – -- – -- – -- – -- – -- – -- –
    10: – -- – -- – -- – -- – -- – -- – -- – --
    20: – -- – -- – -- – -- – -- – -- – -- – --
    30: – -- – -- – -- – -- – -- – -- – -- – --
    40: – -- – -- – -- – -- – -- – -- – -- – --
    50: 50 51 – -- – -- – -- – -- – -- – -- – --
    60: – -- – -- – -- – -- – -- – -- – -- – --
    70: – -- – -- – -- – --
    pi@yuanzy:~ $ sudo i2cdump -y 1 0x50
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …

    以上i2cdump显示了AT24C02设备所有字节单元的内容,因为是新购置芯片,故其256个字节单元为全1或0xff(即芯片内容为空)。

    pi@yuanzy:~ $ sudo i2cset -y 1 0x50 0x00 0x60
    pi@yuanzy:~ $ sudo i2cget -y 1 0x50 0x00
    0x60

    上面使用i2cset命令向AT24C02设备0#字节单元写入0x60,i2cget 读取AT24C02设备0#字节单元内容显示为0x60,说明写入的数据与读取的数据一致,树莓派读写AT24C02设备操作正常。

    下面是用Python和Python SMBus库函数编写名为I2CAT24C02.py的程序向AT24C02器件256字节单元顺序写入0~255,然后再顺序读取AT24C02中的字节单元并显示输出,程序清单见图6所示。

    在这里插入图片描述
    图6 读写AT24C02 I2C EEPROM Python程序

     

    I2CAT24C02.py程序顺序读取AT24C02中的256字节单元显示结果见图7所示。

    在这里插入图片描述
    图7 Python程序读取AT24C02设备256字节单元的内容并显示


     

    还可使用I2C Tools的i2cdump命令显示AT24C02中的256字节单元内容(见图8)。由图7和图8可知,读取AT24C02设备字节单元内容的显示结果与写入到AT24C02设备字节单元的数据完全相同。
     

    在这里插入图片描述
    图8 i2cdump命令显示AT24C02设备256字节单元的内容
    展开全文
  • 文章目录 一、I2C接口技术 1.I2C总线系统组成 ...1.启动RPi串行I2C接口及安装Python SMBus库 2. 树莓派与AT24C02 EEPROM接口实验电路 3. Python SMBus库函数介绍 4. 使用I2C Tools及Python SMBus读写AT2
  • 通过pip3直接去下载有些第三方的时候会超时失败 报错如: HTTPSConnectionPool(host=’files.pythonhosted.org’, port=443): Read timed out 解决办法1 延长超时时间: pip –default-timeout=100 install -U 你...
  • python IIC -- smbus2 https://pypi.org/project/smbus2/ 安装smbus2 pip install smbus2 1. 导入模块,实例化 from smbus2 import SMBus i2c = SMBus(1) # 1 代表 /dev/i2c-1 2. 当前支持的功能 获取i2c功能(I2C_...
  • 一个Python库,用于使用I2C接口通过python-smbus从Bosch访问。 默认设置适用于Raspberry Pi 2和3,并已使用成功进行了测试。 我以例如或样式创建了这个Python库,因为我发现只有功能有限的和较小的错误,而Bosch...
  • 适用于I2C设备的Python驱动程序 该存储包含各种Sensirion传感器驱动程序使用的通用I2C驱动程序。有关详细信息,请阅读的软件包说明。 用法 请参阅软件包描述和用户手册。 发展 我们使用公司内部工具(版本控制,...
  • Python i2c write_bus_data用法

    千次阅读 2021-02-05 11:32:58
    我想我正在寻找这样的东西 import smbus b = smbus.SMBus(1) b.write_byte_data(0x31, 0x35, 0x30, 0x38) 我想说的是“将命令5(0x35)发送到设备0x31,数字0(0x30)并显示数字8(0x38)”但wrrite_byte_data不接受...
  • 依赖于python-smbus I2C库python-smbus 。 如果您有问题,请不要给我发电子邮件 它将被删除而不阅读。 如果您有问题,请在GitHub上。 未维护 我将不再维护该。 我将合并合并请求。 欢迎捐款。 只是不要期望我有...
  • 此存储主要集中在通过I2C通信将IMU(MPU9250)连接到树莓派的问题。 先决条件 一些要求是要在rpi中启用I2C。 安装I2C工具和smbus sudo apt-get install i2c-tools sudo pip install smbus 使用以下连接将MPU9250...
  • 为了操作Grove传感器,grove.py依赖于许多硬件接口,例如mraa / upm / smbus2。 安装 仅对于初学者或图书馆用户,请使用在线方法进行安装。 对于开发人员或高级用户,请安装,然后使用安装grove.py。 在线安装 ...
  • python常用框架及第三方一、Web框架1.Django:开源web开发框架,它鼓励快速开发,并遵循MVC设计,比较庞大,开发周期短。Django的文档最完善、市场占有率最高、招聘职位最多。全套的解决方案,Django象Rails一样,...
  • 1、wiringPilinux WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi中的函数相似于Arduino的wiring系统。... 而后对应进到文件夹内,执行安装: 安装smbus库,I2C接口库函数 安装serial库,UART接口库函数
  • 老左今天在ubuntu服务器上编译安装软件和安装的时候有出现报错,于是想着可能是Ubuntu系统镜像自带的Python版本不是最新的导致的。目前Python最新版本是3.9,所以我准备安装最新版本试试看。然后再去安装需要的...
  • essential python-dev python-pip python-smbus -y git clone git://github.com/adafruit/adafruit-beaglebone-io-python.git cd adafruit-beaglebone-io-python sudo python setup.py install cd .. ...
  • Ubuntu下安装python3需要的依赖

    千次阅读 2020-03-29 16:07:06
    1、ubuntu下安装python3,使用过程中总是会提示模块找不到,因为缺少一些三方依赖,不管辣么多,先把这些装一把,一般都能解决问题: sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo ...
  • 树莓派python驱动PCA9685

    千次阅读 2019-10-29 11:47:23
    树莓派python驱动PCA9685 1.开启iic 输入命令:sudo raspi-config 2.安装adafruit_python_pca9685 输入命令:sudo pip install adafruit-pca9685 3.示例代码: import Adafruit_PCA9685 pwm = Adafruit_PCA9685....
  • 下载:文件 复制代码 sudo apt-get install -y python-smbus sudo apt-get install -y i2c-tools sudo apt-get install -y python-smbus sudo apt-get install -y i2c-tools 安装内核支持(使用Raspi-Config) 运行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 527
精华内容 210
关键字:

pythonsmbus库

python 订阅