我正在将一个名为i2cdevlib
的arduino的知名库移植到我的嵌入式系统中。我遇到了一个问题,实际上这个时间远不是第一个,当函数接口看起来像:
void function(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len);
我需要做的是首先将dev_addr
写入i2c总线然后reg_addr
然后data
。但是用于将数据发送到i2c总线的i2c驱动程序(我使用Keil MDK包中的一个)功能有这样的定义:
void send_i2c(uint8_t dev_addr, uint8_t *data, uint8_t len);
由于一些i2c属性,我无法按顺序调用它。因此,每当调用function
时,我必须创建新数组,将第一项设置为reg_addr
,然后将memcpy data
设置为它,看起来很糟糕,似乎效率不高(说实话)使用这些传感器时,数据流量非常小,但是......)。但是,除了修改i2c驱动程序或编写新驱动程序之外,我看不到另一种解决方案,但我不想仅仅因为一个功能而重写可持续和经过测试的驱动程序。
那么有没有办法在不这样做的情况下改进这个解决方案呢?
答案 0 :(得分:0)
问题在于I2CDevLib的实现方式。它不应强制用户指定寄存器地址,因为I2C协议不强制要求写入8位寄存器地址。大多数设备都可以,但有些可能没有。
您最终需要做的是发送寄存器地址然后发送有效负载而不发送任何停止位。您应该看看Keil MDK是否具有I2C功能,允许您在不中断传输的情况下每字节发送数据字节。这样,您的函数可以分别发送寄存器地址,然后再发送有效负载的每个字节。
这引入了多个函数调用的开销,除非这些调用由编译器内联。如果这些电话很简单,那么它们应该被内联,但不能保证它们会被记录下来。
您可以做的另一件事是深入研究MCU的手册,找到I2C寄存器,它们如何工作以及实现您自己的I2C例程。但这需要你做更多的工作。