【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。
CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。
【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
什么是IIC (I2C, I²C) ?I²C(Inter-Integrated Circuit,也常写作 I2C 或 IIC)是一种由飞利浦(现恩智浦 / NXP)开发的短距离串行通信总线协议,主要用于连接集成电路(IC)之间的低速数据传输,其核心特点是通过两条线实现多设备间的通信,结构简单、成本低、扩展性强。
1、核心组成与工作原理
物理线路仅需两条双向信号线:
SDA(Serial Data):串行数据线,用于传输实际数据。
SCL(Serial Clock):串行时钟线,由主设备(如 Arduino、MCU)提供时钟信号,同步数据传输节奏。
此外,所有设备需共地(GND),总线上通常接有上拉电阻(一般 4.7kΩ),确保空闲时线路处于高电平。
主从架构
主设备(Master):发起通信、控制时钟信号、决定数据传输方向(读 / 写),同一总线上可有多个主设备(需仲裁机制避免冲突)。
从设备(Slave):被动响应主设备的指令,每个从设备有唯一的 7 位或 10 位地址(7 位地址最常用,支持最多 128 个设备),通过地址被主设备选中。
通信过程基本流程为:主设备发送起始信号(SDA 从高到低,SCL 保持高电平)→ 发送从设备地址 + 读写位(1 位,读 = 1,写 = 0)→ 从设备返回应答信号(ACK)(SDA 拉低)→ 传输数据(每字节 8 位,后跟 ACK)→ 主设备发送停止信号(SDA 从低到高,SCL 保持高电平)。
2、主要特点
简单经济:仅需 2 根线,减少布线复杂度,适合小型设备(如传感器、OLED 屏、EEPROM)。
多设备支持:通过唯一地址区分从设备,总线上可挂接多个设备(受总线电容限制,通常建议不超过 10 个)。
低速传输:标准模式(100kbps)、快速模式(400kbps)、高速模式(3.4Mbps),适合非实时性数据(如温湿度、光照传感器数据)。
半双工通信:同一时间只能单向传输数据(主到从或从到主)。
3、典型应用场景
嵌入式系统:Arduino 与 OLED 屏(如 SSD1306)、温湿度传感器(如 SHT30)、加速度计(如 MPU6050)的通信。
消费电子:智能手机中的传感器模块(陀螺仪、磁力计)与主控芯片的连接。
工业控制:小型传感器(压力、液位)与 PLC 的低速数据交互。
存储设备:EEPROM(电可擦除存储器)与 MCU 的数据读写(如 AT24C02)。
4、与其他总线的对比
相比SPI:I²C 线数更少(2 线 vs SPI 的 4 线),但速度更低,适合轻量场景;SPI 支持全双工,速度更快(可达几十 Mbps)。
相比UART:I²C 支持多设备,而 UART 通常是点对点通信,且无需定义波特率(依赖时钟同步)。
总之,I²C 是一种 “以简单换效率” 的总线协议,在低速、多设备的短距离通信中应用广泛,尤其适合资源受限的嵌入式系统。
【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
使用K230的 I2C 接口进行通信这里用K230的IIC1,点亮一块128*32的OLED屏幕作为IIC的使用示例
【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
项目测试实验代码# 【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
# 项目功能:通过I2C总线驱动SSD1306 OLED显示屏,实现基本的文字显示和像素操作
# 导入 machine 模块中的 I2C 和 FPIOA 类
# I2C: 用于I2C总线通信
# FPIOA: 用于引脚功能重映射配置(Field Programmable I/O Array)
from machine import I2C
from machine import FPIOA
# 导入 ssd1306 模块中的 SSD1306_I2C 类
# 提供SSD1306 OLED显示屏的I2C驱动功能
from ybUtils.ssd1306 import SSD1306_I2C
# 导入时间模块
# 用于后续可能的时间控制操作(如延时)
import time
# 实例化 FPIOA 对象
# FPIOA是K230特有的灵活IO配置器,可以动态配置引脚功能
fpioa = FPIOA()
# 创建 I2C 实例,使用 I2C 通道 1
# 参数说明:
# - id=1: 使用I2C1控制器
# - 其他参数使用默认值(频率等)
i2c = I2C(1)
# 配置引脚功能 - 这是K230开发的关键步骤:
# 将GPIO引脚映射到特定的外设功能
# 配置GPIO 34引脚为I2C1_SCL(时钟线)功能
# 参数说明:
# - 34: 物理引脚编号
# - FPIOA.IIC1_SCL: 功能选择为I2C1时钟线
# - oe=1: 输出使能
# - ie=1: 输入使能
# - pu=1: 上拉电阻使能(保证总线空闲时为高电平)
# - st=1: 施密特触发器使能(提高信号质量)
# - ds=15: 驱动强度设置(控制输出电流能力)
fpioa.set_function(34, FPIOA.IIC1_SCL, oe=1, ie=1, pu=1, st=1, ds=15)
# 配置GPIO 35引脚为I2C1_SDA(数据线)功能
# 参数与SCL配置相同,确保总线一致性
fpioa.set_function(35, FPIOA.IIC1_SDA, oe=1, ie=1, pu=1, st=1, ds=15)
# 创建 SSD1306 OLED 显示器实例
# 参数说明:
# - 128: 显示屏宽度(像素)
# - 32: 显示屏高度(像素)
# - i2c: 使用的I2C总线实例
# 注意:这里假设OLED设备的I2C地址使用默认值0x3C
oled = SSD1306_I2C(128, 32, i2c)
# 清除 OLED 显示器的内容(清屏)
# 参数0表示将所有像素设置为关闭状态(黑色)
oled.fill(0)
# 在 OLED 显示器上显示文字
# 参数说明:
# - 'Hello Yahboom': 要显示的文本内容
# - 0: 文本起始x坐标(最左侧)
# - 10: 文本起始y坐标(从顶部向下10像素)
# 注意:SSD1306的文本渲染使用内置的8x8像素字体
oled.text('Hello Yahboom', 0, 10)
# 像素级操作演示:遍历OLED显示器的所有像素
# 外层循环遍历x坐标(0到127)
for x in range(128):
# 内层循环遍历y坐标(0到31)
for y in range(32):
# 获取指定坐标像素的当前状态
# 返回值:1表示像素点亮,0表示像素熄灭
a = oled.pixel(x, y)
# 如果检测到像素点亮(值为1),则在串口打印该像素坐标
# 这个功能主要用于调试,可以查看哪些像素被文字渲染点亮
if a == 1:
print(x, y)# 输出格式:"x坐标 y坐标"
# 更新 OLED 显示器的内容
# 这是关键步骤:将前面所有的绘图操作(fill、text等)真正发送到硬件显示
# 在调用show()之前,所有操作都在内存缓冲区中进行,不会立即显示
oled.show()
# 程序执行流程总结:
# 1. 配置硬件引脚功能
# 2. 初始化I2C总线和OLED设备
# 3. 清空屏幕并在指定位置显示文字
# 4. 扫描所有像素并输出被点亮像素的坐标
# 5. 最终将缓冲区的所有内容更新到物理显示屏
【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
关键知识点补充:1、I2C总线特点:
双线制(SCL时钟线 + SDA数据线)
多主多从架构
地址寻址通信
2、SSD1306显示屏:
常见的128x32或128x64分辨率OLED驱动芯片
使用I2C接口时默认地址通常是0x3C或0x3D
3、FPIOA的重要性:
K230芯片的特色功能,引脚功能可编程
必须正确配置才能使用各种外设功能
提供了极大的硬件连接灵活性
4、双缓冲显示:
绘图操作先在内存缓冲区进行
show()方法将缓冲区内容一次性发送到显示屏
避免闪烁,提高显示效率
这个示例完整展示了从硬件配置到应用层操作的完整I2C设备驱动流程。
【花雕动手做】CanMV K230 AI视觉识别模块之使用 I2C 通讯
代码执行的流程图如下:实验场景图
页:
[1]