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

📄 main.c

📁 基于430F247单片机,4Mflash串行读取存储器SST25VF032B的读写程序
💻 C
字号:
#include "msp430x24x.h"
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char

uchar datax[256];
uchar a;
unsigned char temp[256];
unsigned long poinx=0;
uchar flashRead_data(unsigned long fl_addr);
#include "gq.h"
#include "xianshi.h"
uchar buff1;

#define fCS_EN   P5OUT &= ~BIT0
#define fCS_DEN  P5OUT |= BIT0
#define fCS_OUT  P5DIR |= BIT0
//////////////////////
//SPI初始化
void UCB1Init(void)
{P5SEL |= BIT1+BIT2+BIT3;                            // P5.5,2 USCI_B0 option select
 fCS_OUT;                            // P5.0 output direction
 UCB1CTL0 |= UCMST+UCSYNC+UCMSB+UCCKPH;       // 4-pin, 8-bit SPI mstr, MSB 1st
 UCB1CTL1 |= UCSSEL_2;                     // SMCLK
 UCB1BR0 = 0x01;
 UCB1BR1 = 0;
 UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine** 
}
void flashSend_Byte(uchar odata)
{UCB1TXBUF=odata;}
////////////////////
uchar flashGet_Byte(void)
{uchar indata;
 indata=UCB1RXBUF;
 return indata;
}
unsigned char Read_SR(void)
{unsigned char tmp_byte;	
 tmp_byte=0;
 fCS_EN;                    //使能片选
 flashSend_Byte(0x05);          //发送读状态寄存器命令字
 flashSend_Byte(0x00);
 tmp_byte=flashGet_Byte();   //从端口读出的状态寄存器的内容
 fCS_DEN;                  //禁止使能
 return tmp_byte;         //返回读出值
}
void Wait_Busy()
{while ((Read_SR())&0x01 == 0x01)	/* waste time until not busy */
 Read_SR();
}
void WREN_Check()
{uchar byte;
 byte = Read_SR();	/* 读取状态register */
 if((byte&0x02)!=0x02)		/* 检查WEL位置位 */
 {fCS_EN;
  flashSend_Byte(0x06);
  delay_us(0.5);
  fCS_DEN;//如果未置1进行相应处理,如对其进行写使得操作
 }
}
void Chip_Erase(void)
{WREN_Check();
 fCS_EN;
 flashSend_Byte(0x60);                        //片擦除命令字
 delay_us(0.5);
 fCS_DEN;
 Wait_Busy();
}
void Sector_Erase(unsigned long Dst)
{WREN_Check();
 fCS_EN;				/* enable device */
 flashSend_Byte(0x20);			/* send Sector Erase command */
 flashSend_Byte(((Dst & 0xFFFFFF) >> 16)); 	/* send 3 address bytes */
 flashSend_Byte(((Dst & 0xFFFF) >> 8));
 flashSend_Byte(Dst & 0xFF);
 delay_us(0.5);
 fCS_DEN;			/* disable device */
 Wait_Busy();
}
void Block_Erase_32K(unsigned long Dst)
{
	WREN_Check();
	fCS_EN;				
	flashSend_Byte(0x52);			/* 发送32 KByte Block Erase命令*/
	flashSend_Byte(((Dst & 0xFFFFFF) >> 16)); 	/* 发送3bytes地址*/
	flashSend_Byte(((Dst & 0xFFFF) >> 8));
	flashSend_Byte(Dst & 0xFF);
	delay_us(0.5);
        fCS_DEN;			/* disable device */
        Wait_Busy();		
}
void Block_Erase_64K(unsigned long Dst)
{
	WREN_Check();
	fCS_EN;			
	flashSend_Byte(0xD8);			/* 发送64KByte Block Erase 命令 */
	flashSend_Byte(((Dst & 0xFFFFFF) >> 16)); 	/* 发送3 bytes地址 */
	flashSend_Byte(((Dst & 0xFFFF) >> 8));
	flashSend_Byte(Dst & 0xFF);
	delay_us(0.5);
        fCS_DEN;			/* disable device */
        Wait_Busy();	
}
void flashwrite_data(unsigned long fl_addr,uchar fl_data)//向FLASH的一地址写数据进去
{fCS_EN;
 flashSend_Byte(0x06);
 delay_us(0.5);
 fCS_DEN;
 fCS_EN;
 flashSend_Byte(0x02);//字节编程命令字
 flashSend_Byte(((fl_addr&0xFFFFFF) >> 16));
 flashSend_Byte(((fl_addr&0xFFFF) >> 8));
 flashSend_Byte(fl_addr&0xFF);
 flashSend_Byte(fl_data);
 delay_us(0.5);
 fCS_DEN;
}
///////////////
uchar flashRead_data(unsigned long fl_addr) //从FLASH某一地址读出数据
{uchar fdabyte;	
 fCS_EN;
 flashSend_Byte(0x03);
 flashSend_Byte(((fl_addr & 0xFFFFFF) >> 16));
 flashSend_Byte(((fl_addr & 0xFFFF) >> 8));
 flashSend_Byte(fl_addr & 0xFF);
 flashSend_Byte(0x00);
 fdabyte=flashGet_Byte();
 fCS_DEN;
 return fdabyte;
}
//////////////
void UCA1UART_init()
{
    P3SEL |= BIT6+BIT7;                            // P3.6,7= USCI_A1 TXD/RXD
    P3DIR |= BIT6;                            //输出
    P3DIR &= ~BIT7;
    UCA1CTL1 |= UCSSEL_3;                     // CLK = SMCLK
    UCA1BR0 = 142;                            // 8MHz-19200
    UCA1BR1 = 0x00;                           // 65+0*256=833    
    UCA1MCTL = UCBRS1+UCBRS0+UCBRS2;                    // Modulation UCBRSx = 4
   // UCA1BR0 = 0x41;                            // 8MHz-19200
  ///  UCA1BR1 = 0x03;                           // 65+0*256=833    
  //  UCA1MCTL = UCBRS1;                         // Modulation UCBRSx = 4
 
    UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
    UC1IE |= UCA1RXIE;                          // Enable USCI_A0 RX interrupt
   _EINT();   
}
#pragma vector=USCIAB1RX_VECTOR 
__interrupt void USART1_RX(void)
{
  buff1=UCA1RXBUF;
  flashwrite_data(65536+poinx,buff1);
  poinx++;
}
/////////////////////
void ClkInit(void)//基本时钟初始化//
{unsigned int i;
 BCSCTL1&=~XT2OFF;//则启动TX2
 BCSCTL3 |= XT2S_2;
 do
  {
    IFG1&=~OFIFG;//清除振荡器故障标志
    for (i = 0xFF; i > 0; i--);//延时h
  }
  while((IFG1&OFIFG)!=0);//判断故障标志是否存在
  BCSCTL2 += SELM_2;   //MCLK选择TX2(8MHZ)
  BCSCTL2 += SELS;     //SMCLK选择TX2(8MHZ)
}
unsigned int const qiya[9]={9698,9699,9698,9699,9700,9701,9700,9699,9700};
uchar qiyabc[18];
unsigned int qi[9]={0x0000};
uchar qiu,qiu1;
unsigned int qy;
////////////
int main( void )
{unsigned long i,j;
 //unsigned long i;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  ClkInit();
  LCD_init();
  LCD_clear();
  UCB1Init();
  fCS_EN;
  flashSend_Byte(0x50);
  delay_us(1);
  fCS_DEN;
  fCS_EN;
  flashSend_Byte(0x01);
  flashSend_Byte(0x00);
  delay_us(1);
  fCS_DEN;
  //Chip_Erase();
  //delay_ms(50);
  
  
  
 /* for(i=0;i<256;i++)
  {flashwrite_data(i,i);
   delay_ms(50);
   buff2[i]=flashRead_data(i);
   delay_ms(50);
  }*/
 /* Sector_Erase(4096*3);
  delay_ms(50);
  Sector_Erase(4096*4);
  delay_ms(50);
  Sector_Erase(4096*5);
  delay_ms(50);
  Sector_Erase(4096*6);
  delay_ms(50);
  Sector_Erase(4096*7);
  delay_ms(50);
  Block_Erase_32K(32768);
  delay_ms(100);
  Block_Erase_64K(65536*1);
  delay_ms(100);
  Block_Erase_32K(32768*4);
  delay_ms(100);*/
 /* Block_Erase_32K(32768*5);
  Block_Erase_64K(65536*3);
  Block_Erase_64K(65536*4);
  Block_Erase_64K(65536*5);
  Block_Erase_64K(65536*6);
  Block_Erase_64K(65536*7);
  Block_Erase_64K(65536*8);*/
  /*Block_Erase_32K(32768*17);
  Block_Erase_32K(32768*18);
  Block_Erase_64K(65536*9);
  Block_Erase_64K(65536*10);
  Block_Erase_64K(65536*11);*/
 /* Block_Erase_64K(65536*12);
  Block_Erase_64K(65536*13);
  Block_Erase_64K(65536*14);
  Block_Erase_64K(65536*15);*/
 /* Block_Erase_64K(65536*16);
  Block_Erase_64K(65536*17);
  Block_Erase_64K(65536*18);
  Block_Erase_64K(65536*19);
  Block_Erase_64K(65536*20);*/
 /* Block_Erase_64K(65536*21);
  Block_Erase_64K(65536*22);
  Block_Erase_64K(65536*23);
  Block_Erase_64K(65536*24);
  Block_Erase_64K(65536*25);
  Block_Erase_64K(65536*26);
  Block_Erase_64K(65536*27);*/
 /* Block_Erase_64K(65536*28);
  Block_Erase_64K(65536*29);
  Block_Erase_64K(65536*30);
  Block_Erase_64K(65536*31);
  Block_Erase_64K(65536*32);
  Block_Erase_64K(65536*33);
 for(j=0;j<32;j++)
  {for(i=0;i<6;i++)
   {flashwrite_data((j*6+i),xsdatas[j][i]);}
  }
  for(j=0;j<116;j++)
  {for(i=0;i<24;i++)
   {flashwrite_data((200+j*24+i),xshan[j][i]);}
  }
  for(j=0;j<36;j++)
  {for(i=0;i<27;i++)
   {flashwrite_data((3000+j*27+i),znztux[j][i]);}
  }
  for(i=0;i<597;i++)
  {flashwrite_data(4000+i,year_code[i]);
  }*/
  /*Sector_Erase(4096*2);
  j=0;
  for(i=0;i<9;i++)
   {qiyabc[j++]=(qiya[i]>>8);
    qiyabc[j++]=qiya[i];
   }
  for(i=0;i<18;i++)//气压数据保存
   {flashwrite_data(8192+i,qiyabc[i]);}
  for(i=0;i<18;i++)//气压数据读取
    {qiyabc[i]=flashRead_data(8192+i);}
  j=0;
  for(i=0;i<9;i++)
    {qi[i]=qiyabc[j++];
     qi[i]=(qi[i]<<8)|qiyabc[j++];
    }
 // qiu=flashRead_data(8192);
 // qiu1=flashRead_data(8193);*/
  
  
  LCD_write_addrdata(0x40,0x80,0);
  LCD_write_addrdata(0x40,0x86,1);
  LCD_write_addrdata(0x40,0x8c,2);
  LCD_write_addrdata(0x40,0x98,31);
  LCD_write_addrhan(0x40,0xb0,105);
  LCD_write_addrdata1(0x40,0xbc,7,8,105);
  LCD_write_addrhan1(0x42,0x80,104);
  LCD_write_addrhan2(0x42,0x8c,101,109);
  znanzhtu(0x41,0x98,33);
  znanzhtu(0x42,0x98,34);
  znanzhtu(0x43,0x98,35);
  UCA1UART_init();
  
   while(1)
 {
   for(i=0;i<127;i++)
      datax[i]=flashRead_data(i);
 }

}

⌨️ 快捷键说明

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