找回密码
 立即注册
查看: 708|回复: 4

复习冲哥I2C总线读写函数的疑问

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-05-02 06:28:49

24

主题

108

回帖

452

积分

中级会员

积分
452
发表于 2024-2-16 14:21:50 | 显示全部楼层 |阅读模式
void IIC_Read_NByte( u8 slave,u8 addr,u8 *p,u8 number )        //iic读取连续的几个字节
{
        IIC_START();
        IIC_SENDBYTE(slave);
        IIC_WAITACK();
        if( !ack )
        {
                IIC_SENDBYTE(addr);
                IIC_WAITACK();
                if( !ack )
                {
                        IIC_START();
                        IIC_SENDBYTE(slave+0x01);        
                        IIC_WAITACK();
                        if( !ack )
                        {
                                do
                                {
                                        *p = IIC_READBYTE();        //P[0] => P[1]
                                        p++;
                                        if( number!=1 )
                                                IIC_SENDACK();
                                }
                                while(--number);
                                IIC_SENDNACK();
                        }
                }               
        }
        IIC_STOP();        
}

其中:IIC_SENDBYTE(slave+0x01);这句有疑惑。芯片手册上没找到答案(新手不晓得查);后来百度查看了iic从机地址组成介绍获悉,最低一位是方向位,0表示对器件读,1表示对器件写。
那么IIC_SENDBYTE(slave+0x01)中slave是一个字节8位数,iic从机地址是7位数+1位方向位,函数传递slave地址不是已经包含了方向位了吗,为何还要+0x01?直接IIC_SENDBYTE(slave+1)是否可行?为啥?


截图202402161408338473.jpg
截图202402161417269404.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-2-16 14:44:27 | 显示全部楼层
首先回答是否可行的问题,0x01是十六进制表示方式,与1等效
其次回答包含方向位的问题。
一般来说IIC有两种表示地址的方式。
第一种是分成读地址和写地址,比如说0x80和0x81就是一对读写地址。这样可以直接发送
第二种是使用高7位作为地址,最后一位换成1或者0。比如上面的地址0x80,+0可以表示读,+1可以表示写
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-05-02 06:28:49

24

主题

108

回帖

452

积分

中级会员

积分
452
发表于 2024-2-16 22:46:39 | 显示全部楼层
谢谢讲解
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-2-18 08:33:25 | 显示全部楼层
“IIC_SENDBYTE(slave+0x01);这句有疑惑。芯片手册上没找到答案(新手不晓得查);后来百度查看了iic从机地址组成介绍获悉,最低一位是方向位,0表示对器件读,1表示对器件写。
那么IIC_SENDBYTE(slave+0x01)中slave是一个字节8位数,iic从机地址是7位数+1位方向位,函数传递slave地址不是已经包含了方向位了吗,为何还要+0x01?直接IIC_SENDBYTE(slave+1)是否可行?为啥?”   
一般来说器件的的设备地址是一个固定的字节,假设某个器件的设备地址是0x50(七位二进制数),按照“iic从机地址是7位数+1位方向位”来说就是写入的时候这个地址是0XA0(即0x50<<1 | 0),读取的时候就是0xA1,因为读写的时候都需要0x50<<1,所以这里一般会把地址(也就是slave)直接定义为0xa0,那么写入没问题,读取的时候就要+1,直接IIC_SENDBYTE(slave+1)也可以,但是看着比较冗余,尤其是这条总线上多几个IIC器件的时候,明明写一个地址就搞定了,每次都要在+1的话就容易遗漏了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-05-02 06:28:49

24

主题

108

回帖

452

积分

中级会员

积分
452
发表于 2024-2-18 08:53:30 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 07:08 , Processed in 0.130195 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表