3线串行数据通讯EEPROM的使用

描述

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);  
//}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分