EEPROM(带电可擦可编程只读存储器)是用户可更改的只读存储器,可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程 。-(来自百度)
该芯片特性(AT93C46):
1、高速操作,最大速度3MHZ的读写操作。
2、1KB的存储空间。
3、宽电压输入(1.8V-6V)。
4、可通过ORG(6脚)来选择8位-16位数据流
5、上电写保护功能
6、1百万个编程周期
7、100年的数据保存寿命
01引脚连接及时序
管脚名称 | 功能 |
---|---|
CS(1) | 芯片片选信号(高电平有效) |
SK(2) | 数据传输的时钟信号 |
DI(3) | 串行数据输入 |
DO(4) | 串行数据输入 |
GND(5) | 电源地 |
ORG(6) | 数据位选择(GND:8Bit数据流 VCC:16位数据流) |
NC(7) | 空脚 |
VCC(8) | +1.8V-6V电压 |
内部结构:
MCU为STM32F03
连接方式如图:
C93_CS->CS
C93_SCK->SCK
C93-DI->DI
C93_DO->DO(引脚配置为输入模式)
除DO引脚配置为输入模式外,其余引脚均配置为输出模式。
时序图:
写时序:
读时序:
写保护使能(Disable):
去写保护:(Enable)
另外还有几条指令我们需要知道的
写入的数据包含1位开始位两位操作位及地址位。
02编程方法操作
因为擦除等指令需要4.5V上的电压这里提供不了,所以并没有使用,但是写入数据的时候会自动覆盖原先数据,所以不用担心
其代码如下:
/****************************************/
/*****AT93C46 EEPROM 驱动 8Bit数据流 ****/
/****************************************/
//2021.09.03 羊羊课代表By DDY
//读取及写入需要存在一定时间间隔,请注意。
void Start_Bit()//写入开始位
{
AT93C_CS_L;
AT93C_CLK_L;
AT93C_DI_H; //待写入1
AT93C_CS_H;//选中芯片
AT93C_CLK_H;
AT93C_CLK_L;//给时钟信号
AT93C_DI_L;//置位引脚
}
void AT93_Clock()//时钟信号
{
AT93C_CLK_H;
HAL_Delay(1);
AT93C_CLK_L;
}
void AT93_Send_9_Dat(uint16_t Data)
{
for(uint8_t i=0;i< 9;i++)//加上面的开始位
{ //送进的格式为1 01XXXXXXX 指令加地址
if(Data&(0x100 > >i))
AT93C_DI_H;
else AT93C_DI_L;
AT93_Clock();
}
}
void AT93C_Enable(uint8_t Bit)
{
uint8_t Temp=0;
if(Bit) Temp=0x98;//Enable写使能
else Temp=0x80; //Disable写禁使能
AT93C_CS_L;//引脚电平重置
AT93C_CLK_L;//引脚电平重置
AT93C_CS_H;//选中芯片
for(uint8_t i=0;i< 10;i++)//发送10位指令
{
if(Temp&0x80 > >i)
AT93C_DI_H ;
else AT93C_DI_L;
AT93_Clock();
}
AT93C_CS_L;//置低降低功耗
AT93C_DI_L;
}
void AT93C_Write(uint8_t Addr,uint8_t Data)
{
AT93C_Enable(1);//写使能
Addr|=0x80;//数据变为1XXXXXXX
Start_Bit(); //写一个开始位
AT93_Send_9_Dat(Addr);
AT93C_DI_L;
for(uint8_t i=0;i< 8;i++) //送进8Bit数据
{
if(Data&(0x80 > >i))
AT93C_DI_H;
else AT93C_DI_L;
AT93_Clock();
}
AT93C_CS_L;//置低降低功耗
AT93C_Enable(0); //禁写使能
}
uint8_t AT93C_Read(uint8_t Addr)//读该地址的8Bit数据
{
uint8_t Data=0;
AT93C_Enable(1);
Start_Bit();
AT93_Send_9_Dat((0x7f&Addr)|0x100);//数据变成10XXXXXXX;
AT93_Clock();
for(uint8_t i=0;i< 8;i++)//接收8位数据
{
if(AT93C_ReadDO)
{
Data|=0x80 > >i;
}
AT93_Clock();
}
AT93C_CS_L;//置低降低功耗
AT93C_Enable(0);
return Data;
}
//extern char str[20];
//void Test()
//{
// temp=AT93_Read(0x01);
// sprintf(str,"%03d",temp);
// OLED_Show_Str(96,0,str,Font8x16,0);
// Updata_OLED();
// HAL_Delay(100);
// temp+=1;
// AT93C_Write(0x01,temp);
//}
全部0条评论
快来发表一下你的评论吧 !