Python控制Linux(OrangePi 香橙派) I2C

第一步:打开 i2c 的配置

香橙派(OrangePi)开启i2c的方法是在 /boot/orangepiEnv.txt 中设置 overlays=i2c0 i2c1 就可以同时打开 i2c0 和 i2c1 的配置, 也可以只打开1个。
重启香橙派后生效。

overlays=i2c0 i2c1

其它Linux系统的配置方法我就不知道了。

第二步:安装i2c-tools

终端命令如下:

sudo apt update
sudo apt install i2c-tools

安装完,在板上i2c接口随便连接一个i2c设备,在终端输入命令:

sudo i2cdetect -y 0

(其中 0 表示 i2c0,若是i2c1 需要修改为 i2cdetect -y 1)
如果能检测到连接的 i2c 设备的地址,就说明 i2c 能正常使用,并且连接设备成功
如下图,我的i2c设备地址是0x68
在这里插入图片描述

第三步:安装smbus2

终端命令如下:

sudo pip install smbus2

安装成功提示:

Collecting smbus2
  Downloading smbus2-0.4.2-py2.py3-none-any.whl (11 kB)
Installing collected packages: smbus2
Successfully installed smbus2-0.4.2

若安装失败,到官网下载安装包:https://pypi.org/project/smbus2/#files
下载页面选择smbus2-0.4.2-py2.py3-none-any.whl下载,
然后复制.whl文件到Linux(香橙派)
.whl文件所在目录下,终端执行:

sudo pip install smbus2-0.4.2-py2.py3-none-any.whl

第四步:测试

Python的smbus2控制i2c非常简单,只要import smbus2并实例化SMBus对象之后,直接调用其读写函数就可以了。
我这边连接的设备是DS3231M,一个时钟模块,设备地址是0x68
Python代码如下:

# I2C_test.py

# -*- coding:utf-8 -*-

import smbus2
import time

i2c_addr = 0x68

sec_addr  = 0x00  # 秒 (低4位是秒, 高4位是x10秒 例如:0x00010010 表示12秒, 而不是18秒)
min_addr  = 0x01  # 分 (低4位是分钟, 高4位是x10分钟)
hour_addr = 0x02  # 时 (低4位是小时, 第5位是x10小时, 第6位是x20小时, 第7位是12/24小时制选择)
day_addr  = 0x03  # 星期 1-7
date_addr = 0x04  # 日 01-31 (低4位是天, 高4位是x10天)
mon_addr  = 0x05  # 月 01-12+Century (低4位是月, 第5位是x10月, 第8位是Century)
year_addr = 0x06  # 年 0-99 (低4位是年, 高4位是x10年)

i2c_bus = smbus2.SMBus(0) # 其中 0 表示 i2c0
tData = [0,1,2,3,4,5,6]

def getTime(tData):
    tData[0] = ((tData[0] & 0xF0) >> 4)*10 + (tData[0] & 0x0F)
    tData[1] = ((tData[1] & 0xF0) >> 4)*10 + (tData[1] & 0x0F)
    tData[2] = ((tData[2] & 0x10) >> 4)*10 + ((tData[2] & 0x20) >> 5)*20 + (tData[2] & 0x0F)
    tData[4] = ((tData[4] & 0xF0) >> 4)*10 + (tData[4] & 0x0F)
    tData[5] = ((tData[5] & 0x10) >> 4)*10 + (tData[5] & 0x0F)
    tData[6] = ((tData[6] & 0xF0) >> 4)*10 + (tData[6] & 0x0F)
    return tData

while True:
    for i in range(7):
        tData[i] = i2c_bus.read_byte_data(i2c_addr, i)
    tData = getTime(tData)
    print(tData)
    time.sleep(1)

终端执行:

sudo python3 i2c_test.py

显示结果:
在这里插入图片描述
表示顺序:s m h week day month year
这边没有设置初始时间,时间与现实不符,这个我就不改了,可以根据数据手册自己改

附录: DS3231M设置为硬件时钟

请转至链接:https://blog.csdn.net/qq_34482285/article/details/130310020

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值