【已解决】PHY6222中的IIC地址怎么设置8位?

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


sandia
Posts: 61

在配置IIC的时候addr_width只有7BIT跟10BIT可选。选择了7BIT之后,发送8BIT的地址,用逻辑分析仪读出波形最后一位永远是0,而且将整个地址左移了一位,这种情况怎么解决?

Last edited by sandia on 2023年 Nov 3日 18:13, edited 2 times in total.

Tags:
sandia
Posts: 61

Re: PHY6222中的IIC地址怎么设置8位?

TUYA_IIC_BASE_CFG_T iic1_cfg = {
.role = TUYA_IIC_MODE_MASTER,
.speed = TUYA_IIC_BUS_SPEED_100K,
.addr_width = TUYA_IIC_ADDRESS_7BIT,
};
ret=tal_i2c_init(TUYA_I2C_NUM_0, &iic1_cfg);
UINT8_T IIC_send_buf[4]={0x81,0xa4,0xba,0x83};
tal_i2c_master_send(TUYA_I2C_NUM_0,0xe7,&IIC_send_buf,4);



附上IIC配置,评论发不了图片去了,这个0xe7的地址发出去用逻辑分析仪读到的是0xce;

sandia
Posts: 61

Re: PHY6222中的IIC地址怎么设置8位?

发送地址设置为1111 0111的时候,实际读到的是1110 1110;
发送地址设置为1111 0100的时候,实际读到的是1110 1000;
发送地址设置为1111 0011的时候,实际读到的是1110 0110;
最后一位怎么都没办法设置为1,请教一下有没有方法?

User avatar
逻辑的院子
Posts: 284
Contact:

Re: PHY6222中的IIC地址怎么设置8位?

IIC地址类型.jpg

如上图所示,IIC地址类型的7位模式,有时候也称作8位模式,实际上是7位地址,左移1位,而最低位是读写控制位,最低位如果是0则表示写,最低位如果是1则表示读,是IIC的标准模式,更多详细信息请参考网上的IIC相关资料。

sandia
Posts: 61

Re: PHY6222中的IIC地址怎么设置8位?

我尝试使用接收IIC函数(图一)

微信图片_20231013160212.png

也无法将地址最后一位致为1;
我手上有一块IIC通讯的屏幕,他的地址只有在0xE7的情况下才能正确的驱动,这是我用IO模拟IIC驱动的成功案例

Attachments
微信图片_20231013160300.png
User avatar
逻辑的院子
Posts: 284
Contact:

Re: PHY6222中的IIC地址怎么设置8位?

从您提供的截图中可以看到您的屏幕的地址是0x73,所以您还是按照一开始的方式,只是把地址替换为0x73应该就可以了

Code: Select all

TUYA_IIC_BASE_CFG_T iic1_cfg = {
.role = TUYA_IIC_MODE_MASTER,
.speed = TUYA_IIC_BUS_SPEED_100K,
.addr_width = TUYA_IIC_ADDRESS_7BIT,
};
ret=tal_i2c_init(TUYA_I2C_NUM_0, &iic1_cfg);
UINT8_T IIC_send_buf[4]={0x81,0xa4,0xba,0x83};
tal_i2c_master_send(TUYA_I2C_NUM_0,0x73,&IIC_send_buf,4);
sandia
Posts: 61

Re: PHY6222中的IIC地址怎么设置8位?

Code: Select all

        TUYA_IIC_BASE_CFG_T iic1_cfg = {
        .role = TUYA_IIC_MODE_MASTER,
        .speed = TUYA_IIC_BUS_SPEED_100K,
        .addr_width = TUYA_IIC_ADDRESS_7BIT,
    };
    ret=tal_i2c_init(TUYA_I2C_NUM_0, &iic1_cfg);
    UINT8_T IIC_send_buf[4]={0x81,0xa4,0xba,0x83};
    tal_i2c_master_receive(TUYA_I2C_NUM_0,0x73,&IIC_send_buf,4);

这个是按照地址0x73去写,用逻辑分析仪读到的!
仔细看一下波峰

微信图片_20231016164413.png
sandia
Posts: 61

Re: PHY6222中的IIC地址怎么设置8位?

Code: Select all

        TUYA_IIC_BASE_CFG_T iic1_cfg = {
        .role = TUYA_IIC_MODE_MASTER,
        .speed = TUYA_IIC_BUS_SPEED_100K,
        .addr_width = TUYA_IIC_ADDRESS_7BIT,
    };
    ret=tal_i2c_init(TUYA_I2C_NUM_0, &iic1_cfg);
    UINT8_T IIC_send_buf[4]={0x81,0xa4,0xba,0x83};
    tal_i2c_master_send(TUYA_I2C_NUM_0,0x73,&IIC_send_buf,4);

一样的

微信图片_20231016182236.png
User avatar
逻辑的院子
Posts: 284
Contact:

Re: PHY6222中的IIC地址怎么设置8位?

  1. 首先明确一点:因为您是使用IIC驱动屏幕,所以是写数据,所以如果用8位地址来表述,那最低位就只能是0,原因我已经在第一次回复的时候说清楚了,您也可以网上查阅相关的基础知识。
    第一次回复内容:

    IIC地址类型的7位模式,有时候也称作8位模式,实际上是7位地址,左移1位,而最低位是读写控制位,最低位如果是0则表示写,最低位如果是1则表示读,是IIC的标准模式,更多详细信息请参考网上的IIC相关资料。

  2. 根据您提供的截图,可以得出结论:您的IIC实际的地址(7位)是0x73。如果是写数据,转换为8位地址是0xE6(最低位是0),如果是读数据,转换为8位地址是0xE7(最低位是1)。
  3. 调用 tkl_i2c_master_receive 接口(其实任何IIC读接口都是)实际上也是要先写地址,再接收数据,如下图所示:
    find_oled.jpg
    这可以解释上面调用读写接口时序一样的现象,但是实际上您驱动屏幕只使用写接口就足够了。
  4. 综上,可以得出结论:您提供的截图本身是合理的,没有错误的地方,但是您要使用的IIC地址用7位描述是0x73,用8位描述应该是0xE6(写)而不是0xE7(读),所以最低位本应该是0而不是1。
Post Reply