9个员额/ 0个新员额
最后发表
jamesleo-konka
离线
最后看到:4年3个月前
加入:2017-01-22 02:42
I2C、适配器还是hw_i2c_xx

嗨,对话框
参考恩- b - 044的说法,调用底层的硬件,最好通过适配器的方式进行,比如I2C总线,以这种方式调用:
ad_i2c_open

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

ad_i2c_close

但是演示程序peripherals_demo的方法却是

hw_i2c_init
hw_i2c_write_byte (HW_I2C1 reg);
hw_i2c_write_buffer_sync
。。。

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

谢谢

设备:
Qinjiny_Dialog
离线
最后看到:2个月2周以前
工作人员
加入:2016-11-01 05:47
你好,

你好,

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

BR,

jamesleo-konka
离线
最后看到:4年3个月前
加入:2017-01-22 02:42
嗨,对话框中,

嗨,对话框中,
折腾两星期,好不容易代码进展了一点点。。。还被peripherals_demo的例程给绕晕了,
基于适配器的I2C操作,回顾一下流程:
先要
I2C_BUS (I2C1)
I2C_SLAVE_DEVICE(I2C1, BME280, 0x76, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_STANDARD);/ /添加设备,只是不知BME280在哪里预先定义的
I2C_BUS_END
然后
i2c_device开发;
static char wbuf[5] = "测试";
char rbuf [5];
dev = ad_i2c_open (BME280);/*打开指定的设备*/
ad_i2c_bus_acquire (dev);/*获取访问总线的权限*/
ad_i2c_write (dev, wbuf sizeof (wbuf));/ *同步写一些数据I2C设备* / / /——这里将产生开始,并自动发送奴隶地址(写),并发送reg地址,写入数据
Ad_i2c_read (dev, rbuf, sizeof(rbuf), 100);/ *读取从I2C设备同步数据* / / /这里I2C改变方向,会自动发送重启,发送奴隶地址(读),发送reg地址,读取数据,产生停止
ad_i2c_bus_release (dev);/ *释放I2C
ad_i2c_close (dev);/*关闭所选设备*/

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

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

谢谢

index219
离线
最后看到:1年8个月前
加入:2016-05-23 07:00
原厂建议直接使用适配器ad_xx的,我2种模式下都可以使用

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

WaltWang
离线
最后看到:6个月1天前
加入:2017-01-05 06:53
好的,我这里用ad_xx的函数库去操作串口可以使用了,谢谢

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

kingwheat
离线
最后看到:1年2个月前
加入: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个,但是可能其中的某一帧数据丢失掉了,提前执行了停止。有遇到这种情况吗?
@index219, @jamesleo-konka

alanbian
离线
最后看到:3年2个月前
加入:2017-11-07 08:02
碰到了类似的情况, 有解决这个问题么?

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

jamesleo-konka
离线
最后看到:4年3个月前
加入:2017-01-22 02:42
嗨kingwheat,

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

kingwheat
离线
最后看到:1年2个月前
加入:2016-12-08 09:21
嗨,jamesleo-konka

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