📄 i2c.txt
字号:
//EEPROM start
void EEP_start(void)
{
*pdddr|=0x0030; //SDA,SCL为输出方式
delly(50);
asm(nop);
*pddr|=EEP_SDA;
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
*pddr&=~EEP_SDA;
delly(50);
asm(nop);
*pddr&=~EEP_SCL;
delly(50);
asm(nop);
}
//EEPROM stop
void EEP_stop(void)
{
delly(50);
asm(nop);
*pddr&=~EEP_SDA;
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
*pddr&=~EEP_SDA;
delly(50);
asm(nop);
*pddr|=EEP_SDA;
delly(50);
asm(nop);
*pddr&=~EEP_SCL;
delly(50);
asm(nop);
}
//EEPROM ack
byte EEP_ack(void)
{
byte return_val;
delly(50);
asm(nop);
*pdddr&=~EEP_SDA; //GPIOD方向寄存器 0--输入
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
return_val=*pddr&EEP_SDA;
asm(nop);
*pddr&=~EEP_SCL;
asm(nop);
delly(50);
*pdddr|=EEP_SDA; //GPIOD方向寄存器 1--输出
delly(50);
asm(nop);
return return_val;
}
//向EEPROM送命令、数据
//输入:data
void EEP_send_byte(byte data)
{
word i;
for(i=0;i<8;i++){
delly(50);
asm(nop);
if(data & 0x80) {
*pddr|=EEP_SDA;
}
else{
*pddr&=~EEP_SDA;
}
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
*pddr&=~EEP_SCL;
delly(50);
asm(nop);
data<<=1;
asm(nop);
}
}
//向EEPROM送入0,应答eeprom读出数据
void EEP_send_bit0(void)
{
*pddr&=~EEP_SDA;
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
*pddr&=~EEP_SCL;
delly(50);
asm(nop);
}
//从EEPROM取1BYTE数据
//输入:data
byte EEP_rec_byte(void)
{
word i;
byte EEPdata;
EEPdata=0;
delly(50);
asm(nop);
*pdddr&=~EEP_SDA; //GPIOD方向寄存器 0--输入
delly(50);
asm(nop);
*pddr|=EEP_SDA;
delly(50);
asm(nop);
for(i=0;i<8;i++){
EEPdata<<=1;
delly(50);
asm(nop);
*pddr|=EEP_SCL;
delly(50);
asm(nop);
if(*pddr & EEP_SDA)EEPdata++;
delly(50);
asm(nop);
*pddr&=~EEP_SCL;
asm(nop);
}
*pdddr|=EEP_SDA; //GPIOD方向寄存器 1--输出
asm(nop);
return EEPdata;
}
//写串行eeprom数据串写
//输入:E_data--要写数据的指针,num--要写数据的个数,EW_point--页数
//输出:
word write_eeprom(word *E_data,word num,word EW_point)
{
word i;
word E_add;
delay_eeprom=0;
E_add=EW_point*32;
EEP_start();
EEP_send_byte(0xa0);
EEP_ack();
EEP_send_byte(E_add/256);
EEP_ack();
EEP_send_byte(E_add%256);
EEP_ack();
for(i=0;i<num;i++){
EEP_send_byte(E_data[i]);
delly(50);
asm(nop);
EEP_ack();
}
EEP_stop();
return 0;
}
//读串行eeprom数据
//输入:num--要读数据的个数,ER_point--页数
//输出:E_rd_data--读出的数据
word read_63_eeprom(word num,word ER_point)
{
word i;
word E_add;
E_add=ER_point*32;
for(i=0;i<32;i++){
E_rd_data[i]=0;
}
EEP_start();
EEP_send_byte(0xa0);
EEP_ack();
EEP_send_byte(E_add/256);
EEP_ack();
EEP_send_byte(E_add%256);
EEP_ack();
EEP_start();
EEP_send_byte(0xa1);
EEP_ack();
for(i=0;i<num-1;i++){
E_rd_data[i]=EEP_rec_byte();
delly(50);
asm(nop);
EEP_send_bit0();
asm(nop);
delly(50);
}
E_rd_data[num-1]=EEP_rec_byte();
EEP_stop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -