⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430-45db041.c

📁 本代码为本人在做一个项目时写的MSP430单片机读写FLASH芯片45DB041的源程序
💻 C
字号:

#include "string.h"
#define	 RDY  0x80   //FLASH闲状态标志
int word;//发送字节缓存
int cmd_word;//发送命令缓存
unsigned int R_word;// 接收字节缓存
extern  Time Copy_time;
extern  Time Cur_time;
extern  chuanganqi Cur_chuanganqi;
extern  jiance Cur_jiance;
void Send_Byte(void)
{
  int i;
  int Tamp;
  for (i=0;i<8;i++)
  {
    P5OUT &=~ BIT3; //SCK
    Tamp = word;
    Tamp &= 0x80;
    if(!Tamp)
      P5OUT &=~ BIT1;
    else
      P5OUT |= BIT1;
   P5OUT |= BIT3; //SCK
   word = word << 1;
  } 
} 

void Send_Start(void)
{
  
  P5DIR |= BIT1+BIT3;
  word = cmd_word;
  Send_Byte();
}

void Stop(void)
{
  P5DIR &=~(BIT1+BIT2);
  P5OUT |= BIT3;
  P4DIR |= BIT4+BIT5+BIT6;
  P4OUT |= BIT4+BIT5+BIT6;
}
void Receive_Byte(void)
{
  int i;
 
  P5DIR &=~BIT2;
  R_word = 0x00;
 
  for(i=0;i<8;i++)
  {
//    P5OUT |= BIT3;
    P5OUT &=~ BIT3;
    if(P5IN & 0x04)
      R_word |= 0x01;
    else
      R_word &= 0xFE;
    P5OUT |= BIT3;
    R_word = R_word << 1;
  }
  R_word = R_word >> 1;
}
void Flash_B_ReadStat(void)
{
 
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd7;
  Send_Start();
   while(1){
    Receive_Byte();
    if((R_word&RDY)==RDY)break;
     }  
  Stop();
}
void page_to_buffer(int w_Page)
{
  char by_High_Page,by_Low_Page;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
   //***********main memory page to buffer transfer*****************
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x53;
  Send_Start();
  word = by_High_Page;;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = 0x0;
  Send_Byte();
 Stop();
 Flash_B_ReadStat();
}
void  page_program_through_buffer_jiance(int w_Page,int addr)//该函数用于将当前的检测的配置和结果送FLASH
{  int j;
   char by_High_Page,by_Low_Page;
    
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
   //***********main memory page program through buffer ***************** 
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x82;
  Send_Start();
  word = by_High_Page;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = addr;
  Send_Byte();
  
  word =Cur_time.year;
  Send_Byte();
  word =Cur_time.month;
  Send_Byte();
  word =Cur_time.day;
  Send_Byte();
  word =Cur_time.hour;
  Send_Byte();
  word =Cur_time.minute;
  Send_Byte();
  word =Cur_time.second;
  Send_Byte();
  
  word =Cur_jiance.jiche;
  Send_Byte();
  word =Cur_jiance.leixing;
  Send_Byte();
  word =Cur_jiance.xinghaocode;
  Send_Byte();
  word =Cur_jiance.jieguo;
  Send_Byte();
  for(j=0;j<16;j++)
 {
    word = Cur_jiance.chehao[j];
   // word =data;
    Send_Byte();
  }
   for(j=0;j<16;j++)
 {
    word = Cur_jiance.xinghao[j];
   // word =data;
    Send_Byte();
  }
 Stop();
   Flash_B_ReadStat();
}
void  page_program_through_buffer_cgqi(int w_Page,int addr )//该函数用于将当前的传感器参数送FLASH
{  int j;
   char by_High_Page,by_Low_Page;
    char byte_High ,byte_Low;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
   //***********main memory page program through buffer ***************** 
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x82;
  Send_Start();
  word = by_High_Page;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = addr;
  Send_Byte();
  word =Cur_chuanganqi.leixing;
  Send_Byte();
  word =Cur_chuanganqi.xinghaocode;
  Send_Byte();
  word =Cur_chuanganqi.danwei;
  Send_Byte();
  word =Cur_chuanganqi.dianyuan;
  Send_Byte();
  byte_High=(char)(Cur_chuanganqi.maxIN>>8); 
  word =byte_High;
  Send_Byte();
  byte_Low=(char)Cur_chuanganqi.maxIN;
  word = byte_Low;
  Send_Byte();
  byte_High=(char)(Cur_chuanganqi.maxOUT>>8); 
  word =byte_High;
  Send_Byte();
  byte_Low=(char)Cur_chuanganqi.maxOUT;
  word = byte_Low;
  Send_Byte();
  for(j=0;j<16;j++)
 {
    word = Cur_chuanganqi.xinghao[j];
   // word =data;
    Send_Byte();
  }
 Stop();
   Flash_B_ReadStat();
}
void  page_program_through_buffer_int(int w_Page,int addr,int data )//该函数用于将当前的整型变量送FLASH
{   
   char by_High_Page,by_Low_Page;
    char byte_High ,byte_Low;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
   //***********main memory page program through buffer ***************** 
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x82;
  Send_Start();
  word = by_High_Page;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = addr;
  Send_Byte();
   
  byte_High=(char)(data>>8); 
  word =byte_High;
  Send_Byte();
  byte_Low=(char)data;
  word = byte_Low;
  Send_Byte();
   
 Stop();
   Flash_B_ReadStat();
}
void  page_program_through_buffer_dl(int w_Page,int addr,char *data )//该函数用于将当前的整型变量送FLASH
{   
   char by_High_Page,by_Low_Page;
     
    char i;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
   //***********main memory page program through buffer ***************** 
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x82;
  Send_Start();
  word = by_High_Page;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = addr;
  Send_Byte();
   
   for(i=0;i<100;i++)
   {
  word =data[i];
  Send_Byte();
   }
   
 Stop();
   Flash_B_ReadStat();
}

