AT93C46 SPI接口EEPROM读写程序

发布者:平凡梦想最新更新时间:2018-01-09 来源: eefocus关键字:AT93C46  SPI接口  EEPROM  读写程序 手机看文章 扫描二维码
随时随地手机看文章

//-----------------------函数声明-------------------------------------------------------- 
#include "reg51.h" 
#include "intrins.h" 
//-----------------------管脚声明-----www.pICavr.com------------------------------------- 

sbit CS_93=P1^0; 
sbit CLK_93=P1^1; 
sbit DI_93=P1^2; 
sbit DO_93=P1^3; 
sbit VCC_93=P1^4; 
#define READ_c   0x02 
#define WRITE_c  0x01 
#define ERASE_c  0x03 
#define EWEN_c   0x00 
#define EWDS_c   0x00 
#define ERAL_c   0x00 
#define WRAL_c   0x00 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: delay 
// 入口参数: N 
// 函数功能:延时子程序,实现(16*N+24)us的延时  
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动 
//-------------------------------------------------------------------------------------------------- 
  void delay(unsigned  int N)   
  { 
  int i;  
  for(i=0;i  } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_1 
// 函数功能: 送1位数据"1" 
//-------------------------------------------------------------------------------------------------- 
void SEND_1(void) 
      {  
      DI_93=1;  
      CLK_93=1;  
      _nop_();  
      CLK_93=0; 
      _nop_(); 
      } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_0 
// 函数功能: 送1位数据"0" 
//-------------------------------------------------------------------------------------------------- 
void SEND_0(void) 
        {  
         DI_93=0;  
         CLK_93=1; 
         _nop_(); 
         CLK_93=0; 
         _nop_(); 
         } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_0 
// 函数功能: 送1位数据"0" 
//-------------------------------------------------------------------------------------------------- 
void start_operation(unsigned char operation_code) 
        {  
         CS_93=1;  
          SEND_1();                   //起始位 
          if (operation_code&0x02)    //操作码 
          SEND_1();  
          else  
          SEND_0(); 
          if (operation_code&0x01)  
          SEND_1();  
          else  
          SEND_0(); 
         } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_BYTE 
// 入口参数: dd,待发送的数据 
// 函数功能: 送1BYTE数据 
//-------------------------------------------------------------------------------------------------- 
void SEND_BYTE(unsigned char dd) 
     {  
      unsigned char i;  
      for (i=0;i<8;i++)  
          { 
          if (dd>=0x80) SEND_1();  
          else SEND_0(); 
          dd=dd<<1;  
          } 
     } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: RECEIVE_BYTE 
// 返回值:   dd,待接收的数据 
// 函数功能: 送1BYTE数据 
//-------------------------------------------------------------------------------------------------- 
unsigned char RECEIVE_BYTE(void) 
              { 
              unsigned char i,dd;  
              DO_93=1; 
              for (i=0;i<8;i++)  
              {  
              dd<<=1;  
              CLK_93=1;_nop_(); 
              CLK_93=0;_nop_();  
              if (DO_93) dd|=1;  
              }  
              return(dd); 
             } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: EWEN 
// 函数功能: 擦/写允许指令 
// 捎谠谏系绺次缓螅珹T93CXX首先将处于擦/写不允许状态。 
// 故该指令必须在所有编程模式前执行,一旦该指令执行后, 
// 只要外部没有断电就可以对芯片进行编程。 
//-------------------------------------------------------------------------------------------------- 
void EWEN(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(EWEN_c);  
           SEND_BYTE(0xC0);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称:EWDS 
// 函数功能: 擦写截止 
// 使用该指令可对写入的数据进行保护 
//-------------------------------------------------------------------------------------------------- 
void EWDS(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(EWDS_c);  
           SEND_BYTE(0x00);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: ERAL 
// 函数功能: 片擦 
// 该指令可将整个存贮器阵列置为1,其它功能与地址擦指令相同 
// 要求VCC = 4.5V to 5.5V。 
//-------------------------------------------------------------------------------------------------- 
void ERAL(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(ERAL_c);  
           SEND_BYTE(0x80);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: READ_BYTE 
// 函数功能: 从存储区读一字节数据 
//-------------------------------------------------------------------------------------------------- 
unsigned char READ_BYTE(unsigned char address) 
             {  
             unsigned char dat;  
             CS_93=CLK_93=0; 
             CS_93=1;  
             start_operation(READ_c);  
             SEND_BYTE(address);  
             dat=RECEIVE_BYTE(); 
             CS_93=0; 
             return(dat); 
             } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: WRITE_BYTE 
// 入口参数: address。dat 
// 返回值:   1或0,表示成功写入 
// 函数功能: 写一字节数据到存储区 
//-------------------------------------------------------------------------------------------------- 
bit WRITE_BYTE(unsigned char address,unsigned char dat) 
                { 
                 unsigned char e,time,temp=address;  
                  e=0;  
                  while (e<3)  
                   { 
                  CS_93=CLK_93=0;  
                  CS_93=1; 
                  EWEN(); 
                  _nop_(); 
                  CS_93=1; 
                  _nop_(); 
                  start_operation(WRITE_c);  
                  SEND_BYTE(address);  
                  SEND_BYTE(dat);  
                  CS_93=0; 
                  _nop_(); 
                  CS_93=1; 
                  time=0; 
                  DO_93=1; 
                  while (1)  
                  { 
                  if (DO_93==1) break; 
                  if (time>20) break; 
                  time++; 
                  }  
                  CS_93=0;  
                 if (READ_BYTE(temp)==dat)  
                    { 
                    return(0); 
                    } 
                    e++; 
                    }  
                    return(1); 
    } 


关键字:AT93C46  SPI接口  EEPROM  读写程序 引用地址:AT93C46 SPI接口EEPROM读写程序

上一篇:IC卡控制程序
下一篇:51单片机8255驱动C程序

推荐阅读最新更新时间:2024-03-16 15:52

PIC单片机的EEPROM读写实例及说明
; PIC单片机的EEPROM读写实例及说明 ;**************************************************************************** ; This is a program to test the function of reading&writting for EEPROM. ; You can observe the value of register(30H--?) buy changing VALU and WRC_ . ; Notice that:it must be { ADDR+WRC_ =0ffh } ! ;********************
[单片机]
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103ZET6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) IIC总线: STM32本身支持IIC硬件时序的,上篇文章已经介绍了采用IIC模拟时序读写AT24C02,这篇文章介绍STM32的硬件IIC配置方法,并读写AT24C08。 文章地址: https://xiaolong.blog.csdn.net/article/details/117586108 模拟时序更加方便移植到其他单片机,通用性更高,不分MCU;硬件时序效率更高,每个MCU配置方法不同,依赖硬件本身支持。 器件型号: 采用AT2
[单片机]
STM32入门开发: 采用IIC硬件时序读写AT24C08(<font color='red'>EEPROM</font>)
LPC1788的内部EEPROM使用
Lpc1788内置有eeprom 使用代码 #ifndef __E2PRONINCHIP_H_ #define __E2PROMINCHIP_H #include common.h #include sys.h #include debugserial.h #define EEPROM_CLOCK 375000 void e2prom_init(void); u8 e2prom_write_8(u8 page,u8 addr,u8 value); u8 e2prom_write_16(u8 page,u8 addr,u16 value); u8 e2prom_write_32(u8 page,u
[单片机]
LPC1788的内部<font color='red'>EEPROM</font>使用
STM8S103F3--EEPROM
  本文介绍stm8s103f3这款单片机的eeprom的用法。 EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。 1.介绍STM8S103F3的首地址及容量。 STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与
[单片机]
STM8S103F3--<font color='red'>EEPROM</font>
EEPROM 原理知识详解
EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。 EEPROM(电可擦写可编程只读存储器)是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候是可频繁地重编程的,EEPROM的寿命是一个很重要的设计考虑参数。      一般用于即插即用(Plug & Play);常用在接口卡中,
[模拟电子]
STM32 SPI接口的NSS引脚
SPI_NSS 设置 NSS 信号由硬件( NSS 管脚)还是软件控制,这里我们一般通过软件控制 NSS ,而不是硬件自动控制,所以选择 SPI_NSS_Soft 选择了软件NSS之后,引脚NSS就可以用作其它了。
[单片机]
PIC单片机的EEPROM读写实例及说明
; PIC单片机的EEPROM读写实例及说明 ;**************************************************************************** ; This is a program to test the function of reading&writting for EEPROM. ; You can observe the value of register(30H--?) buy changing "VALU" and "WRC_". ; Notice that:it must be { ADDR+WRC_ =0ffh } ! ;******************
[单片机]
MSP430 SPI接口(模式)通信
SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用。 1. 接口 SPI接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。如图1所示,其使用的4条信号线分别为: 1) SCLK:串行时钟,用来同步数据传输,由主机输出; 2) MOSI:主机输出从机输入数据线; 3) MISO:主机输入从机输出数据线; 4) SS:片选线,低电平有效,由主机输出。 在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三态特性,使得该口线在器件未被
[单片机]
MSP430 <font color='red'>SPI接口</font>(模式)通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved