请教一下 i2c 从机地址的问题?
入手了一个 LCD1602_RGB 的数据显示板:
之后查询文档其从机地址为:
但是在实际提供的代码这个地方:
0x7c>>1 向右边移了一位
我不太理解这个操作,才刚刚进行单片机开发,不太理解这个地方,希望谁可以帮忙解答一下 (^∀^●)ノシ
回复
1个回答

test
2024-07-17
先说结论:代码中的地址定义之所以把规格书中的地址右移一位,是因为你现在参考的这份代码的I2C操作函数定义的I2C地址格式是7bit的原因。
既然题主是新手,就稍微啰嗦解释一下,如果有的信息已经知道了直接跳过就好。I2C实际操作中,读写操作都是由host发起,为了slave能区分来自host的读写,读写指令开头的slave地址是不同的。这里看题主自己贴的规格书,规格书中Slave address是8bit,其中最低位的bit是R/W,也就是读写位。0表示写,1表示读。也就是说,对于这块LCD,写地址是0x7C,读地址是0x7D。
这里就引入了I2C地址的两种定义格式,7bit和8bit地址,主要看代码中的函数对于I2C地址的操作方式上的区别。
8 bit
对于使用8bit格式的读写函数,从机地址一般直接定义为写地址,也就是0x7C。当需要读操作的时候,把从机地址直接+1
7 bit
对于使用7bit格式的读写函数,会将从机地址先右移一位(忽略R/W位)存储。需要操作I2C时,则先将7bit地址左移一位,最低位bit根据读写情况置0或者1。题主正在参考的代码应该就是这种情况,翻翻后边的函数可以看到在实际操作的时候会对SLAVE address执行了左移一位操作。
所以两种格式仅仅时定义上的区别,体现在时序层面上是一致的。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容