arduino的IIC
首先arduino的IIC是硬件IIC,硬件IIC一般都是固定引脚的
所以需要自己先去查一下自己芯片的第一组IIC接口是哪两个引脚
(esp32例外)
然后,需要芯片支持Wire.h库。一般芯片都会自带有的。
(这是官方库)
最后说明:读写缓存只有 32 字节
文件宏定义:
1 | //这个为IIC头文件 |
esp32iic可以是任意的IO
主机模式
IIC初始化
1 | Wire.begin(address); // 初始化IIC |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| address | int | 注册成为从机模式 | 0到128之间 |
| 返回值 | 无 | 无 | 无 |
1 | Wire.begin(); // 初始化IIC |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| 无 | 无 | 啥也不填直接调用就是主机模式 | 无 |
| 返回值 | 无 | 无 | 无 |
esp32iic可以是任意的IO
所以
初始化主机模式
1 | Wire.begin(sda,scl); // 初始化IIC |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| sda | int | 定义sda的引脚 | 单片机引脚 |
| scl | int | 定义scl的引脚 | 单片机引脚 |
| 返回值 | 无 | 无 | 无 |
初始化从机模式
1 | Wire.begin(sda,scl,address); // 初始化IIC |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| sda | int | 定义sda的引脚 | 单片机引脚 |
| scl | int | 定义scl的引脚 | 单片机引脚 |
| address | int | 注册成为从机模式 | 0到128之间 |
| 返回值 | 无 | 无 | 无 |
主机准备向从机读数据
1 | Wire.requrstFrom(addtess,quantity) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| address | int | 向指定从机请求数据 | 0到128之间 |
| quantity | int | 请求数据的长度(单位字节) | 0到32之间 |
| stop | 布尔形 | ‘真’ 则在请求结束后发送一个停止命令,并释放总线。‘假’则继续发送请求保持连接 | 真或者假 |
| 返回值 | int | 主机从从机接受到的字节数目,主机接受到一个数据返回的字节数就会减少一个 | 无 |
主机准备向从机写数据
1 | Wire.beginTransmission(addtess); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| address | int | 向指定从机请求数据 | 0到128之间 |
| 返回值 | 无 | 无 | 无 |
发送停止位
1 | Wire.endTransmission() |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| stop | 布尔形 | ‘真’ 发送一个停止信息,并释放总线。‘假’则继续发送请求保持连接 | 真或者假 |
| 返回值 | int | 0、成功 1、数据溢出 2、发送addtess时从机接受到NACK 3、发送数据时接受到 NACK 4、其他错误 | 无 |
发送数据
1 | Wire.write(value) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| value | int | 要发送的数值 | int |
| string | string | 发送的字符组的指针 | 字符组 |
| data | 数组 | 要发送的数组 | 数组 |
| length | int | 发送的数组的长度(单位字节) | int |
| 返回值 | 无 | 无 | 无 |
返回读到的字节数
1 | Wire. available() |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| 返回值 | int | 主机从从机接受到的字节数目,主机接受到一个数据返回的字节数就会减少一个 | 无 |
读取数据
1 | Wire.read() |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| 返回值 | uint8_t | 读到的字节数据,通常一次返回一个字节的数据 | 无 |
从机模式
当从机接受到主机写的请求
1 | Wire.onReceive(handler) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| handler | 回调函数 | 当从机接受到数据就执行回调函数,回调函数需要带一个int型参数(无返回值) | void handler(int howMany){} |
| 返回值 | uint8_t | 主机从从机接受到的字节数目,主机接受到一个数据返回的字节数就会减少一个 | 无 |
当从机接受到主机读的请求
1 | Wire.onRequest(handler) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| handler | 回调函数 | 当从机接受到数据就执行回调函数(无返回值) | 回调函数 |
| 返回值 | uint8_t | 主机从从机接受到的字节数目,主机接受到一个数据返回的字节数就会减少一个 | 无 |
参考代码bh1750通信
1 | //addr接高电平设备地址为1011100也就是0x5c |
从机和主机通信
目前已知air001(py32f002a)iic从机有问题
从机代码
1 | #include <Wire.h> |
主机代码
1 | #include <Wire.h> |