📄 at45db081.c
字号:
/*================================================================*/
/*功能说明: SPI总线子程序 */
/*文件名: SPI.C */
/*相关程序说明:本程序是读写AD451803的DATAFLASH */
/*子程序编号: */
/*撰写人: DEALE 撰写时间:2003-12 */
/*================================================================*/
#include "upsd3200.h"
#include "absacc.h"
#include "PortDefine.h"
#include "intrins.h"
#include "UPSDHAD.h"
xdata unsigned char Spi_Read_Buffer[264];
xdata unsigned char Spi_Write_Buffer[264];
unsigned char C_Sta;
extern void delay_nop(unsigned int delayt);
void Init_Spi()
{
BUSY=1;
CONTROL_B=0;
DIRECTION_B|=0x10;
DATAOUT_B|=0x10;
SCK=0;
}
//Opcode--操作命令52H
//================================================================//
/*功能说明: SPI总线主存储器读操作子程序 */
/*函数名: MainMemRead */
/*入口参数: Page_address--页地址(12bit) */
/* Byte_address--字节地址(9bit) */
/* Num_data--读字节数目 */
/*中间参数: */
/*出口参数: */
/*子程序编号: */
/*撰写人: 撰写时间:2003-12 15:45 */
//================================================================//
void MainMemRead(unsigned int Page_address,unsigned int Byte_address,unsigned int Num_data)
{
unsigned char ctrl_j,address[4];
unsigned char Opcode=0x52;
unsigned int Temp_PageAdd,Temp_ByteAdd,Ctrl_Num=0;
unsigned int Temp_address=0x8000; //高3位为保留字
bit Turn_flag=0;
//==============================
ReadSta:
Temp_PageAdd=Page_address;
Temp_ByteAdd=Byte_address;
Temp_PageAdd&=0x0fff;
Temp_PageAdd<<=1;
Temp_address|=Temp_PageAdd;
address[1]=(char)(Temp_address);
Temp_address>>=8;
address[0]=(char)(Temp_address);
Temp_ByteAdd&=0x01ff;
address[3]=(char)(Temp_ByteAdd);
Temp_ByteAdd>>=8;
address[2]=(char)(Temp_ByteAdd);
address[1]|=address[2];
while(!BUSY);
DATAOUT_B&=0xEF;
SpiDelay(20);
Senddata(0x52);
Senddata(address[0]);
Senddata(address[1]);
Senddata(address[3]);
for(ctrl_j=0;ctrl_j<4;ctrl_j++)Senddata(0xff);
SpiDelay(10);
SCK=1;
SpiDelay(10);
SCK=0;
SpiDelay(10);
for(;Ctrl_Num<Num_data;Ctrl_Num++)
{
if(Byte_address==264) //翻页操作
{
Page_address++;
Byte_address=0;
Temp_address=0x8000;
Turn_flag=1;
break;
}
Spi_Read_Buffer[Ctrl_Num]=Readdata();
Byte_address++;
}
SpiDelay(20);
DATAOUT_B|=0X10;
SpiDelay(20);
if(Turn_flag){Turn_flag=0;goto ReadSta;}
}
//================================================================//
/*功能说明: SPI总线主存储器写操作子程序 */
/*函数名: MainMemWrite */
/*入口参数: Page_address--页地址(12bit) */
/* Byte_address--字节地址(9bit) */
/* Num_data--写字节数目 */
/*中间参数: */
/*出口参数: */
/*子程序编号: */
/*撰写人: 撰写时间:2003-12 15:45 */
//================================================================//
void MainMemWrite(unsigned int Page_address,unsigned int Byte_address,unsigned int Num_data)
{
unsigned char address[4];
unsigned char Opcode=0x85;
unsigned int Temp_PageAdd,Temp_ByteAdd,Ctrl_Num=0;
unsigned int Temp_address=0x8000; //高3位为保留字
bit Turn_flag=0;
//==============================
WriteSta:
Temp_PageAdd=Page_address;
Temp_ByteAdd=Byte_address;
Temp_PageAdd&=0x0fff;
Temp_PageAdd<<=1;
Temp_address|=Temp_PageAdd;
address[1]=(char)(Temp_address);
Temp_address>>=8;
address[0]=(char)(Temp_address);
Temp_ByteAdd&=0x01ff;
address[3]=(char)(Temp_ByteAdd);
Temp_ByteAdd>>=8;
address[2]=(char)(Temp_ByteAdd);
address[1]|=address[2];
while(!BUSY);
DATAOUT_B&=0xEF;
SpiDelay(20);
Senddata(0x55);
Senddata(address[0]);
Senddata(address[1]);
Senddata(address[3]);
SpiDelay(20);
DATAOUT_B|=0X10;
delay_nop(60);
while(!BUSY);
DATAOUT_B&=0xEF;
SpiDelay(20);
Senddata(0x85);
Senddata(address[0]);
Senddata(address[1]);
Senddata(address[3]);
//=================================================
for(;Ctrl_Num<Num_data;Ctrl_Num++)
{
if(Byte_address==264) //翻页操作
{
Page_address++;
Byte_address=0;
Temp_address=0x8000;
Turn_flag=1;
break;
}
Senddata(Spi_Write_Buffer[Ctrl_Num]);
Byte_address++;
}
DATAOUT_B|=0X10;
delay_nop(60);
while(!BUSY);
if(Turn_flag){Turn_flag=0;goto WriteSta;}
}
//===========================================
//读取动态寄存器子程序
//===========================================
/*void ReadStatus()
{
unsigned char Opcode=0x57;
DATAOUT_B&=0xEF;
SpiDelay(1);
Senddata(Opcode);
SpiDelay(1);
SCK=1;
SpiDelay(2);
SCK=0;
SpiDelay(1);
C_Sta=Readdata();
SpiDelay(2);
DATAOUT_B|=0X10;
}*/
//================================================================//
/*功能说明: SPI总线通用写操作子程序 */
/*函数名: Senddata() */
/*入口参数: Ddata--写数据 */
/* Number--写位数目 */
/*中间参数: */
/*出口参数: */
/*子程序编号: */
/*撰写人: 撰写时间:2003-12 15:45 */
//================================================================//
void Senddata(unsigned char Ddata)
{
unsigned char ctrl_i;
for(ctrl_i=0;ctrl_i<8;ctrl_i++)
{
SI=(bit)(Ddata&0x80);
Ddata=Ddata<<1;
SpiDelay(1);
SCK=1;
SpiDelay(2);
SCK=0;
SpiDelay(1);
}
}
//================================================================//
/*功能说明: SPI总线通用读操作子程序 */
/*函数名: Readdata() */
/*入口参数: Ddata--写数据 */
/*中间参数: */
/*出口参数: */
/*子程序编号: */
/*撰写人: 撰写时间:2003-12 15:45 */
//================================================================//
unsigned char Readdata()
{
unsigned char ctrl_i,Ddata;
for(ctrl_i=0;ctrl_i<8;ctrl_i++)
{
SCK=1;
SpiDelay(1);
Ddata=Ddata<<1;
Ddata|=SO;
SpiDelay(1);
SCK=0;
SpiDelay(1);
}
return(Ddata);
}
void SpiDelay(unsigned char ctrl_i)
{
for(;ctrl_i>0;ctrl_i--)
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -