📄 dataflash.c
字号:
DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //read byte(s) from buffer 1 { DF_SPI_RW(Buf1Read); //buffer 1 read op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(0x00); //don't cares for( i=0; i<No_of_bytes; i++) { *(BufferPtr) = DF_SPI_RW(0x00); //read byte and put it in AVR buffer pointed to by *BufferPtr BufferPtr++; //point to next element in AVR buffer } } #ifdef USE_BUFFER2 else if (2 == BufferNo) //read byte(s) from buffer 2 { DF_SPI_RW(Buf2Read); //buffer 2 read op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(0x00); //don't cares for( i=0; i<No_of_bytes; i++) { *(BufferPtr) = DF_SPI_RW(0x00); //read byte and put it in AVR buffer pointed to by *BufferPtr BufferPtr++; //point to next element in AVR buffer } }#endif}//NB : Sjekk at (IntAdr + No_of_bytes) < buffersize, hvis ikke blir det bare ball..*//******************************************************************************* Function name : Buffer_Write_Enable** Returns : None** Parameters : IntPageAdr -> Internal page address to start writing from* BufferAdr -> Decides usage of either buffer 1 or 2* * Purpose : Enables continous write functionality to one of the dataflash buffers* buffers. NOTE : User must ensure that CS goes high to terminate* this mode before accessing other dataflash functionalities *******************************************************************************/void Buffer_Write_Enable (unsigned char BufferNo, unsigned int IntPageAdr){ DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //write enable to buffer 1 { DF_SPI_RW(Buf1Write); //buffer 1 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address } #ifdef USE_BUFFER2 else if (2 == BufferNo) //write enable to buffer 2 { DF_SPI_RW(Buf2Write); //buffer 2 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address }#endif}/******************************************************************************* Function name : Buffer_Write_Byte** Returns : None** Parameters : IntPageAdr -> Internal page address to write byte to* BufferAdr -> Decides usage of either buffer 1 or 2* Data -> Data byte to be written** Purpose : Writes one byte to one of the dataflash* internal SRAM buffers*******************************************************************************//*void Buffer_Write_Byte (unsigned char BufferNo, unsigned int IntPageAdr, unsigned char Data){ DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //write byte to buffer 1 { DF_SPI_RW(Buf1Write); //buffer 1 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(Data); //write data byte }#ifdef USE_BUFFER2 else if (2 == BufferNo) //write byte to buffer 2 { DF_SPI_RW(Buf2Write); //buffer 2 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(Data); //write data byte } #endif}*//******************************************************************************* Function name : Buffer_Write_Str** Returns : None** Parameters : BufferNo -> Decides usage of either buffer 1 or 2* IntPageAdr -> Internal page address* No_of_bytes -> Number of bytes to be written* *BufferPtr -> address of buffer to be used for copy of bytes* from AVR buffer to dataflash buffer 1 (or 2)** Purpose : Copies one or more bytes to one of the dataflash* internal SRAM buffers from AVR SRAM buffer* pointed to by *BufferPtr*******************************************************************************//*void Buffer_Write_Str (unsigned char BufferNo, unsigned int IntPageAdr, unsigned int No_of_bytes, unsigned char *BufferPtr){ unsigned int i; DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //write byte(s) to buffer 1 { DF_SPI_RW(Buf1Write); //buffer 1 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address for( i=0; i<No_of_bytes; i++) { DF_SPI_RW(*(BufferPtr)); //write byte pointed at by *BufferPtr to dataflash buffer 1 location BufferPtr++; //point to next element in AVR buffer } }#ifdef USE_BUFFER2 else if (2 == BufferNo) //write byte(s) to buffer 2 { DF_SPI_RW(Buf2Write); //buffer 2 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address for( i=0; i<No_of_bytes; i++) { DF_SPI_RW(*(BufferPtr)); //write byte pointed at by *BufferPtr to dataflash buffer 2 location BufferPtr++; //point to next element in AVR buffer } }#endif}//NB : Monitorer busy-flag i status-reg.//NB : Sjekk at (IntAdr + No_of_bytes) < buffersize, hvis ikke blir det bare ball..*//******************************************************************************* Function name : Buffer_To_Page** Returns : None** Parameters : BufferAdr -> Decides usage of either buffer 1 or 2* PageAdr -> Address of flash page to be programmed** Purpose : Transfers a page from dataflash SRAM buffer to flash* ******************************************************************************/void Buffer_To_Page (unsigned char BufferNo, unsigned int PageAdr){ DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //program flash page from buffer 1 { DF_SPI_RW(Buf1ToFlashWE); //buffer 1 to flash with erase op-code DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits))); //upper part of page address DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8))); //lower part of page address DF_SPI_RW(0x00); //don't cares }#ifdef USE_BUFFER2 else if (2 == BufferNo) //program flash page from buffer 2 { DF_SPI_RW(Buf2ToFlashWE); //buffer 2 to flash with erase op-code DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits))); //upper part of page address DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8))); //lower part of page address DF_SPI_RW(0x00); //don't cares }#endif DF_CS_inactive; //initiate flash page programming }/******************************************************************************* Function name : Cont_Flash_Read_Enable** Returns : None** Parameters : PageAdr -> Address of flash page where cont.read starts from* IntPageAdr -> Internal page address where cont.read starts from** Purpose : Initiates a continuous read from a location in the DataFlash* ******************************************************************************/void Cont_Flash_Read_Enable (unsigned int PageAdr, unsigned int IntPageAdr){ DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder DF_SPI_RW(ContArrayRead); //Continuous Array Read op-code DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits))); //upper part of page address DF_SPI_RW((unsigned char)((PageAdr << (PageBits - 8))+ (IntPageAdr>>8))); //lower part of page address and MSB of int.page adr. DF_SPI_RW((unsigned char)(IntPageAdr)); //LSB byte of internal page address DF_SPI_RW(0x00); //perform 4 dummy writes DF_SPI_RW(0x00); //in order to intiate DataFlash DF_SPI_RW(0x00); //address pointers DF_SPI_RW(0x00);}// *****************************[ End Of DATAFLASH.C ]*************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -