zigbee读取nor flash的JEDEC_ID和PowerON_ID

124 阅读1分钟
#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;
}