/*
void  Flash_B_Write_buffer(int addr,char * data)
{ int j;
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x84;
  Send_Start();
  word = 0;
  Send_Byte();
  word =0;
  Send_Byte();
  word = addr;
  Send_Byte();
  
   for(j=0;j<size;j++)
 {
    word = data[j];
   // word =data;
    Send_Byte();
  }
 Stop();
  
}
*/
void auto_page_rewrite(int w_Page)
{
  char by_High_Page,by_Low_Page;

   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
//***********auto page rewrite *****************    
  P4DIR |= BIT6;
  P4OUT &=~ BIT6;
  cmd_word = 0x58;
  Send_Start();
  word = by_High_Page;;
  Send_Byte();
  word =by_Low_Page;
  Send_Byte();
  word = 0x0;
  Send_Byte();
  Stop();
  Flash_B_ReadStat();
}
void Flash_B_Write_dl(int w_Page,int addr,char *data)//该函数用于将当前的整型变量送FLASH
{
  page_to_buffer( w_Page);
  page_program_through_buffer_dl( w_Page,addr, data );
  auto_page_rewrite(w_Page);
}
void Flash_B_Write_int(int w_Page,int addr,int data)//该函数用于将当前的整型变量送FLASH
{
  page_to_buffer( w_Page);
  page_program_through_buffer_int( w_Page,addr, data );
  auto_page_rewrite(w_Page);
}

int Flash_B_Read_int(int w_Page,int addr)//该函数用于读一个FLASH值送整型变量
{
  int jj;
 char by_High_Page,by_Low_Page;
  char byte_High ,byte_Low;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd2;
  Send_Start();
 
  word = by_High_Page;
  Send_Byte();
 
  word =by_Low_Page;
  Send_Byte();
  
  word = addr;
  Send_Byte();
  //发送4个等待字节
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
 
  
  Receive_Byte();
  byte_High= R_word;
  Receive_Byte();
  byte_Low= R_word;
  jj=(byte_High<<8)+byte_Low;
  Stop();
  return jj;
}
char Flash_B_Read_chr(int w_Page,int addr)//该函数用于读一个FLASH值送整型变量
{
  int jj;
 char by_High_Page,by_Low_Page;
   
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd2;
  Send_Start();
 
  word = by_High_Page;
  Send_Byte();
 
  word =by_Low_Page;
  Send_Byte();
  
  word = addr;
  Send_Byte();
  //发送4个等待字节
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
 
  
  Receive_Byte();
  jj= R_word;
  Stop();
  return jj;
}
void Flash_B_Write_jiance(int w_Page,int addr)//该函数用于将当前的检测的配置和结果送FLASH
{
  page_to_buffer( w_Page);
  page_program_through_buffer_jiance( w_Page,addr );
  auto_page_rewrite(w_Page);
}

