垂柳工作室 发表于 2024-2-16 14:21:50

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

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 => P
                                        p++;
                                        if( number!=1 )
                                                IIC_SENDACK();
                              }
                              while(--number);
                              IIC_SENDNACK();
                        }
                }               
      }
      IIC_STOP();      
}

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


王昱顺 发表于 2024-2-16 14:44:27

首先回答是否可行的问题,0x01是十六进制表示方式,与1等效
其次回答包含方向位的问题。
一般来说IIC有两种表示地址的方式。
第一种是分成读地址和写地址,比如说0x80和0x81就是一对读写地址。这样可以直接发送
第二种是使用高7位作为地址,最后一位换成1或者0。比如上面的地址0x80,+0可以表示读,+1可以表示写

垂柳工作室 发表于 2024-2-16 22:46:39

谢谢讲解

电子DIY小家 发表于 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的话就容易遗漏了

垂柳工作室 发表于 2024-2-18 08:53:30

{:handshake:}
页: [1]
查看完整版本: 复习冲哥I2C总线读写函数的疑问