树莓派学习-I2c通信

树莓派学习-I2c通信前言由于之前参加了学校的飞兆杯的比赛,题目是循迹小车,由于缺乏对于ldc1314芯片使用知识以及个人的能力原因,项目并没有做出来,但是还是学习了很多东西的。其中以树莓派的I2C通信为最。一、I2C简介I2C(Inter-IntegratedCircuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊

大家好,又见面了,我是你们的朋友全栈君。

前言

由于之前参加了学校的飞兆杯的比赛,题目是循迹小车,由于缺乏对于ldc1314芯片使用知识以及个人的能力原因,项目并没有做出来,但是还是学习了很多东西的。

其中以树莓派的I2C通信为最。

一、I2C简介

I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。 I2C 总线支持任何IC 生产工艺(CMOS、双极型)。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机(见表1)。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。

详见 百度百科-I2C总线

二、配置I2C接口,读取i2c设备的地址

1、可以通过raspi-config配置工具配置使能I2C,或者通过编辑/boot/config.txt文件,加入一下一行内容:

dtparam=i2c1=on
dtparam=i2c_arm=on

2、安装I2C库和工具

$sudo apt-get install i2c-tools

3、当连接上I2C设备后,可以通过以下命令查看

$sudo i2cdetect -y -a 1

树莓派学习-I2c通信

其中2a就是我们的ldc1314模块的i2c通信地址

三、对i2c设备寄存器的读写

1、设备所有数据的读出

sudo i2cdump -y 1 0x2a

-y 代表取消用户交互过程,直接执行命令

1 代表I2C设备号

0x2a 代表I2C设备地址

该命令会到处0x00到0xFF地址范围内的所有数据,如图所示
树莓派学习-I2c通信

2、数据的写入

使用
sudo i2cset -y 1 0x2a 0x1a 0x55
即可向设备地址为0x2a的0x1a寄存器地址写入0x55

-y 代表取消用户交互过程,直接执行命令

1 代表I2C设备号

0x2a 代表I2C设备地址

0x1a 代表寄存器地址

0x55 代表向寄存器写入的数据

3、寄存器数据读出

sudo i2cget -y 1 0x2a 0x1a

即可读出总线地址为0x2a设备的0x1a寄存器地址的数据

-y 代表取消用户交互过程,直接执行命令

1 代表I2C设备号

0x2a 代表I2C设备地址

0x1a 代表寄存器地址

4、对16位数据的读

在基本的命令后加上 w 即可实现

树莓派学习-I2c通信

四、I2C编程

因为使用树莓派我一直使用的语言是Python,故i2c编程只学到了Python

首先需要安装smbus库

sudo apt-get install python-smbus

示例代码如下

import smbus
import time
bus = smbus.SMBus(1)

addr=0x2a
recount_th0=0x1a
# 对8位数据的读写
data=bus.read_byte_data(address,recount_th0) 
print data

bus.write_byte_data(address,recount_th0,0x99)

#对16位数据的读写
data=bus.read_word_data(address,recount_th0) 
print data

bus.write_word_data(address,recount_th0,0x01d6)

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

python封装SMBUS操作函数具体代码请查看:https://github.com/bivab/smbus-cffi

五、速率相关

1、查看I2C设备的速率

sudo cat /sys/module/i2c_bcm2708/parameters/baudrate 

默认的I2C速度为100KHz,对于多数I2C设备而言100KHz并不算快,但是对于个别的I2C设备而言100KZH还是太快了,那么也可以修改I2C的速率使得通信更稳定。

2、修改速率 ##

进入/etc/modprobe.d 目录,并在该目录下新建一个costom.conf文件,在该文件中插入options i2c_bcm2708 baudrate=32000,32000便为新的I2C速率,最后请重启系统。

cd  /etc/modprobe.d           #进入/etc/modprobe.d 目录  
sudo nano custom.conf         #在该目录新建一个名为custom.conf文件,并插入以下内容  
                              #options i2c_bcm2708 baudrate=32000  
sudo reboot                   #重启系统  

六、参考资料

树莓派入门教程——I2C Tools的安装和使用

树莓派与i2c设备的通信

树莓派学习笔记——I2C设备装入和速率设置

树莓派系列教程11:I2C编程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143104.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析[通俗易懂]

    缓存穿透,缓存击穿,缓存雪崩解决方案分析[通俗易懂]前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案

  • DatabaseMetaData.getIndexInfo

    DatabaseMetaData.getIndexInfo示例通过DatabaseMetaData.getIndexInfo()获取索引信息。publicstaticvoidgetIndexInfo()throwsException{Connectionconn=getConnection();ResultSetrs=null;try{

  • Tomcat配置环境变量

    Tomcat配置环境变量Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程重新记录下来,以便以后如果忘记了可以随时查看。注意:首先要明确一点,Tomcat与Java密切相关,因此安装使用之前要先安装JDK并设置JDK的环境变量,由于机子上已经安装好了JDK,也设置好了JDK环境变量,因此这里不再过多叙述,只说明我设置好的环境变量:JAV…

  • 结巴分词原理及使用「建议收藏」

    结巴分词原理及使用「建议收藏」目前常用的分词工具很多,包括盘古分词、Yaha分词、Jieba分词、清华THULAC等,现在项目使用的分词方法是结巴分词,本次来介绍一下。安装就不说了可以直接pipinstalljieba或者pycharm的setting中添加即可。通过 importjieba 来引用如下为jieba代码结构及子目录与相应功能的对应;.├──analyse#短语抽取模块│  ├──…

  • Linux 网络配置和管理

    Linux 网络配置和管理

  • HashMap常见面试题_java面试题大汇总

    HashMap常见面试题_java面试题大汇总1.HashMap的数据结构?哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树。2.HashMap的工作原理?HashMap底层是hash数组和单向链表实现,数组中的每个元素都是链表,由Node内部类(实现Map.Entry<K,V>接口)实现,HashMap通过put&get方法存储和获取。存储对象时,将K/V键值传给put()方法: ①、调用hash(K)方法计算K的hash值,然后结合数组长度,计算得数组下标;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号