⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45db041.c

📁 一个关于AVR单片机的例程
💻 C
字号:
/**************************************
** Filename: at45db041.c
** Describe: Flash 存储器at45db041
** Author : 古欣 www.avrvi.com
** Time  :   2007-2-14
**************************************/

#include "config.h"

/**************************************
** 说明:初始化 at45db041
** 除SO对应引脚为输入外,其余都设为输出,RESET高,CS低,芯片工作
**************************************/
void at4541_init(void)
{
 DDR_RESET_SET();
 DDR_CS_SET();
 DDR_SCK_SET();
 DDR_SI_SET();
 DDR_SO_SET();
 
 CS_LOW();
 RESET_HIGH();
}

/**************************************
** 说明:RDY/~BUSY引脚为高表示准备好
**                      低表示内部忙
**************************************/
unsigned char at4541_check_busy(void)
{
 if((AT4541_PIN&CHEAK_BUSY)==CHEAK_BUSY)
  {
    return 1;
  }
 else
  {
   return 0;
  }
}


/**************************************
** 说明:发送操作命令 (0xe800读)(0x8200写)
** 数据格式:16位命令字,16位地址位,32位任意数
** 输入:命令字,地址位
**************************************/
void at4541_commond_send(unsigned int commond,unsigned int address)
{
 unsigned char i=0;
 SCK_HIGH();
 RESET_HIGH();
 CS_HIGH();
 delay_1ms();
 CS_LOW();
 delay_1ms();
 //16位命令字
 for(i=0;i<16;i++)
 {
  SCK_LOW();
  if((commond&0x8000)==0x8000)
   SI_HIGH();
  else
   SI_LOW();
  delay_1ms();
  SCK_HIGH();
  delay_1ms();
  commond=commond<<1;
 }
 //16位地址位
 for(i=0;i<16;i++)
 {
  SCK_LOW();
  if((address&0x8000)==0x8000)
   SI_HIGH();
  else
   SI_LOW();
  delay_1ms();
  SCK_HIGH();
  delay_1ms();
  address=address<<1;
 }
 //32位任意位
 for(i=0;i<32;i++)
 {
  SCK_LOW();
  delay_1ms();
  SCK_HIGH();
  delay_1ms();
 }
}

/**************************************
** 说明:读at45db41
** 数据:在执行at4541_commond_send(发送读命令)之后,8位的数从SO输出
** 输出:读出的一位数
**************************************/
unsigned char at4541_read(void)
{
 unsigned char i=0,temp1=0,temp2=0;
 //读出8位,组合在temp2里
 for(i=0;i<8;i++)
 {
  SCK_LOW();
  delay_1ms();
  if(SO_PIN_HIGH)
   temp1=1;
  else
   temp1=0;
  temp2=temp2<<1+temp1;
  SCK_HIGH();
  delay_1ms();
 }
 return temp2;
}

/**************************************
** 说明:写at45db41
** 数据:在执行at4541_commond_send(发送写命令)之后,8位的数写入
** 输出:写入的一位数
**************************************/
void at4541_write(unsigned char data)
{
 unsigned char i=0;
 //生成写入时序
 for(i=0;i<8;i++)
 {
  SCK_LOW();
  if(data&0x80==0x80)
   SI_HIGH();
  else
   SI_LOW();
  delay_1ms();
  SCK_HIGH();
  delay_1ms();
  data=data<<1;
 }
}

/**************************************
** 说明:读取寄存器状态
** 操作流程:将57H或D7H操作代码传给at45db041 
** 随后芯片从SO输出8位寄存器信息,高位在前
**************************************/
unsigned char at4541_read_status(unsigned char commond)
{
 unsigned char i=0,temp1=0,temp2=0;
 SCK_HIGH();
 RESET_HIGH();
 CS_HIGH();
 delay_1ms();
 CS_LOW();
 delay_1ms();
 //本循环把8位command传给at45db041
 for(i=0;i<8;i++)
 {
  SCK_LOW();
  if((commond&0x80)==0x80)
    SI_HIGH();
  else 
    SI_LOW();
  delay_1ms();
  SCK_HIGH();
  delay_1ms();
  commond=commond<<1;
 }
 //本循环接收传回的八位数据
 for(i=0;i<8;i++)
 {
  SCK_LOW();
  delay_1ms();
  
  if(SO_PIN_HIGH)
   temp1 = 1;
  else
   temp1 = 0;
  
  temp2 = temp2<<1 + temp1;
  SCK_HIGH();
  delay_1ms();
 }
 CS_HIGH(); //停止输出
 
 delay_ms(500);
 
 return temp2;
}

/**************************************
** 说明:CS=1 停止at45db041
**
**************************************/
void at4541_stop(void)
{
  CS_HIGH();
  delay_ms(500);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -