初级会员

- 积分
- 121
- 金钱
- 121
- 注册时间
- 2019-7-18
- 在线时间
- 50 小时
|
发表于 2020-4-22 15:37:46
|
显示全部楼层
本帖最后由 碎步湖 于 2020-4-22 18:32 编辑
万分感谢,我按照手册调了一天都不得,一跑你的例程就成功了。 先回复一下楼上0x20的由来。手册说模块默认的7bit地址是0x10,也就是0010000,读写分别代表0/1,合并后应该0010000<<1|0x00为写,即0x20,0010000<<1|0x01为读,即0x21。
另外我也知道为什么你这边数据向前偏了一位,原因如下:
在手册中,时序是ADDR/W和ADDR/R,因为是7bit的地址,所以读写分别会在后面添加,也就是变成了0x20|0x00为写,0x20|0x01为读,对应0x20和0x21,接下来就是可以直接发送指令进行读写操作了。在你原来程序中,写函数是
IIC_Start();
IIC_Send_Byte(0X20);
IIC_Wait_Ack();
IIC_Send_Byte(0X00);
IIC_Wait_Ack();
经验证,后面的
IIC_Send_Byte(0X00);
IIC_Wait_Ack();
是可以注释掉的,同理,在读函数中
IIC_Start();
IIC_Send_Byte(0X21);
IIC_Wait_Ack();
IIC_Send_Byte(0X00);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0X21);
IIC_Wait_Ack();
前面的5行代码也可以注释掉,在都使用时意味着读操作多占用了一个时序,导致数据往后移了一个字节,而校验位也被省略掉。上述测试验证无异常,回复不方便贴图就不放图片了。
|
|