📄 eeprom连续页写模式.c
字号:
eeprom连续页写模式,5ms页写入时间(mgwmj)(点击数:822)
//E2PROM i2c通用写入子程序,可单字节写入(len=1),也可多字节页写入,内部自动分页
处理
//chip_addr:芯片首地址;len:待写数据长度;data_ptr:待写数据地址或数组首地址
void eep_page_write(unsigned int chip_addr, unsigned int len, unsigned char
*data_ptr)
{
unsigned char i, i_data;
unsigned int addr;
bit b;
if(len==0) return; addr=chip_addr; b=EA; EA=0;
do{
scl=0; sda=1; scl=1; sda=0; scl=0; //起始条件
i_data=0xa0; //芯片地址码+W
for(i=0;i<8;i++){sda=i_data&0x80; i_data=i_data<<1; scl=1; scl=0;}
sda=1; scl=1; if(sda==1)goto end; scl=0; //检测ACK应答
i_data=addr >> 8; //写高地址
for(i=0;i<8;i++){sda=i_data&0x80; i_data=i_data<<1; scl=1; scl=0;}
sda=1; scl=1; if(sda==1)goto end; scl=0; //检测ACK应答
i_data=addr & 0x00ff; //写低地址
for(i=0;i<8;i++){sda=i_data&0x80; i_data=i_data<<1; scl=1; scl=0;}
sda=1; scl=1; if(sda==1)goto end; scl=0; //检测ACK应答
do{ //写数据
i_data=*data_ptr++;
for(i=0;i<8;i++){sda=i_data&0x80; i_data=i_data<<1; scl=1; scl=0;}
sda=1; scl=1; if(sda==1)goto end; scl=0; //检测ACK应答
addr++;
}while(!(addr==chip_addr+len || addr%64==0)); //写满或到达页边界时退出
sda=0; scl=1; sda=1; //停止条件
delay(5);
}while(addr!=chip_addr+len); //未写满,换页继续
end: EA=b;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -