写在前面

这篇文章是在树莓派上写的,正好写完代码

1 树莓派传输

1.1 前置工作

首先:打开树莓派的iic

如果你使用的是图形桌面,非常好,直接在左上角首选项>Raspberry Pi Configuration>Interfaces 里面把i2c打开就可以

如果你用的命令行,在终端输入sudo raspi-config

1.2 查看你的iic设备地址

先安装必要的工具:sudo apt-get install i2c-tools

查看所有iic设备的地址:i2cdetect -y 1

从i2c设备读出所有寄存器的值: sudo i2cdump -y 1 <设备地址>

往某一个iic设备中的某一个寄存器中写入某一个值:sudo i2cset -y 1 <设备地址><寄存器地址><写入的值>

从某一个地址的某一个寄存器读出值:sudo i2cget -y 1<设备地址><寄存器地址>

2 python实现

我们使用smbus这个库:

首先实例化

from smbus2 import SMBus
i2c = SMBus(1)   # 1 代表 /dev/i2c-1

然后打开一个设备

i2c = SMBus(1)

从设备读取一个值:read_byte(i2c_addr, force=None)

向设备写入一个值:write_byte(i2c_addr, value, force=None)

从指定的寄存器中读取一个字节:read_byte_data(i2c_addr, register, force=None)

从给定的寄存器中读取字节数据块:read_i2c_block_data(i2c_addr, register, length(数据块大小), force=None)

将字节数据块写入给定寄存器:write_i2c_block_data(i2c_addr, register(起始寄存器), data, force=None)

我们以arduino和树莓派的通讯为例:

Arduino:

// 直接在Arduino IDE选择“文件”→“示例”→Wire→slave_receiver,可以打开该文件
#include <Wire.h>

void setup() {
  Wire.begin(8);                // Wire初始化, 并以从设备地址8的身份加入IIc总线
  Wire.onReceive(receiveEvent); // 注册一个IICqwq事件,用于响应主机的数据发送
  Serial.begin(9600);           // 初始化串口并设置波特率为9600
}

void loop() {
  delay(100);
}

// 当主机发送的数据被收到时,将触发 receiveEvent() 事件
void receiveEvent(int howMany) {
  String inString="";
// 循环读取收到的数据,最后一个数据单独读取

  char x = Wire.read();    			// 以整型形式接收数据
  Serial.print(x);         		// 串口输出该整型变量
  inString += char(x);
  //Serial.println(inString);
  inString="";

}

然后是树莓派部分


import time
import numpy as np
from smbus2 import SMBus 
i2c = SMBus(1)
i2c.open(1)
while 1:
    inf = time.ctime()
    adr = 0x08
    str_list = np.fromstring(inf,dtype=np.uint8)
    str_list=np.append(str_list,10)
    for i in str_list:
        #print(i)
        i = int(i)
        i2c.write_byte(adr,i,force=None)