当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]关注「嵌入式大杂烩」,选择「星标公众号」一起进步!作者 |  Acuity1.写在前面i2c总线是由PHILIPS公司开发的一种简单、「双向二线制同步串行总线」。关于i2c的使用,并不陌生,C51、ARM、MSP430等,都基本集成硬件i2c,或者不集成i2c的,可以根据总线时序...

关注「嵌入式大杂烩」,选择「星标公众号」一起进步!

作者 |  Acuity

1.写在前面

i2c总线是由PHILIPS公司开发的一种简单、双向二线制同步串行总线。关于i2c的使用,并不陌生,C51、ARM、MSP430等,都基本集成硬件i2c,或者不集成i2c的,可以根据总线时序图使用普通IO口翻转模拟一根i2c总线。

对于流行的stm32饱受诟病的硬件i2c,相信很多人都是使用模拟i2c。模拟i2c的源码比较多,大多都是大同小异,对于各类例程,提供的模拟i2c似乎都不是太规范(个人见解),特别是一根i2c总线挂多个外设、模拟多根i2c总线、以及更换一个i2c外设时,都需要大幅度修改源码、复制源码、重新调试时序等重复的工作。

在阅读过Linux设备驱动框架和RT-Thread的驱动框架,发现在总线分层上处理就特别好,完美解决了上述提及的问题。参考RT-Thread和Linux下的模拟i2c,整理修改在裸机上使用。

2.Linux、RT-Thread设备驱动模型

1)模型分为总线驱动和设备驱动;

2)  总线驱动与外设驱动分离,方便一根总线挂多个外设,方便移植;

3)  底层(与硬件相关)与上层分离,方便添加总线及移植到不同处理器,移植到其他处理器,只需重新实现硬件相关的“寄存器”层即可;


3.MCU下裸机形式i2c总线抽象

此部分实现源码为:i2c_core.c  i2c_core.h

1)i2c总线抽象对外接口(API)

“i2c_bus_xfer”为i2c封装对外的API,函数原型如下,提供一个函数模型,具体需要实例化函数指针。

int i2c_bus_xfer(struct i2c_dev_device *dev,struct i2c_dev_message msgs[],unsigned int num)
{
 int size;
 
 size = dev->xfer(dev,msgs,num); 
 return size;
}
a)此函数即作为驱动外设的对外接口,所有操作通过此函数接口,与底层总线实现分离,如EEPROM、RTC、温度传感器等;

b)一个对外函数已经实现90%的情况使用,对应一些特殊情况,后期再完善或增加API。

c)struct i2c_dev_device *i2c_dev

2)i2c总线抽象API参数

a)i2c_dev:i2c设备指针,类型为“struct i2c_dev_device”,驱动一个i2c外设时,首先要对此指针设备初始化;

b)msgs:i2c一帧数据,发送数据及存放返回数据的缓存;

c)num:数据帧数量。

3)struct i2c_dev_device

该结构体为关键,调用API驱动外设时,首先对此初始化(类似于Linux/RT-Thread注册设备)。完整的设备包括两部分,数据操作函数和i2c相关信息(如硬件i2c或者模拟i2c)。因此“struct i2c_dev_device”的原型为:

struct i2c_dev_device
{

    int (*xfer)(struct i2c_dev_device *dev,struct i2c_dev_message msgs[],unsigned int num);
    void *i2c_phy;
};
a)第一个参数是函数指针,数据收发通过此函数指针调用实体函数实现;

b)第二个参数是一个void指针,初始化时指向我们使用的物理i2c(硬件/模拟),使用时可强制转换为对应的类型。

4)xfer

该函数与i2c总线设备对外接口函数“i2c_bus_xfer”具有相同的参数,形参参数参考此项的第2点,初始化时实例化指向实体函数。

5)struct i2c_dev_message

“struct i2c_dev_message”为i2c总线访问外设的一帧数据信息,包括发送数据、外设从地址、访问标识等。原型如下:

struct i2c_dev_message
{

 unsigned short  addr;
 unsigned short flags;
 unsigned short size;
 unsigned char *buff;
 unsigned char   retries;  
};
a)addr:i2c外设从机地址,常用为7位,10位较少用;

b)flags:标识,发送、接收、应答、地址位选择等标识;几种标识如下:

#define I2C_BUS_WR             0x0000
#define I2C_BUS_RD             (1u << 0)
#define I2C_BUS_ADDR_10BIT     (1u << 2)
#define I2C_BUS_NO_START      (1u << 4)
#define I2C_BUS_IGNORE_NACK    (1u << 5)
#define I2C_BUS_NO_READ_ACK    (1u << 6)
c)size:发送的数据大小,或者接收的缓存大小;

d)buff:缓存区;

e)retries:i2c启动失败时,重启的次数。

4.模拟i2c抽象

对于模拟i2c,在以往的实现方式中,基本是时序图和外设代码混合在一起,增加外设或者使用新的i2c外设时,需要对模拟i2c代码进行较大工作量的修改,或者以“复制”的方式实现一套新的i2c总线。

但同理,可以把模拟i2c时序部分代码抽象出来,以“复用”代码的形式实现。此部分实现源码为:i2c_bitops.c  i2c_bitops.h

1)模拟i2c抽象对外接口

根据上述封装的对外API,使用时,首先需要实现入口参数“i2c_dev”实例化,用模拟i2c即是调用模拟i2c相关接口。

int i2c_bitops_bus_xfer(struct ops_i2c_dev *i2c_bus,struct i2c_dev_message msgs[],unsigned long num)
{
 struct i2c_dev_message *msg;
 unsigned long i;
 unsigned short ignore_nack;
 int ret;
 
 ignore_nack = msg->flags 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。

关键字: 人工智能 AI 模拟

2023年汽车业务收入创纪录,同比增长29%

关键字: 碳化硅 智能电源 模拟

555定时器是一种模拟和数字功能相结合的中规模集成器件。一般用双极性工艺制作的称为 555,用 CMOS 工艺制作的称为 7555,除单定时器外,还有对应的双定时器 556/7556。

关键字: ne555 芯片 模拟

2023年10月18日,中国在第三届“一带一路”国际合作高峰论坛期间发布《全球人工智能治理倡议》,围绕人工智能发展、安全、治理三方面系统阐述了人工智能治理中国方案。

关键字: 人工智能 大模型 代码

2024年1月11日,中国--服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM) 公布了新的公司组织架构,这项决定将从2024 年 2...

关键字: 微控制器 模拟 物联网

盘点2023,展望2024,分享目前最新市场的进展,共同探讨2024年技术发展的前景。

关键字: 模拟

2023年,AIGC给我们的工作生活带来了前所未有的生产力提升,也引爆了一波AI芯片应用。但纵观全球半导体产业,各行业复苏不及预期,市场需求持续低迷,进入L型底部。2023年虽然寒意彻骨,但2024年依然令人满怀期望。2...

关键字: ADI 模拟 BMS review2023

我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上...

关键字: 代码 嵌入式系统 软件漏洞

新富人群财务需求多元发展,投顾服务迎来新机遇 上海2023年9月20日 /美通社/ -- 2023年9月19日,上海交通大学上海高级金融学院(高金)与全球领先的金融服务机构嘉信理财(Charles Schwab)联合发...

关键字: BSP ADVANCED INA 代码

(全球TMT2023年9月14日讯)近日,国际公认的测试、检验和认证机构SGS为武汉芯必达微电子有限公司LDO产品颁发AEC-Q100认证证书。AEC-Q100认证的产品范围包括了各种类型的集成电路,如模拟、数字、混合...

关键字: LDO AEC-Q100 测试 模拟
关闭
关闭