1 常见存储器件介绍
铁电 EEPROW FLASH
共同特点 掉电后数据不丢失
各自特点
铁电 理论上可以无次擦写,操作简单,但是容量小
EEPROM 擦写次数在30W---100W,操作简单,容量中等。
FLASH 擦写次数10W---100W 操作复杂,如果要改变一个字节就得改变整个扇区,容量大
总线 以P0口为例 P0口----P7口合并为一个口则P0口就可以叫总线口
IIC总线就是 数据线和时钟线够成的串行总线,可以收发数据。主要用于连接外围存储器
IIC总线有三种类型的信号 开始信号,结束信号,应答信号
IIC 优点
1 接口直接接在组件之上,IIC总线占用空间非常小
2 支持多主机其中任何能够发送和接收的设备都可以成为主机,主控可以控制信号的传输和时钟频率。在任何一个时间点上只能有一个主机。
3 连接在IIC总线上的每个电路和模块都有唯一的地址。以唯一地址进行通信。
电路图介绍
IIC起始和终止信号
SCL为高电平期间SDL由高电平转为低电平为起始信号
SCL为高电平期间SDL由低电平转为高电平为终止信号
SCL为高电平期间SDL数据必须保持稳定,只有SCL为低电平期间SDL才允许改变
I2C起始信号编码
void I2CSTART(void)
( SDA = 1;
DELAY();
SCL = 1;
DELAY();
SDA = 0;
DELAY();
SCL = 0;
);
I2C终止信号编码
void I2CSTOP(void)
{
SCL = 0;
DELAY();
SDA = 0;
DELAY();
SCL = 1;
DELAY();
SDA = 1;
DELAY();
}
I2C数据读写与应答
I2C先传高位后传低位
主机写数据时候 每发送一个字节,接收机需要应答一个 0 通过应答来判断从机是否接收成功
主机读数据时 接收一个字节后,主机也需要发送一个 0 接收到最后一个字节时需要发非应答位1 发1 完成后在发送一个停止信号最终通信结束。
I2C写数据流程
首先 I2C起始信号,然后发送首字节,即器件地址(EEPROM地址)
2 发送存储地址 (在器件中的存储地址)
3 发送数据
写数据过程中等待应答
void write_eeprom(unsigned char addr, unsigend char databyte)
{
I2CSTART();
I2CSEND(0xa0);
I2CSEND(ADDR);
I2CSEND(DATABYTE);
I2CSTOP();
}
void I2CSEND(unsigned char byte)
{
unsigned char mask,i;
mask = 0x80;
for(i = 0;i < 8;i++)
{
SCL = 0;
DELAY();
if((mask & byte) == 0)
SDA = 0;
ELSE
SD = 1;
MASK >>= 1;
DELAY();
SCL = 1;
DELAY();
}
SCL = 0;
SDA = 1;
DELAY();
SCL = 1;
DELAY();
SCL = 0;
}
I2Cd读数据流程
首先I2C起始信号,然后发送首字节,即器件(EEPROM)地址。并且在读写方向位上选择“写操作”方向。
第二个字节,发送数据的存储地址,就是要读取的数据所存储在EEPROM中的位置。
第三个字节,重新发送I2C起始信号和器件地址,并且在方向位上选择“读操作”方向。
在前三个字节操作过程,都要等待器件给与回应一个“应答位0”
第四个字节,接收从器件发回的首字节后,单片机要主动返回一个“(非)应答位0”
特别注意:
接收器件返回数据的中间字节,主机主动返回“应答位0”,但最后一个字节,主机要返回一个“非应答位1”,以此通知从机读取数据结束,发送停位。
unsigned char read_eeprom(unsigned char addr)
{
unsigned char databyte,databyte2;
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CStart();
I2CSend(0xa1);
databyte = I2CRead();
I2CStop();
return databyte;
}
unsigned char I2CRead(void)
{
unsigned char byte, i;
byte = 0;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
byte <<= 1;
if(SDA == 1) {byte |= 0x01; }
Delay();
}
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
SCL = 0;
return byte;
}