📄 at45db041.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 + -