#define STATE_CLK_PIN P1_2 //状态灯和nor flash时钟
#define FLASH_DI_PIN P1_4 //nor flash的数据输入信号
#define FLASH_DO_PIN P1_5 //nor flash的数据输出信号
#define B_CTR_1_PIN P0_0 //蓝灯1 用做CS
#define Dummy_Byte 0xFF // 任意值
#define JEDEC_ID 0xA14013
#define FM25_ReadStatus 0x05 //读状态寄存器
#define FM25_WriteStatus 0x01 //写状态寄存器
#define FM25_ReadDATA8 0x03 //普读_数据
#define FM25_FastRead 0x0B //快读_数据
#define FM25_DualOutput 0x3B //快读_双输出
#define FM25_Writepage 0x02 //写_数据_0~255个字节 页编程
#define FM25_S_Erase 0x20 //扇区擦除4KB 共128扇
#define FM25_B_Erase 0xD8 //块区擦除64KB 共8块
#define FM25_C_Erase 0xC7 //整片格式化
#define FM25_PowerDown 0xB9 //待机
#define FM25_PowerON_ID 0xAB //开机或是读ID
#define FM25_JEDEC_ID 0x9F //十六位的JEDEC_ID
#define FM25_WriteEnable 0x06 //写允许
#define FM25_WriteDisable 0x04 //写禁止
//向SPI总线传输一个8位数据
void SendByte(unsigned char Data)
{
unsigned char i = 0;
B_CTR_1_PIN = 0;
for (i = 0; i < 8; i++)
{
if ((Data & 0x80) == 0x80) /* check if MSB is high */
FLASH_DI_PIN = 1;
else
FLASH_DI_PIN = 0; /* if not, set to low */
STATE_CLK_PIN = 1; /* toggle clock high */
Data = (Data << 1); /* shift 1 place for next bit */
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
STATE_CLK_PIN = 0; /* toggle clock low */
}
}
//从SPI总线获取一个8位数据
unsigned char GetByte()
{
unsigned char i = 0, in = 0, temp = 0;
B_CTR_1_PIN = 0;
for (i = 0; i < 8; i++)
{
in = (in << 1); /* shift 1 place to the left or shift in 0 */
temp = FLASH_DO_PIN; /* save input */
STATE_CLK_PIN = 1; /* toggle clock high */
if (temp == 1) /* check to see if bit is high */
in |= 0x01; /* if high, make bit high */
STATE_CLK_PIN = 0; /* toggle clock low */
}
return in;
}
void Parameter_Init()
{
uint8 FM25_ID, JEDEC1, JEDEC2, JEDEC3;
B_CTR_1_PIN = 0;
SendByte(FM25_PowerON_ID);
SendByte(Dummy_Byte);
SendByte(Dummy_Byte);
SendByte(Dummy_Byte);
FM25_ID = GetByte();
B_CTR_1_PIN = 1;
B_CTR_1_PIN = 0;
SendByte(FM25_JEDEC_ID);
JEDEC1 = GetByte();
JEDEC2 = GetByte();
JEDEC3 = GetByte();
B_CTR_1_PIN = 1;
}