MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制
苏勇,2022年3月
文章目录
Introduction
MicroPython在extmod目录下提供了machine_i2c的实现框架,并附带了一个GPIO模拟I2C的实现实例SoftI2C。在本文中,将具体分析machine_i2c的实现框架,以期得到移植machine_i2c的实践方法。在阅读代码的过程中,将专注于machine_i2c的框架,但仍借助于SoftI2C实现的接口描述machine_i2c在具体平台上移植的工作。在后续的文章中,将SoftI2C作为machine_i2c的一个具体实例,与硬件I2C等同,分析SoftI2C的实现,并补完machine_i2c.c文件中需要适配具体硬件平台的部分移植代码。
Algorithm
快速浏览了extmod/machine_i2c.c文件,700多行的代码的源码文件确实比较大。跳过mp_hal_i2c_xxx()和mp_machine_soft_i2c_transfer()函数的部分代码,开始看mp_machine_i2c_xxx()和machine_i2c_xxx()系列函数,这部分内容将构成machine_i2c类模块的实现框架。
根据之前分析和设计MicroPython类模块的经验,这里先从实例化类模块的部分代码入手。以machine_i2c.c文件中的SoftI2C为例:
STATIC const mp_rom_map_elem_t machine_i2c_locals_dict_table[] = {
{
MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2c_init_obj) },
{
MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&machine_i2c_scan_obj) },
// primitive I2C operations
{
MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&machine_i2c_start_obj) },
{
MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&machine_i2c_stop_obj) },
{
MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&machine_i2c_readinto_obj) },
{
MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_i2c_write_obj) },
// standard bus operations
{
MP_ROM_QSTR(MP_QSTR_readfrom), MP_ROM_PTR(&machine_i2c_readfrom_obj) },
{
MP_ROM_QSTR(MP_QSTR_readfrom_into), MP_ROM_PTR(&machine_i2c_readfrom_into_obj) },
{
MP_ROM_QSTR(MP_QSTR_writeto), MP_ROM_PTR(&machine_i2c_writeto_obj) },
{
MP_ROM_QSTR(MP_QSTR_writevto), MP_ROM_PTR(&machine_i2c_writevto_obj) },
// memory operations
{
MP_ROM_QSTR(MP_QSTR_readfrom_mem), MP_ROM_PTR(&machine_i2c_readfrom_mem_obj) },
{
MP_ROM_QSTR(MP_QSTR_readfrom_mem_into), MP_ROM_PTR(&machine_i2c_readfrom_mem_into_obj) },
{
MP_ROM_QSTR(MP_QSTR_writeto_mem), MP_ROM_PTR(&machine_i2c_writeto_mem_obj) },
};
MP_DEFINE_CONST_DICT(mp_machine_i2c_locals_dict, machine_i2c_locals_dict_table);
STATIC const mp_machine_i2c_p_t mp_machine_soft_i2c_p = {
.init = mp_machine_soft_i2c_init,
.start = (int (*)(mp_obj_base_t *))mp_hal_i2c_start,
.stop = (int (*)(mp_obj_base_t *))mp_hal_i2c_stop,
.read = mp_machine_soft_i2c_read,
.write = mp_machine_soft_i2c_write,
.transfer = mp_machine_soft_i2c_transfer,
};
const mp_obj_type_t mp_machine_soft_i2c_type = {
{
&mp_type_type },
.name = MP_QSTR_SoftI2C,
.print = mp_machine_soft_i2c_print,
.make_new =

本文介绍MicroPython中I2C模块machine_i2c的设计与实现,重点分析了machine_i2c的框架机制及其实现细节,包括init()和transfer_single()等关键函数的作用和移植方法。
最低0.47元/天 解锁文章
3140

被折叠的 条评论
为什么被折叠?



