9 posts / 0 new
Last post
jamesleo-konka
Offline
Last seen:4 years 1 month ago
加入:2017-01-22 02:42
I2C, adapter 还是 hw_i2c_xx

Hi, Dialog
参考UM-B-044的说法,调用底层的硬件,最好通过 adapter 的方式进行,比如I2C总线,以这种方式调用:
ad_i2c_open

ad_i2c_bus_acquire(dev);
ad_i2c_write(...);
ad_i2c_transact(...);
ad_i2c_bus_release(dev);

ad_i2c_close

但是demo程序 peripherals_demo 的方法却是

hw_i2c_init
hw_i2c_write_byte(HW_I2C1, reg);
hw_i2c_write_buffer_sync
。。。

到底正确的应该怎样? 或者是两者都可以? 各自的优劣?

谢谢

Device:
Qinjiny_Dialog
Offline
Last seen:3 weeks 5 days ago
Staff
加入:2016-11-01 05:47
你好,

你好,

查看adapter的i2c相关函数可以看到它们调用了底层硬件的hw_i2c函数。adapter功能包含了一些电源管理,多任务并行检测等等错误保护功能,适用于大多数情况,尤其是在相对复杂的系统环境中使用,可以避免需要单独针对i2c功能进行其他额外的配置和修改。而hw_i2c这些函数功能就相对单一,不适合在不完全熟悉系统的情况下随意使用。当然,在peripheral demo这种没有休眠或者其他复杂BLE task确保不会引发相关错误的环境下可以使用

BR,

jamesleo-konka
Offline
Last seen:4 years 1 month ago
加入:2017-01-22 02:42
Hi Dialog,

Hi Dialog,
折腾两星期,好不容易代码进展了一点点。。。还被 peripherals_demo 的例程给绕晕了,
基于 adapter的 I2C 操作,回顾一下流程:
先要
I2C_BUS(I2C1)
I2C_SLAVE_DEVICE(I2C1, BME280, 0x76, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_STANDARD); //添加设备, 只是不知 BME280 在哪里预先定义的
I2C_BUS_END
然后
i2c_device dev;
静态字符wbuf[5] =“测试”;
char rbuf[5];
dev = ad_i2c_open(BME280); /* Open selected device */
ad_i2c_bus_acquire(dev); /* Acquire access to bus */
ad_i2c_write(dev, wbuf, sizeof(wbuf)); /* Write synchronously some data to I2C device *///--这里将产生START,并自动发送SLAVE地址(写),并发送reg地址,写入数据
ad_i2c_read(dev, rbuf, sizeof(rbuf), 100); /* Read synchronously the data from I2C device */ //这里I2C改变方向,会自动发送 RESTART,发送SLAVE地址(读),发送reg地址,读取数据, 产生STOP
ad_i2c_bus_release(dev); /*Release the I2C
ad_i2c_close(dev); /* Close selected device */

问题:
1. ad_i2c_init 何时使用? 在 peripherals_demo 里面也没有搜到哪里调用。
2. 上述代码后面的中文注释(我的理解),是否正确? 尤其是 RESTART 的产生。 (系统默认 RESTART是开启的)
3. ad_xx 貌似在 TASK启动以后使用,也就是在多任务环境下使用。 那么上电的时候,需要对I2C芯片做初始化,还是使用 ad_xx 吗? task没有创建的时候,使用 ad_xx 有没有问题?
4. 如果要一次写入某个设备的一个寄存器,是不是该这样:
ad_i2c_write(dev, wbuf, 2); // 2 byte, 第一个是 reg 地址, 第二个是 data

eeprom_24xx256.c 里面,好多函数, ad_xxx 与 hw_xxx 混合使用,真是让用户一片混沌,不知要写 hw_xx 呢还是在上层调用 ad_xx 呢?

谢谢

index219
Offline
Last seen:1 year 5 months ago
加入:2016-05-23 07:00
原厂建议直接使用适配器ad_xx的,我2种模式下都可以使用

原厂建议直接使用适配器ad_xx的,我2种模式下都可以使用,只是操作细节上多注意就好了。还是采纳了官网说的ad_xx

WaltWang
Offline
Last seen:3 months 1 week ago
加入:2017-01-05 06:53
好的,我这里用ad_xx的函数库去操作串口可以使用了,谢谢

好的,我这里用ad_xx的函数库去操作串口可以使用了,谢谢

kingwheat
Offline
Last seen:1 year 3 days ago
加入:2016-12-08 09:21
ad_i2c_open

ad_i2c_open

ad_i2c_bus_acquire(dev);
ad_i2c_write(...);
ad_i2c_transact(...);
ad_i2c_bus_release(dev);

ad_i2c_close

我是用的这种方式来给oled 屏幕写数据,但是发过去的数据有时会少掉一些,例如发送5帧数据,每帧128个,但是可能其中的某一帧数据丢失掉了,提前执行了stop。有遇到这种情况吗?
@index219,@jamesleo-konka

alanbian
Offline
Last seen:2 years 11 months ago
加入:2017-11-07 08:02
碰到了类似的情况, 有解决这个问题么?

碰到了类似的情况, 有解决这个问题么?

jamesleo-konka
Offline
Last seen:4 years 1 month ago
加入:2017-01-22 02:42
Hi kingwheat,

Hi kingwheat,
我的I2C部分好像还可以,比较正常,是的芯片接口也是3.3V的吗?
简化一下
ad_i2c_open
ad_i2c_write(...); // 包含了 ad_i2c_bus_acquire
ad_i2c_read(...);
ad_i2c_close

kingwheat
Offline
Last seen:1 year 3 days ago
加入:2016-12-08 09:21
Hi, jamesleo-konka

Hi, jamesleo-konka
我的IIC器件是oled SSD1306, VDD 是1.65--3.3V,应该没什么问题。大部分情况显示正常,就是偶尔会花一下。我的IIC使用的是400KHZ 的。应该不会太快吧,我改成100K也是会花屏。。。