void Flash_B_Read_jiance(int w_Page,int addr)//该函数用于读FLASH中的检测的配置和结果
{
 int j;
 char by_High_Page,by_Low_Page;
 // char byte_High ,byte_Low;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd2;
  Send_Start();
 
  word = by_High_Page;
  Send_Byte();
 
  word =by_Low_Page;
  Send_Byte();
  
  word = addr;
  Send_Byte();
  //发送4个等待字节
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  
  Receive_Byte();
  Copy_time.year= R_word;
  Receive_Byte();
  Copy_time.month= R_word;
  Receive_Byte();
  Copy_time.day= R_word;
  Receive_Byte();
  Copy_time.hour= R_word;
  Receive_Byte();
  Copy_time.minute= R_word;
  Receive_Byte();
  Copy_time.second= R_word;
  
  
  Receive_Byte();
  cpCur_jiance.jiche= R_word;
  Receive_Byte();
  cpCur_jiance.leixing= R_word;
  Receive_Byte();
  cpCur_jiance.xinghaocode= R_word;
  Receive_Byte();
  cpCur_jiance.jieguo=R_word;
 // byte_High= R_word;
//  Receive_Byte();
//  byte_Low= R_word;
 // Cur_jiance.csjiguo=(byte_High<<8)+byte_Low;
 // Receive_Byte();

 // byte_High= R_word;
 // Receive_Byte();
 // byte_Low= R_word;
 // Cur_jiance.bzjiguo=(byte_High<<8)+byte_Low;
  
  for(j=0;j<16;j++)
  {
    Receive_Byte();
    if((R_word<32)||(R_word>126))R_word=0;
    cpCur_jiance.chehao[j]= R_word;
  }
  for(j=0;j<16;j++)
  {
    Receive_Byte();
    if((R_word<32)||(R_word>126))R_word=0;
    cpCur_jiance.xinghao[j]= R_word;
  }
  Stop();
}
void Flash_B_Write_cgqi(int w_Page,int addr)
{
  page_to_buffer( w_Page);
  page_program_through_buffer_cgqi( w_Page,addr );
  auto_page_rewrite(w_Page);
}

void Flash_B_Read_cgqi(int w_Page,int addr)//该函数用于读FLASH中的传感器参数
{
 int j;
 char by_High_Page,by_Low_Page;
  char byte_High ,byte_Low;
   w_Page = w_Page << 1;
   by_High_Page = (char)(w_Page >> 8);
   by_Low_Page = (char)w_Page;
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd2;
  Send_Start();
 
  word = by_High_Page;
  Send_Byte();
 
  word =by_Low_Page;
  Send_Byte();
  
  word = addr;
  Send_Byte();
  //发送4个等待字节
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  word = 0xff;
  Send_Byte();
  
  Receive_Byte();
  Cur_chuanganqi.leixing= R_word;
  Receive_Byte();
  Cur_chuanganqi.xinghaocode= R_word;
  Receive_Byte();
  Cur_chuanganqi.danwei= R_word;
  Receive_Byte();
  Cur_chuanganqi.dianyuan= R_word;
  Receive_Byte();
  byte_High= R_word;
  Receive_Byte();
  byte_Low= R_word;
  Cur_chuanganqi.maxIN=(byte_High<<8)+byte_Low;
  Receive_Byte();

  byte_High= R_word;
  Receive_Byte();
  byte_Low= R_word;
  Cur_chuanganqi.maxOUT=(byte_High<<8)+byte_Low;
 for(j=0;j<16;j++)
  {
    Receive_Byte();
    if((R_word<32)||(R_word>126))R_word=0;
    Cur_chuanganqi.xinghao[j]= R_word;
  }
  Stop();
}
/*
void Flash_B_Read_buffer(int addr)
{
 int j;
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xd4;
  Send_Start();
  word = 0;
  Send_Byte();
 
  word =0;
  Send_Byte();
  
  word = addr;
  Send_Byte();
  word =0;
  Send_Byte();
  
  for(j=0;j<size;j++)
  {
    Receive_Byte();
    R_tab[j]= R_word;
  }
  
  Stop();
}
*/
void Flash_B_power_on(void)
{
   P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xab;
  Send_Start(); 
  Stop();
}
void Flash_B_power_off(void)
{
  P4DIR |= BIT6;//CS out
  P4OUT &=~BIT6;
  cmd_word = 0xb9;
  Send_Start();
  Stop();
}

void Flash_B_IOinit(void)
{
  P4DIR |=BIT4+BIT5+BIT6;
  P5SEL &=~(BIT1+BIT3+BIT2);
  P5DIR |=BIT0+BIT3;
  P5OUT |= BIT0+BIT3;
  P4OUT |= BIT3+BIT4+BIT5+BIT6;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -