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

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 09:22
  • 签到天数: 104 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    243

    积分

    中级会员

    积分
    243
    发表于 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
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:05
  • 签到天数: 123 天

    [LV.7]常住居民III

    33

    主题

    397

    回帖

    2048

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:22
  • 签到天数: 104 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    243

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6971

    积分

    荣誉版主

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

    积分
    6971
    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的话就容易遗漏了

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:22
  • 签到天数: 104 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    243

    积分

    中级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 02:18 , Processed in 0.062450 second(s), 49 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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