#include "spi.h"
void write_fre_enable(void);
void write_fre_state(uchar input);
void Delayus_x30(unsigned n);
uchar write_flash_enable(void);
//----------------------------------------
/*初始化SPI相关引脚*/
//----------------------------------------
void spi_init(void)
{
SPI_CLK_OUT;
SPI_CLK_LOW;
SPI_MISO_IN;
SPI_MOSI_OUT;
SPI_MOSI_LOW;
CS_FRE_OUT;
CS_FRE_DN;
CS_FLASH_OUT;
CS_FLASH_DN;
}
//----------------------------------------
/*释放所有相关引脚*/
//----------------------------------------
void spi_rest(void)
{
SPI_CLK_RST;
SPI_MOSI_RST;
CS_FRE_RST;
CS_FLASH_RST;
}
/****************************************/
//SPI 读写子程序
/****************************************/
uchar spi_sendbyte(uchar spi_data)
{
uchar i, output;
output = 0;
for (i = 0; i < 8; i++)
{
if (spi_data & 0x80)
SPI_MOSI_HIGH;
else
SPI_MOSI_LOW;
spi_data <<= 1;
SPI_CLK_HIGH;
output <<= 1;
if (SPI_MISO_CHECK)
{
output |= 1;
}
SPI_CLK_LOW;
}
return output;
}
//---------------------------------------------------------------
/*
读铁电状态寄存器
*/
//---------------------------------------------------------------
uchar read_fre_state(void)
{
uchar output;
CS_FLASH_DN;
CS_FRE_EN;
output = spi_sendbyte(RDSR_FRE);
output = spi_sendbyte(0);
CS_FRE_DN;
return (output);
}
//----------------------------------------------------------------
/*写使能*/
//----------------------------------------------------------------
void write_fre_enable(void)
{
CS_FLASH_DN;
CS_FRE_EN;
spi_sendbyte(WREN_FRE);
CS_FRE_DN;
}
//----------------------------------------------------------------
/*保护全部,除状态寄存器外*/
//----------------------------------------------------------------
void Protect_Pre_all(void)
{
write_fre_state(PROTECT_ALL);
}
//----------------------------------------------------------------
/*去掉保护*/
//----------------------------------------------------------------
void Unprotect_Pre(void)
{
write_fre_state(UN_PROTECT);
}
//----------------------------------------------------------------
/*写状态寄存器子程序(FM25640)*/
//----------------------------------------------------------------
void write_fre_state(uchar input)
{
write_fre_enable();
CS_FLASH_DN;
CS_FRE_EN;
spi_sendbyte(WRSR_FRE);
spi_sendbyte(input);
CS_FRE_DN;
}
//---------------------------------------------------------
/* 读一个字节*/
//---------------------------------------------------------
uchar read_pre_byte(uint address)
{
uchar output;
CS_FLASH_DN;
CS_FRE_EN;
output = spi_sendbyte(READ_FRE);
output = spi_sendbyte(((address & 0xff00) >> 8));
output = spi_sendbyte((address & 0x00ff));
output = spi_sendbyte(0);
CS_FRE_DN;
return (output);
}
//-----------------------------------------------------------
/* 读铁电多个字节
uint address start address
uchar num read longs
uchar *pointer RAM address
*/
//-----------------------------------------------------------
void read_fre_data(uint address, uchar num, uchar *pointer)
{
uchar i;
CS_FLASH_DN;
CS_FRE_EN;
spi_sendbyte(READ_FRE);
spi_sendbyte((address & 0xff00) >> 8);
spi_sendbyte(address & 0x00ff);
for (i = 0; i < num; i++)
{
*(pointer + i) = spi_sendbyte(0);
}
CS_FRE_DN;
return;
}
//------------------------------------------------------
/*写一个字节*/
//------------------------------------------------------
uchar write_fre_byte(uint address, uchar valve)
{
uchar output;
write_fre_enable();
CS_FLASH_DN;
CS_FRE_EN;
spi_sendbyte(WRITE_FRE);
spi_sendbyte((address & 0xff00) >> 8);
spi_sendbyte(address & 0x00ff);
output = spi_sendbyte(valve);
CS_FRE_DN;
return output;
}
//-----------------------------------------------------------
/* 写铁电多个字节
uint address start address
uchar num read longs
uchar *pointer RAM address
*/
//-----------------------------------------------------------
void write_fre_data(uint address, uchar num, uchar *pointer)
{
uchar i;
write_fre_enable();
CS_FLASH_DN;
CS_FRE_EN;
spi_sendbyte(WRITE_FRE);
spi_sendbyte((address & 0xff00) >> 8);
spi_sendbyte(address & 0x00ff);
for (i = 0; i < num; i++)
{
spi_sendbyte(*(pointer + i));
}
CS_FRE_DN;
return;
}
//==========================================++flash++====================================
//=======================================================================================
//------------------------------------------------------------
/*
读flashID号
*/
//------------------------------------------------------------
long read_flash_id(void)
{
long long temp = 0;
CS_FRE_DN;
CS_FLASH_EN;
spi_sendbyte(RDID_FLASH);
temp = spi_sendbyte(0);
temp <<= 16;
temp |= (spi_sendbyte(0) << 8);
temp |= spi_sendbyte(0);
CS_FLASH_DN;
return temp;
}
//-------------------------------------------------------------
/*
读状态寄存器
*/
//-------------------------------------------------------------
uchar read_flash_state(void)
{
uchar output;
CS_FRE_DN;
CS_FLASH_EN;
output = spi_sendbyte(RDSR_FLASH);
output = spi_sendbyte(0);
CS_FLASH_DN;
return (output);
}
//--------------------------------------------------------------
/*
写状态寄存器
*/
//--------------------------------------------------------------
uchar write_flash_state(uchar data)
{
if (write_flash_enable())
{
CS_FRE_DN;
CS_FLASH_EN;
spi_sendbyte(WRSR_FLASH);
spi_sendbyte(data);
CS_FLASH_DN;
return 1;
}
else
return 0;
}
//--------------------------------------------------------------
/*
写使能
返回1使能成功 0失败
*/
//--------------------------------------------------------------
uchar write_flash_enable(void)
{
uchar output;
CS_FRE_DN;
CS_FLASH_EN;
spi_sendbyte(WREN_FLASH);
CS_FLASH_DN;
output = read_flash_state();
if (output & BIT1)
return 1;
else
return 0;
}
//---------------------------------------------------------------
//读取忙状态,返回0为不忙,返回1为正在忙
//---------------------------------------------------------------
uchar read_flash_busy(void)
{
uchar output;
output = read_flash_state();
if (output & BIT0)
return 1;
else
return 0;
}
//----------------------------------------------------------------
/*页写入程序
2M字节(0x000000~0x1fffff) ,32段 24位的 xxxa aaaa ---- ---- ---- ---- 段地址;
共8192 页,每段含有256页 xxx- ---- aaaa aaaa ---- ---- 页地址;
页内部有256字节 xxx- ---- ---- ---- aaaa aaaa 字节地址;
地址位的A21~A23没有意义
返回 0 flash 使能失败, 返回 1 写入成功 返回 2 flash busy 返回 3 字节数为 0
*/
//-----------------------------------------------------------------
uchar write_flash_data(uchar sector_addr, uchar page_addr, uchar byte_addr,
uint num, uchar *pointer)
{
uint i;
if (num == 0)
return 3;
if (read_flash_busy() == 0)
{
if (write_flash_enable())
{
CS_FRE_DN;
CS_FLASH_EN;
spi_sendbyte(PP);
spi_sendbyte(sector_addr);
spi_sendbyte(page_addr);
spi_sendbyte(byte_addr);
for (i = 0; i < num; i++)
spi_sendbyte(*(pointer + i));
CS_FLASH_DN;
return 1;
}
else
return 0;
}
else
return 2;
//_EINT();
}
//-----------------------------------------------------------------------------
/*
低速读取函数(低速读取支持最大20Mhz的频率)
2M字节(0x000000~0x1fffff) ,32段 24位的 xxxa aaaa ---- ---- ---- ---- 段地址;
共8192 页,每段含有256页 xxx- ---- aaaa aaaa ---- ---- 页地址;
页内部有256字节 xxx- ---- ---- ---- aaaa aaaa 字节地址;
地址位的A21~A23没有意义
*/
//-----------------------------------------------------------------------------
uchar read_flash_data(uchar sector_addr, uchar page_addr, uchar byte_addr,
uint num, uchar *p_back)
{
uint i;
if (read_flash_busy())
return 0;
CS_FRE_DN;
CS_FL