首页 > 编程知识 正文

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

时间:2023-12-19 16:21:20 阅读:317922 作者:CHMC

本文目录一览:

树莓派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的文件

[python] view plain copy

#!/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 , (1i) )

# 延时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 , (1i) )

向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

2、安装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

3、例子:

[python] view plain copy

# -*- 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)

4、执行:

sudo python led.py

5、说明:

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芯片。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。