IIC程序问题
最近看IIC程序有个地方不太明白请各位指教一番谢谢啦!!!//在AT24CXX指定地址读出一个数据//ReadAddr:开始读数的地址//返回值:读到的数据u8AT24C...
最近看IIC程序有个地方不太明白请各位指教一番谢谢啦!!!
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0; IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
这段程序中的IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 这句话怎么理解啊?
我知道要先写入0XA0之后再写入地址,怎么一次写入了2个字节的东西啊?为什么ReadAddr/256)<<1还左移一位啊???我明白ReadAddr/256是地址的高位。 展开
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0; IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
这段程序中的IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 这句话怎么理解啊?
我知道要先写入0XA0之后再写入地址,怎么一次写入了2个字节的东西啊?为什么ReadAddr/256)<<1还左移一位啊???我明白ReadAddr/256是地址的高位。 展开
4个回答
展开全部
ReadAddr是个16bit的数据,可分为高8bit和低8bit
两个可能:
1.高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2.高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上 是我的理解 可能有所偏差
两个可能:
1.高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2.高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上 是我的理解 可能有所偏差
展开全部
ReadAddr是个16bit的数据,可分为高8bit和低8bit
两个可能:
1.高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2.高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上
是我的理解
可能有所偏差
两个可能:
1.高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2.高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上
是我的理解
可能有所偏差
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0XA0+((ReadAddr/256)<<1)); 这个只是一个字节。程序在执行的时候是先计算,然后再执行发送的任务的。这个命令字节应该是由几部分组成的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0XA0+((ReadAddr/256)<<1));
这个只是一个字节。程序在执行的时候是先计算,然后再执行发送的任务的。这个命令字节应该是由几部分组成的
这个只是一个字节。程序在执行的时候是先计算,然后再执行发送的任务的。这个命令字节应该是由几部分组成的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询