📄 spi2.c
字号:
/***********************文件说明**************************
本文件是把AT45中常用的功能封装成函数,以供调用,具体函数功能以及参数说明
详见各函数前的参数;
date : 08.4.06(last modify)
author : zdq@hdu
any question please contact :zdq823@gmail.com
**********************************************************/
#include <aduc834.h>
#include "..\headers\SPI.h"
sbit AT45_CS = P3^6 ; //定义控制口
#define AT45_Off AT45_CS = 1
#define AT45_On AT45_CS = 0
/********************************************
函数原型: Uchar AT45_Host_Writebyte(Uchar Send_Data)
函数功能: 向AT45芯片写一个字节
输入参数: 要写入AT45芯片的数据(一字节)
返回参数: 写入的数据(为以后检测用,一般不用)
/********************************************/
Uchar AT45_Host_Writebyte(Uchar Send_Data)
{
SPIDAT=Send_Data;
while(!(SPICON&0x80));
return SPIDAT; // 通过读SPIDAT对ISPI位清零
}
/********************************************
函数原型: Uchar AT45_Status_Read(void)
函数功能: 检测AT45芯片是否处于写就绪状态
输入参数: 无
返回参数: status register 的值
/********************************************/
Uchar AT45_Status_Read(void)
{
AT45_On; //片选AT45DB011B
Host_Writebyte(AT45_Staus_RD);
Host_Writebyte(0xff);
AT45_Off; //结束
return SPIDAT;
}
/********************************************
函数原型: void SPI_Init(void)
函数功能: SPI 寄存器等的初始化
输入参数: 无
返回参数: 无
/********************************************/
void SPI_Init(void)
{
SPICON=0x30;// SPI使能,主模式 ,fos/8
AT45_Off;//初始化高电平
/* IT0=1;
EX0=1;
EA=1;
cs=1; */
}
/********************************************
函数原型: void AT45_Buffer_Write(Uint Buffer_Adderss,Uchar Send_Data)
函数功能: 向AT45芯片Buffer写一字节数据
输入参数: 要写入的单元地址Buffer_Adderss(9位,264bytes),要写入的数据(单字节);
返回参数: 无
/********************************************/
void AT45_Buffer_Write(Uint Buffer_Adderss,Uchar Send_Data)
{
Uchar Statu_Bit=0;
Uchar Flash_Busy = 1;
while(Flash_Busy)
{
Statu_Bit = AT45_Status_Read();
if((Statu_Bit & 0x80))
{
Flash_Busy = 0;
}
}
AT45_On; //select AT45
AT45_Host_Writebyte(AT45_Buf_WR); //buffer write opcode
AT45_Host_Writebyte(0x00);
AT45_Host_Writebyte((unsigned char)(Buffer_Adderss>>8));
AT45_Host_Writebyte((unsigned char)Buffer_Adderss);
/* for(i=0;i<length;i++)
{
AT45_Host_Writebyte(Read_pHeader[i]);
}
*/
SPIDAT=Send_Data ;
while(!(SPICON&0x80)) ;
AT45_Off; //release AT45
}
/******************************************
读缓冲函数 (buffer read)
/******************************************/
Uchar AT45_Buffer_Read(Uint Buffer_Adderss)
{
Uint i=0;
Uchar Statu_Bit=0;
AT45_On; //select at45
AT45_Host_Writebyte(AT45_Buf_RD); //buffer read opcode
AT45_Host_Writebyte(0x00);
AT45_Host_Writebyte((unsigned char)(Buffer_Adderss>>8));
AT45_Host_Writebyte((unsigned char)Buffer_Adderss);
AT45_Host_Writebyte(0x00); //don't care bit
/* for(i=0;i<length;i++)
{
Read_pHeader[i]= Host_Readbyte();
}*/
SPIDAT=0XFF;
while(!(SPICON&0x80)) ;
return SPIDAT ;
AT45_Off; //release at45
}
/********************************************
缓冲向主存写函数
/*********************************************/
void AT45_MainMemory_Buffertransfer(Uint Page_Adderss)
{
Uchar Statu_Bit = 0;
Uchar Flash_Busy = 0;
while(!Flash_Busy)
{
Statu_Bit = AT45_Status_Read();
if((Statu_Bit & 0x80))
{
Flash_Busy = 1;
}
}
AT45_On ;
AT45_Host_Writebyte(AT45_Buf2MainMem_Erase);
AT45_Host_Writebyte((Uchar)(Page_Adderss>>7));
AT45_Host_Writebyte((Uchar)(Page_Adderss<<1));
AT45_Host_Writebyte(0x00);
AT45_Off ;
}
/********************************************
函数原型: AT45_Mainmemory_Write
函数功能: 通过缓存向AT45写数据
输入参数: 页地址(9位),块地址(9位),需写入的数据
返回参数: 无
/********************************************/
void AT45_Mainmemory_Write(Uint Page_Address,Uint Block_Address,Uchar Sent_Data)
{
while(!(AT45_Status_Read()&0x80)) ;
AT45_On;
AT45_Host_Writebyte(AT45_MainMem_ThrougBuf_WR);
AT45_Host_Writebyte((Uchar)(Page_Address>>7));
AT45_Host_Writebyte((Uchar)(Page_Address<<1)|(Uchar)(Block_Address>>8));
AT45_Host_Writebyte((Uchar)(Block_Address));
AT45_Host_Writebyte(Sent_Data) ;
AT45_Off;
}
/*************************************
读主存子程序
/***************************************/
Uchar AT45_Mainmemory_Read(Uint Page_Address,Uint Block_Address)
{
while(!(AT45_Status_Read()&0x80)) ;
AT45_On;
AT45_Host_Writebyte(AT45_MainMem_RD);
AT45_Host_Writebyte((Uchar)(Page_Address>>7)); //6位无关位外加页地址高2位
AT45_Host_Writebyte((Uchar)(Page_Address<<1)|(Uchar)(Block_Address>>8)); //页地址低七位和块地址高1位
AT45_Host_Writebyte((Uchar)Block_Address); //块地址低8位
AT45_Host_Writebyte(0x00);
AT45_Host_Writebyte(0x00);
AT45_Host_Writebyte(0x00);
AT45_Host_Writebyte(0x00); //4byte don't 'care bits
AT45_Host_Writebyte(0xff); //送一字节的时间正好是传送读出一字节数据的时间
AT45_Off;
return SPIDAT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -