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

📄 spi0.c

📁 在C8051中用I/O口模拟SPI的C代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
		SendSPIByte(B1_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}
//缓存写主存
void FlashBuffer2ProgNoErase(void) //直接将缓存2写入Flash一页(不擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B2_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}
//擦除+缓存写主存
void FlashBuffer1ProgAutoErase(void) //直接将缓存1写入Flash一页(先擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B1_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}

//擦除+缓存写主存
void FlashBuffer2ProgAutoErase(void) //直接将缓存2写入Flash一页(先擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B2_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}

//写缓存+缓存写主存
void FlashProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(不擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为82H  缓冲区2为85H
		SendSPIByte(PAGE_PROG_THROUGH_B1);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
//写缓存+缓存写主存
void FlashProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(不擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为82H  缓冲区2为85H
		SendSPIByte(PAGE_PROG_THROUGH_B2);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(先擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B1);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(先擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B2);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
sfr16 T2       = 0xcc;                 // Timer2
sfr16 DAC0     = 0xd2;                 // DAC0 data
sfr16 DAC1     = 0xd5;                 // DAC1 data
unsigned int Count1msInc;
void SYSCLK_Init (void);
void PORT_Init (void);
void SPI0_Init (void);
void Timer0_Init (void);
void main (void) {
unsigned char xdata MyBuff[1000];
unsigned char xdata MyBuff1[1000];
unsigned int i,j;
	WDTCN = 0xde;                       // disable watchdog timer
	WDTCN = 0xad;
	SYSCLK_Init ();                     // initialize oscillator
	//Timer0_Init();
	PORT_Init ();                       // initialize crossbar and GPIO
	EA=1;
	DF_RESET;
	//SPI0_Init ();                       // initialize SPI0
	RAM_CHIP_SELECT_BANK0;
    EMI0CF = 0x2F; 
   	i=1;
   	if (i)
	{ 
		Count1msInc=0;
		ErasingDataFlash();			//整片擦除
		Count1msInc=0;
      for (i=0;i<2;i++)
		{	
			AT450XXPageAddr=i;
			for (j=0;j<255;j++)
			{
				MyBuff[j]=j+i;
			}
			if (i%2)
				FlashAutoProgViaBuffer1(0,264,MyBuff); //将指定数据通过缓存1写入Flash指定位置(先擦除)
			else
				FlashAutoProgViaBuffer2(0,264,MyBuff); //将指定数据通过缓存2写入Flash指定位置(先擦除)
		}
      /*  for(i=0;i<520;i++)
		{ if(i<260)
		  MyBuff[i]=0x00;
		  else 
		  MyBuff[i]=0x01;

		}*/
	    AT450XXPageAddr=0;
		FlashBuffer1Write(20,14,"1234567890UUAA");
		FlashBuffer1Read(0,260,MyBuff1);
	   	FlashBuffer1Write(20,14,"1234567890UUAA");
	   	FlashBuffer1Read(20,14,MyBuff); //在此处设置断点,观察MyBuff的内容
		FlashBuffer1ProgNoErase();
	   	PageToBuffer2();
	   	FlashBuffer2Read(20,14,MyBuff); 
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
	   	Count1msInc=0;
	   	FlashBuffer1Write(20,14,"1234567890UUAA");
	   	Count1msInc=0;
	   	FlashBuffer1Read(100,14,MyBuff);
	   	Count1msInc=0;
	   	FlashBuffer1ProgNoErase(); 
	   	Count1msInc=0;
	   	PageToBuffer2();
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
	   	FlashProgViaBuffer1(100,14,MyBuff);
		ErasingDataFlash();
		EraseFlashPage(); 
		FlashBuffer1Read(1,1, MyBuff); //从缓冲区1的指定位置(0-263)中读入指定字节
		FlashBuffer2Read(1,1,MyBuff); //从缓冲区2的指定位置(0-263)中读入指定字节
		FlashBuffer1Write(1,1,"!");
		FlashBuffer2Write(1,1,"1");
		GetFlashStatus();
		PageToBuffer1();
		PageToBuffer2();
		FlashBuffer1ProgNoErase();
		FlashBuffer2ProgNoErase();
		FlashBuffer1ProgAutoErase();
		FlashBuffer2ProgAutoErase();
		FlashProgViaBuffer1(1,1, MyBuff);
		FlashProgViaBuffer2(1,1, MyBuff);
		FlashAutoProgViaBuffer1(1,1, MyBuff);
		FlashAutoProgViaBuffer2(1,1, MyBuff);
	}
xxx:   goto xxx;
}

void SYSCLK_Init ()
{
 uchar i;
  OSCXCN=0x67;
 for(i=0;i<250;i++);
   while(!(OSCXCN&0x80));
   OSCICN=0x08;
}

void PORT_Init ()
{
	XBR0=0x00;                 //spi and uart enable
	XBR1=0x00;                 //INT0 and INT1 disenable 
	XBR2=0xc0;                 // 弱上拉要设置  要不然产生不了中断。
	EMI0CN=0x00;               //
	EMI0CF=0x37;               //
	EMI0TC=0xff;               //
	                           //P1MDOUT=0xff;
	//EIE1=0x01;                  //spi0 interrupt enable
	//EIP1=0x01;                 // 
	P3|=0xc0;    	              //
    P0MDOUT|=0x34;

	//SPI0CFG=0x07;
	//SPI0CN=0x07;
	//SPI0CKR=0x80;
    P5=0xf0;
	//celect=0xf7;                 //
}


⌨️ 快捷键说明

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