钻石会员
主题
帖子
积分13517
阅读权限50
注册时间2010-6-12
最后登录1970-1-1
在线时间 小时
|
网上搜了下,24C02读写数据时的寻址五花八门,看起来跟datasheet里时序图的操作方法完全不同,居然还都可以正常使用。。。
下面这个移植到STM32实测完全可行,但是对着datasheet看了半天也没搞懂,红色的这三行为什么要这么复杂的操作,按照时序图不是应该先发送写硬件地址,然后发送读写地址,最后再发送读器件地址吗?为什么下面这个函数中要用读写的地址 & 0x0700右移位,再| 硬件地址& 0xFFFE?这个0x0700又是从哪来的?又是或又是与的,到最后还不就是个简单的器件地址?求大神指教!~
//读出1串数据 存放读出数据 待读出长度 待读出地址 器件类型(24c16或SD2403)
bool I2C_ReadByte(u8* pBuffer, u8 length, u16 ReadAddress, u8 DeviceAddress)
{
if(!I2C_Start())return FALSE;
I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE);//设置高起始地址+器件地址
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
I2C_SendByte((u8)(ReadAddress & 0x00FF)); //设置低起始地址 I2C_WaitAck();
I2C_Start();
I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress | 0x0001); I2C_WaitAck();
while(length)
{
*pBuffer = I2C_ReceiveByte();
if(length == 1)I2C_NoAck();
else I2C_Ack();
pBuffer++;
length--;
}
I2C_Stop();
return TRUE;
}
看datasheet时序图,不是应该像下面这样才对嘛?求解!~
uchar reda_add(uchar address)//读字节
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
|
|