uint32_t Eeprom_Read(uint16_t reg_addr)
{
uint8_t xdata data_num = 4; //送4次数据
uint32_t xdata reg_data = 0;
reg_addr = reg_addr * 4;
SICON |= STA; //起始信号
SICON &= ~SI;
while((SICON & SI) != SI);
SICON &= ~STA;
SIDAT = dev_addr; //设备地址(写)
SICON &= ~SI;
while((SICON & SI) != SI);
SIDAT = (uint8_t)(reg_addr >> 8); //数据地址(高位)
SICON &= ~SI;
while((SICON & SI) != SI);
SIDAT = (uint8_t)reg_addr; //数据地址(低位)
SICON &= ~SI;
while((SICON & SI) != SI);
SICON |= STA; //开始信号
SICON &= ~SI;
while((SICON & SI) != SI);
SICON &= ~STA;
SIDAT = dev_addr | 0x01; //设备地址(读)
SICON &= ~SI;
while((SICON & SI) != SI);
while(data_num--)
{
SICON &= ~SI; //读数据
while((SICON & SI) != SI);
while(SDA != 1);
reg_data <<= 8;
reg_data += SIDAT;
}
SICON |= STO; //停止信号
SICON &= ~SI;
while((SICON & STO) == STO);
return reg_data;
}
|