rt_i2c_transfer函数发送的数据有误 0xf0

发布于 2021-06-09 22:49:13

今天使用stm32f103rb配合sort_i2c驱动对oled屏幕进行操作,发送函数如下:

i2c_bus = (struct rt_i2c_bus_device*)rt_device_find(OLED_I2C_BUS_NAME);
  
    rt_uint8_t buf[2];
    struct rt_i2c_msg msgs;
    rt_uint32_t buf_size = 2;
    msgs.addr = OLED_ADDR;    //0x78
    msgs.flags = RT_I2C_WR;
    msgs.buf = buf;
    msgs.len = buf_size;
    buf[0] = 0x00;
    buf[1] = 0xAE;
    
    rt_i2c_transfer(i2c_bus, &msgs, 1)
    

使用逻辑分析仪观察结果为0xf0
如下图所示:
image.png
请各位老师不惜赐教!

通过list_device shell指令可以看到i2c1已经成功注册,打开I2C debug开关有如下输出:

[D/I2C] send start condition
[D/I2C] NACK
[D/I2C] receive NACK from device addr 0x78 msg 0
[D/I2C] send stop condition

查看更多

关注者
0
被浏览
221
5 个回答
Aurora_zk
Aurora_zk 2021-06-10

你说的这是有啥问题?我咋没有看懂!!
请您明确一下问题所在

flashman2002
flashman2002 2021-06-10

是说每个传输数据都有误?

小小李sunny
小小李sunny 2021-06-10

无论发什么数据,实际检测都是F0,还是只发这个数据是F0?

boom
boom 2021-06-10

最终仔细研究i2c相关驱动文件发现,在发送地址时,i2c_bit_send_address函数默认将从机地址左移了一位(非10bit地址的情况),导致发送的0x78变成了0xf0,从而使得收到了nack信号,无法进行下一步,这里将要发送的地址修改为0x78>>1即可解决问题,这是因为iic协议要求最低一位表示读(1)或写(0)操作,这里需要进行写操作,所以发送0x78,但是最低一位不需要,i2c_bit_send_address函数中会根据flag帮我们补上。
感谢各位老师的帮助!

出出啊
出出啊 4 days ago

很多地方介绍设备地址的时候把读写位计算进去了,特别坑,前不久我也吃这个亏了。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览