ESP8266之24C02 IIC驱动代码

#define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_MTDI_U
#define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
#define I2C_MASTER_SDA_GPIO 12
#define I2C_MASTER_SCL_GPIO 14
#define I2C_MASTER_SDA_FUNC FUNC_GPIO12

#define I2C_MASTER_SCL_FUNC FUNC_GPIO14



#define EEPROM_I2C_ID 0xA0
#define EEPROM_SIZE 256




#define foreach(i, n) for(i = 0; i < (n); ++i)


#define i2c_sim_start i2c_master_start
#define i2c_sim_stop i2c_master_stop






static UINT8 IicAck = 1;




char ICACHE_FLASH_ATTR i2c_sim_check_ack(void)
{
    if(IicAck)
{
        return FALSE;
    }
else
{
        return TRUE;
    }
}






char ICACHE_FLASH_ATTR i2c_sim_write_byte(u8 dat)
{
i2c_master_writeByte(dat);
IicAck = i2c_master_getAck();
}








/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR i2c_sim_write(u8 id, u8 addr, u8 dat)
{
char ackFlag;
i2c_sim_start();
i2c_sim_write_byte(id);
i2c_sim_write_byte(addr);
i2c_sim_write_byte(dat);
i2c_sim_stop();
ackFlag = i2c_sim_check_ack();
return ackFlag;
}








/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR i2c_sim_burst_write(u8 id, u8 addr,u8 *p, int n)
{
int i;
char ackFlag;
i2c_sim_start();
i2c_sim_write_byte(id);
i2c_sim_write_byte(addr);
foreach(i, n)
{
i2c_sim_write_byte(*p++);
}
i2c_sim_stop();
ackFlag = i2c_sim_check_ack();
return ackFlag;
}








u8 ICACHE_FLASH_ATTR i2c_sim_read_byte(char lastFlag)
{
u8 dat = 0;
dat = i2c_master_readByte();
if(lastFlag)
{
i2c_master_setAck(1);//NACK
}
else
{
i2c_master_setAck(0);//ACK
}
return dat;
}








/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR i2c_sim_burst_read(u8 id, u8 addr,u8 *p, int n)
{
int k;
char ackFlag;
i2c_sim_start();
i2c_sim_write_byte(id);
i2c_sim_write_byte(addr);
i2c_sim_stop();
ackFlag = i2c_sim_check_ack();
if(ackFlag)
{


}
else
{
return 0;
}

i2c_sim_start();
i2c_sim_write_byte(id | 1);
for(k = 0; k < n; ++k)
{
*p++ = i2c_sim_read_byte( k ==(n-1) );
}
i2c_sim_stop();
ackFlag = i2c_sim_check_ack();

return ackFlag;
}








/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR i2c_sim_read(u8 id, u8 addr, char *p)
{
char ackFlag;
*p = i2c_sim_burst_read(id, addr, p, 1);
ackFlag = i2c_sim_check_ack();
return ackFlag;
}










/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR e2prom_write (int adr, u8 *p, int len)
{
char ret;
int i = 0;
while(len > 0)
{
int l = len >= 8 ? 8 : len; //page write: 8-byte
len -= l;
ret = i2c_sim_burst_write(EEPROM_I2C_ID, adr + i, p + i, l);
if(ret)
{


}
else
{
return 0;
}
i += l;
os_delay_us(5000);
}
return 1;
}






/*
0:失败
1:成功
*/
char ICACHE_FLASH_ATTR e2prom_read (int adr, u8 *p, int len)
{
char ret;
ret = i2c_sim_burst_read(EEPROM_I2C_ID, adr, p, len);
return ret;
}








void ICACHE_FLASH_ATTR e2prom_init()
{
u8 i;
//i2c_sim_reset_e2prom();
u8 eraseByte[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
for(i=0;i<=EEPROM_SIZE/8;i++)
e2prom_write(i*8,eraseByte,8);
}












void ICACHE_FLASH_ATTR e2prom_test(void)
{
char ret;
char iicData[128]={0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,};
static char initFlag = 0;
if(initFlag)
{


}
else
{
e2prom_write(0x00, iicData, 8);
initFlag = 1;
return;
}
ret = e2prom_read(0x00, iicData, 8);
os_printf(".....iic test ret:%d...........\n", ret);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值