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);//发送高地址
}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;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
delay_ms(10);
}
小菜鸟以前没有单片机 所以很多弱智问题请原子哥和各位好心人帮帮忙。。
问题1
else IIC_Send_Byte( 0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
这个 0XA0+((WriteAddr/256)<<1) 怎么理解。。。
问题2 IIC_Send_Byte( WriteAddr%256); //发送低地址 这句话什么意思。。。。为什么%256
问题3 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
我知道 IIC_Start(); 是开始传输的意思 这里多次使用等待应答函数IIC_Wait_Ack(); 可是应答函数不是返回值确定应答是否成功吗(返回0和1)? 只是调用这个函数有什么意义呢?为什么 IIC_Wait_Ack();
后面又来了一次IIC_Start(); 既然没结束不是一直在传输么 为什么又来启动。。 我对照IIC传输时序图 无法理解这段程序。。。
之前有C语言的基础 大部分程序都能看懂 这边就完全不能理解了。。。。
|