i2c说明及python案例(i2c程序代码)

发布时间:2022-11-14

本文目录一览:

  1. 树莓派python支持i2c吗
  2. 用I2C实现两单片机联机,接收程序怎么写?
  3. 树莓派怎么样用 Python 控制 GPIO 来发送串口指令

树莓派python支持i2c吗

树莓派的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设备载入和速率设置]
  • [树莓派学习笔记——I2C Tools 学习笔记]
  • [树莓派学习笔记——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操作函数具体代码,值得阅读。

用I2C实现两单片机联机,接收程序怎么写?

发送和接收差不多,这里是个例子,有问题欢迎一起讨论

/*****************************************************
/* 文件名 : I2C.h
/* 描述 : I2C.c的头文件
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,主机的程序
/* 应用 : 发送n个字节: 起始位-发送控制字节(类型标识符4位-片选3位-读写位最后1位)-应答位-数据-应答...........应答-终止位
高位先到达,低位后到达
****************************************************/
#include "reg51.h" /*根据不同主控芯片型号改写该套入*/
#include "intrins.h"
sbit SCL = P1^6; /*定义SCL线所在口,根据实践需要改写该定义*/
sbit SDA = P1^7; /*定义SDA线所在口,根据实践需要改写该定义*/
unsigned char idata error; /*错误提示,全局变量*/
extern void Start_I2C(void);
extern void Stop_I2C(void);
extern void Ack_I2C(void);
extern void Send_Ack(void);
extern void Send_Not_Ack(void);
extern void Send_I2C(unsigned char send_byte);
extern unsigned char Receive_I2C(void);
/*****************************************************/
/* 文件名 : I2C.c
/* 描述 : I2C通信程序
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,为主机的程序
/*****************************************************/
#include "I2C.h"
/**************************************************
调用方式 : void Start_I2C(void)
函数说明: 启动I2C总线
**************************************************/
void Start_I2C(void)
{
    EA = 0; /*关总中断*/
    SDA = 1; /*发送启动总线的数据信号*/
    SCL = 1; /*发送启动总线的时钟信号*/
    _nop_(); /*保持数据线高,延时*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SDA = 0; /*发送起始信号*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL = 0; /*时钟线高低跳变一次,I2C通信开始*/
}
/**************************************************
调用方式 : void Stop_I2C(void)
函数说明: 关闭I2C总线
**************************************************/
void Stop_I2C(void)
{
    SCL = 0; /*发送关闭总线的时钟信号*/
    SDA = 0; /*发送关闭总线的数据信号*/
    _nop_();
    _nop_();
    _nop_(); /*保持数据线低,延时*/
    _nop_();
    _nop_();
    SCL = 1; /*时钟线一次低高跳变,I2C通信停止*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SDA = 1; /*发送I2C总线停止数据信号*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    EA = 1; /*开总中断*/
}
/**************************************************
调用方式 : void Ask_I2C(void)
函数说明: 主控程序等待从器件接收方式应答
**************************************************/
void Ack_I2C(void)
{
    unsigned char errtimes = 0xFF;
    SDA = 1;
    SCL = 1;
    error = 0x10;
    while(SDA)
    {
        errtimes--;
        if(!errtimes)
        {
            Stop_I2C();
            error = 0x11;
            return;
        }
    }
    SCL = 0;
}
/**************************************************
调用方式 : void Send_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,从器件等待主器件应答
**************************************************/
void Send_Ack(void)
{
    SDA = 0; /*保持数据线低,时钟线发生一次高低跳变 发送一个应答信号*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL = 1; /*时钟线保持低电平*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL = 0;
}
/**************************************************
调用方式 : void Send_Not_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,非应答信号
**************************************************/
void Send_Not_Ack(void)
{
    SDA = 1; /*保持数据线高,时钟线发生一次高低跳变 没有应答*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL = 1; /*时钟线保持高电平*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL = 0;
}
/**************************************************
调用方式 : void Send_I2C(unsigned char send_byte)
函数说明: 总线发送一个字节
**************************************************/
void Send_I2C(unsigned char send_byte)
{
    unsigned char send_bit;
    for(send_bit = 8; send_bit > 0; send_bit--)
    {
        SCL = 0;
        _nop_();
        SDA = (send_byte & 0x80);
        send_byte <<= 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
    SCL = 0;
}
/**************************************************
调用方式 : unsigned char Receive_I2C(void)
函数说明: 从I2C总线上接收一个字节
**************************************************/
unsigned char Receive_I2C(void)
{
    unsigned char receive_bit , receive_byte = 0;
    for(receive_bit = 8; receive_bit > 0; receive_bit--)
    {
        SCL = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        receive_byte <<= 1;
        receive_byte |= SDA;
    }
    SCL = 0;
    return receive_byte;
}

树莓派怎么样用 Python 控制 GPIO 来发送串口指令

python GPIO

  1. 先安装python-dev,输入以下指令。
sudo apt-get install python-dev
  1. 安装RPi.GPIO,依次输入以下指令。
  1. 下载:$ wget
  2. 解压缩:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
  3. 进入解压之后的目录 :$ cd RPi.GPIO-0.5.3a
  4. 启动安装 :$ sudo python setup.py install
  1. 例子:
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)
while True:
    GPIO.output(11, GPIO.HIGH)
    time.sleep(1)
    GPIO.output(11, GPIO.LOW)
    time.sleep(1)
  1. 执行:
sudo python led.py
  1. 说明:
  1. GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。
  2. 由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。 python GPIO
  1. 说明: WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言包转,例如python、ruby或者PHP等。 wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询GPIO管脚。wiringPi是可以扩展的,可以利用wiringPi的内部模块扩展模拟量输入芯片,可以使用MCP23x17/MCP23x08(I2C或者SPI)扩展GPIO接口。另外可通过树莓派上的串口和Atmega(例如arduino等)扩展更多的GPIO功能。另外,用户可以自己编写扩展模块并把自定义的扩展模块集成到wiringPi中。WiringPi支持模拟量的读取和设置功能,不过在树莓派上并没有模拟量设备。但是使用WiringPi中的软件模块却可以轻松地应用AD或DA芯片。