#include <msp430.h>
#define DB_RST_LOW P9OUT &= ~BIT7
#define DB_RST_HIGH P9OUT |= BIT7
#define DB_CS_LOW P10OUT &= ~BIT0
#define DB_CS_HIGH P10OUT |= BIT0
#define DB_SCK_LOW P10OUT &= ~BIT3
#define DB_SCK_HIGH P10OUT |= BIT3
#define DB_SI_LOW P10OUT &= ~BIT1
#define DB_SI_HIGH P10OUT |= BIT1
#define DB_SO_LOW !(P10IN & BIT2)
#define DB_SO_HIGH P10IN & BIT2
#define DB_WP_LOW P9OUT &= ~BIT6
#define DB_WP_HIGH P9OUT |= BIT6
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:SPI写入字节
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void DB_SPI_Write(char DATA)
{
char i = 8;
while(i--)
{
if(DATA & 0x80)
DB_SI_HIGH;
else
DB_SI_LOW;
DB_SCK_HIGH;
DB_SCK_LOW;
DATA <<= 1;
}
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:SPI读出字节
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
char DB_SPI_Read(void)
{
char DATA = 0x00;
char i = 8;
while(i--)
{
DB_SCK_HIGH;
DATA <<= 1;
if(DB_SO_HIGH)
DATA++;
DB_SCK_LOW;
}
return DATA;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:存储器初始化
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void DB_Init(void)
{
DB_CS_HIGH;
DB_SCK_LOW;
DB_SI_LOW;
DB_WP_LOW;
__delay_cycles(10);
DB_RST_LOW;
__delay_cycles(100);
DB_RST_HIGH;
__delay_cycles(100);
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:读取状态寄存器
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
int DB_Read_SR(void)
{
int temp;
DB_CS_LOW;
DB_SPI_Write(0xD7);
temp = DB_SPI_Read();
temp <<= 8;
temp += DB_SPI_Read();
DB_CS_HIGH;
return temp;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:擦除扇区保护寄存器
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void DB_Erase_SPR(void)
{
DB_WP_HIGH;
__delay_cycles(10);
DB_CS_LOW;
DB_SPI_Write(0x3D);
DB_SPI_Write(0x2A);
DB_SPI_Write(0x7F);
DB_SPI_Write(0xCF);
DB_CS_HIGH;
//__delay_cycles(101000);
//while(!(DB_Read_SR() & BITF));
DB_WP_LOW;
__delay_cycles(10);
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:读取存储器
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
char DB_Read_Flash(unsigned int Page_address, unsigned int Byte_address, unsigned int Number, char *DATA)
{
unsigned int i = 0;
while(!(DB_Read_SR() & BITF))
{
if(i++ >= 42)
{
return 1;
}
__delay_cycles(5000);
}
DB_CS_LOW;
DB_SPI_Write(0x1B);
DB_SPI_Write((Page_address>>7) & 0x000F);
DB_SPI_Write(((Page_address<<1) & 0x00FE) + ((Byte_address>>8) & 0x0001));
DB_SPI_Write(Byte_address & 0x00FF);
DB_SPI_Write(0x00);
DB_SPI_Write(0x00);
for(i=0; i<Number; i++)
{
*DATA++ = DB_SPI_Read();
}
DB_CS_HIGH;
return 0;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:写入存储器
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
char DB_Write_Flash(unsigned int Page_address, unsigned int Byte_address, unsigned int Number, char *DATA)
{
int temp;
DB_WP_HIGH;
__delay_cycles(10);
unsigned int i = 0;
while(!(DB_Read_SR() & BITF))
{
if(i++ >= 42)//if(i++ >= 17)
{
return 1;
}
__delay_cycles(5000);
}
DB_CS_LOW;
DB_SPI_Write(0x59);
DB_SPI_Write((Page_address>>7) & 0x000F);
DB_SPI_Write(((Page_address<<1) & 0x00FE) + ((Byte_address>>8) & 0x0001));
DB_SPI_Write(Byte_address & 0x00FF);
for(i=0; i<Number; i++)
{
DB_SPI_Write(*DATA++);
}
DB_CS_HIGH;
for(i=0; i<42; i++)
{
__delay_cycles(5000);
temp = DB_Read_SR();
if(temp & BITF)
break;
}
if(i == 42)
{
return 1;
}
if(temp & BIT5)
{
return 2;//Err
}
DB_WP_LOW;
__delay_cycles(10);
DB_CS_LOW;
DB_SPI_Write(0x61);
DB_SPI_Write((Page_address>>7) & 0x000F);
DB_SPI_Write((Page_address<<1) & 0x00FE);
DB_SPI_Write(0x00);
DB_CS_HIGH;
__delay_cycles(1000);
temp = DB_Read_SR();
if(temp & BITF)
{
if(temp & BITE)
{
return 3;
}
else
{
return 0;
}
}
else
{
return 1;
}
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 函数说明:读取安全寄存器
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
char DB_Read_Security_Register(char *DATA)
{
char i = 0;
while(!(DB_Read_SR() & BITF))
{
if(i++ >= 42)
{
return 1;
}
__delay_cycles(5000);
}
DB_CS_LOW;
DB_SPI_Write(0x77);
DB_SPI_Write(0x00);
DB_SPI_Write(0x00);
DB_SPI_Write(0x00);
for(i=0; i<64; i++)
{
DB_SPI_Read();
}
for(i=0; i<64; i++)
{
*DATA++ = DB_SPI_Read();
}
DB_CS_HIGH;
return 0;
}