📄 eeprom.c
字号:
/********************************************************************************/
/* filename : EEPROM.c */
/* created : xillinx */
/* descript : 处理EEPROM相关的函数 */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../EEPROM/EEPROM.h"
/********************************************************************************/
/* funname : IIC_delay() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 简单的时间延时 */
/********************************************************************************/
void IIC_delay_max(void)
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void IIC_delay_min(void)
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void IIC_delay_ms(unsigned int time)
{ unsigned int i,j;
for(i=time;i>0;i--)
{ for(j=0;j<0x1000;j++)
{ ;
}
}
}
/********************************************************************************/
/* funname : I2C_initialize() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 时钟信号和数据信号都释放变成高电平,注意先释放时钟,后释放数据更好 */
/********************************************************************************/
void I2C_initialize(void)
{ I2C_SCLK_PIN=0x0;
IIC_delay_min();
I2C_DATA_PIN=0x1;
IIC_delay_min();
I2C_SCLK_PIN=0x1;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_start() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 必须从空闲状态下,保持时钟信号为高电平,拉低数据信号 */
/********************************************************************************/
void I2C_start(void)
{ I2C_DATA_PIN=0x0; //* 启动信号
IIC_delay_min();
I2C_SCLK_PIN=0x0; //* 准备发送数据
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_stop() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 保持时钟信号为高电平,释放数据信号为高电平 */
/********************************************************************************/
void I2C_stop(void)
{ I2C_SCLK_PIN=0x1;
IIC_delay_min();
I2C_DATA_PIN=0x1;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_go_hi() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 在时钟为低时把数据置为高,然后把时钟置为高 */
/********************************************************************************/
void I2C_go_hi(void)
{ I2C_DATA_PIN=0x1;
IIC_delay_min();
I2C_SCLK_PIN=0x1;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_send_bit() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 发送一位数据给IIC器件 */
/********************************************************************************/
void I2C_send_bit(unsigned char mbit)
{ I2C_DATA_PIN=mbit;
IIC_delay_min();
I2C_SCLK_PIN=0x1;
IIC_delay_max();
I2C_SCLK_PIN=0x0;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_send_8_bits() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: 发送一位数据给IIC器件,结束之后,数据线由mdata的最后一位决定,时钟 */
/* 线输出低电平 */
/********************************************************************************/
void I2C_send_8_bits(unsigned char mdata)
{ unsigned char i;
for(i=0x0;i<0x8;i++)
{ if(mdata&0x80)
{ I2C_send_bit(0x1);
}
else
{ I2C_send_bit(0x0);
}
mdata<<=0x1;
}
I2C_DATA_PIN=0x0;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_read_ack() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之 */
/* 后,在时钟的第9个脉冲期间释放数据总线, 由接收器发送一个ACK(把数据总线的电平 */
/* 拉低)来表示数据成功接收。 */
/********************************************************************************/
unsigned char I2C_read_ack(void)
{ unsigned char num=0xFF;
I2C_DATA_PIN=0x1; //* 需要释放数据线
IIC_delay_min();
I2C_SCLK_PIN=0x1; //* 读取ACK的时钟信号
while(I2C_DATA_PIN==0x1)
{ num--;
if(num==0x0)
{ break;
}
}
I2C_SCLK_PIN=0x0;
IIC_delay_min();
I2C_DATA_PIN=0x0;
IIC_delay_min();
if(num==0x0)
{ return 0x0;
}
else
{ return 0x1;
}
}
/********************************************************************************/
/* funname : I2C_send_ack() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线接收数据时发送ACK */
/********************************************************************************/
void I2C_send_ack(void)
{ I2C_DATA_PIN=0x0;
IIC_delay_min();
I2C_SCLK_PIN=0x1;
IIC_delay_max();
I2C_SCLK_PIN=0x0;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_send_nack() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线接收数据时发送NACK */
/********************************************************************************/
void I2C_send_nack(void)
{ I2C_DATA_PIN=0x1;
IIC_delay_min();
I2C_SCLK_PIN=0x1;
IIC_delay_max();
I2C_SCLK_PIN=0x0;
IIC_delay_min();
I2C_DATA_PIN=0x0;
IIC_delay_min();
}
/********************************************************************************/
/* funname : I2C_send_1_byte() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线发送1字节数据 */
/********************************************************************************/
unsigned char I2C_send_1_byte(unsigned char mdata)
{ unsigned char status;
I2C_start();
I2C_send_8_bits(mdata);
status=I2C_read_ack();
I2C_stop();
return status;
}
/********************************************************************************/
/* funname : I2C_recv_bit() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线接收1位数据 */
/********************************************************************************/
unsigned char I2C_recv_bit(void)
{ unsigned char mbit;
I2C_SCLK_PIN=0x1; //* 准备读取数据
IIC_delay_min();
mbit=I2C_DATA_PIN;
IIC_delay_min();
I2C_SCLK_PIN=0x0; //* 贮备下一个读取数据
IIC_delay_max();
return mbit;
}
/********************************************************************************/
/* funname : I2C_recv_8_bits() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线接收8位数据 */
/********************************************************************************/
unsigned char I2C_recv_8_bits(void)
{ unsigned char i,mdata=0x0;
I2C_DATA_PIN=0x1;
for(i=0x0;i<0x8;i++)
{ mdata<<=0x1;
mdata|=I2C_recv_bit();
}
I2C_DATA_PIN=0x0;
IIC_delay_min();
return mdata;
}
/********************************************************************************/
/* funname : AT24C16_write() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线写入数据 */
/* 设备地址字节 */
/* | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | */
/* | 1 | 0 | 1 | 0 | A10 | A9 | A8 | R/W | */
/********************************************************************************/
unsigned char AT24C16_write(unsigned char page, unsigned char address, unsigned char * buffer ,unsigned char length)
{ unsigned char i;
I2C_start();
I2C_send_8_bits(AT24C16_WR_CMD|(page<<0x1));
I2C_read_ack();
I2C_send_8_bits(address);
I2C_read_ack();
for(i=0x0;i<length;i++)
{ I2C_send_8_bits(buffer[i]);
I2C_read_ack();
}
I2C_stop();
IIC_delay_ms(10);
return 0x1;
}
/********************************************************************************/
/* funname : AT24C16_read() */
/* created : xillinx */
/* time : 2008-08-06 */
/* descript: I2C总线写入数据 */
/********************************************************************************/
unsigned char AT24C16_read(unsigned char page, unsigned char address, unsigned char * buffer ,unsigned char length)
{ unsigned char addr_hi;
unsigned char i;
addr_hi=(address>>0x8)&0xFF;
I2C_start();
I2C_send_8_bits(AT24C16_WR_CMD|(page<<0x1));
I2C_read_ack();
I2C_send_8_bits(address);
I2C_read_ack(); //* 这时的时钟为低电平
I2C_go_hi();
I2C_start();
I2C_send_8_bits(AT24C16_RD_CMD|(page<<0x1));
I2C_read_ack();
for(i=0x0;i<length-0x1;i++)
{ buffer[i]=I2C_recv_8_bits();
I2C_send_ack();
}
buffer[i]=I2C_recv_8_bits();
I2C_send_nack();
I2C_stop();
IIC_delay_ms(10);
return 0x1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -