介绍
WifiIotI2cData 结构体是鸿蒙物联网(IoT)开发中用于 I2C双向通信的数据封装结构,通常在鸿蒙物联网设备(如智能传感器、小型 OLED 屏等通过 I2C 协议连接的硬件)开发中使用。
适合全双工或半双工场景中同时处理收发操作。
头文件
base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_i2c.h
#include "wifiiot_i2c.h"
定义
/**
* @brief Defines I2C data transmission attributes.
*/
typedef struct {
/** Pointer to the buffer storing data to send */
unsigned char *sendBuf;
/** Length of data to send */
unsigned int sendLen;
/** Pointer to the buffer for storing data to receive */
unsigned char *receiveBuf;
/** Length of data received */
unsigned int receiveLen;
} WifiIotI2cData;
说明
WifiIotI2cData 用于封装 I2C 通信中需要发送或接收的数据,包含 数据缓冲区(存储实际传输的字节) 和 数据长度(字节数) 两个核心成员。
结构体成员详解
| 成员名 | 类型 | 作用说明 |
|---|---|---|
sendBuf |
unsigned char * |
指向发送缓冲区的指针,存储需要通过I2C总线发送到外设的数据(如指令、配置参数)。 |
sendLen |
unsigned int |
发送数据的长度(单位:字节),即 sendBuf 中有效数据的字节数。 |
receiveBuf |
unsigned char * |
指向接收缓冲区的指针,用于存储从I2C外设读取到的数据(如传感器采集值、状态信息)。 |
receiveLen |
unsigned int |
接收数据的长度(单位:字节):<br>- 输入时:表示期望从外设接收的字节数;<br>- 输出时:表示实际接收到的字节数(由驱动填充)。 |
使用场景
在与支持读写操作的I2C外设(如带寄存器的传感器、OLED屏)通信时,该结构体可一次完成“发送指令+接收响应”的过程。例如,从I2C温湿度传感器读取数据:
OLED屏幕显示参数解释
将写数据到 I2C OLED屏幕的操作封装成函数
#include "wifiiot_i2c.h"
/*
cmdType:指令类型:0x00表示写指令,0x40表示写数据
data:数据。
当cmdType是0x00时,data表示指令内容
当cmdType是0x40时,data表示显示的内容
*/
static uint32_t Write(uint8_t cmdType, uint8_t data)
{
uint8_t buffer[] = {cmdType, data};
WifiIotI2cData i2cData = {0};
i2cData.sendBuf = buffer;
i2cData.sendLen = sizeof(buffer)/sizeof(buffer[0]);
return I2cWrite(WIFI_IOT_I2C_IDX_0, 0x78, &i2cData);
}
设置起始页
从哪一页开始显示数据
显示屏有64行像素时,又分为8页,每页8行
Write(0x00,0xb0 + page)
0x00:表示写命令0xb0 + page:page范围0~7,page为0表示从第一页开始显示,page为1表示从第二页开始显示,以此类推
设置起始列
从哪一列开始显示数据
Write(((x & 0xF0) >> 4) | 0x10); // 列地址高4位
Write(x & 0x0F); // 列地址低4
x:横向位置,范围0~127,对应 OLED 的 128 列像素
Write(((x & 0xF0) >> 4) | 0x10); 解释
- 功能:设置列地址的“高4位”(确定列坐标的高半部分)。
- 指令解析:
x是列坐标(0~127),二进制表示为8位(如x=30对应二进制00011110)。x & 0xF0:保留x的高4位,清除低4位。例如x=30时,30 & 0xF0 = 00010000(二进制)。>> 4:将高4位右移4位,得到一个0~15的数值。例如00010000 >> 4 = 00000001(二进制,即十进制1)。| 0x10:与基础指令0x10组合,得到最终的列地址高4位指令。例如1 | 0x10 = 0x11(二进制00010001)。
- 作用:OLED的列地址是8位(0~127),但需要分两次发送(高4位+低4位),这是OLED的通信协议规定的。
OledSendCmd(x & 0x0F); 解释
- 功能:设置列地址的“低4位”(确定列坐标的低半部分)。
- 指令解析:
x & 0x0F:保留x的低4位,清除高4位。例如x=30时,30 & 0x0F = 00001110(二进制,即十进制14)。- 该结果直接作为指令发送,与上一条“高4位指令”组合,形成完整的8位列地址。
- 示例:
x=30时,高4位指令为0x11,低4位指令为0x0E,组合后得到完整列地址0x1E(即十进制30)。
总结
- 先通过
0xB0 + page指令告诉OLED:“后续数据从第page页开始显示”(确定纵向位置)。 - 再通过两条列地址指令告诉OLED:“在该页中,从第
x列开始显示”(确定横向位置)。
设置完成后,发送的点阵数据,会从这个指定的(x, page)位置开始显示,从而实现“在OLED的任意行列位置显示内容”的功能。