@ -4,8 +4,10 @@
# include "spi.h"
# include "dataflash.h"
void
dataflash_opcode_and_address ( unsigned char opcode , unsigned int page , unsigned int offset )
// Prevent Double Initialization
unsigned short dataflash_flag = 0 ;
void dataflash_opcode_and_address ( unsigned char opcode , unsigned int page , unsigned int offset )
{
SPI_MasterTransfer ( opcode ) ;
SPI_MasterTransfer ( ( unsigned char ) ( page > > 7 ) & 0x1f ) ;
@ -13,29 +15,40 @@ dataflash_opcode_and_address (unsigned char opcode, unsigned int page, unsigned
SPI_MasterTransfer ( ( unsigned char ) ( offset ) ) ;
}
void
dataflash_wait ( void )
void dataflash_wait ( void )
{
DATAFLASH_Chip_Select ;
SPI_MasterTransfer ( DATAFLASH_STATUS_REGISTER_READ ) ;
while ( ! ( SPI_MasterTransferRead ( 0x00 ) & 0x80 ) ) ;
while ( ! ( SPI_MasterTransferRead ( 0x00 ) & 0x80 ) )
;
DATAFLASH_Chip_Unselect ;
}
void
dataflash_init ( void )
void dataflash_init ( void )
{
// Check if already initialized
if ( ! ( dataflash_flag & 1 ) )
{
// Backup Status Register and disable Interrupts
uint8_t sreg = SREG ;
cli ( ) ;
// AT45DB081 doesn't actually need an intialization,
// only the ChipSelect should be configured as an output.
DDRB | = ( 1 < < PB4 ) ;
DATAFLASH_Chip_Unselect ;
SPI_MasterInit ( ) ;
// Restore Status Register
SREG = sreg ;
// Set dataflash Init Flag
dataflash_flag = 1 ;
}
}
void
dataflash_buffer_to_page ( unsigned int page , unsigned char buffer )
void dataflash_buffer_to_page ( unsigned int page , unsigned char buffer )
{
dataflash_wait ( ) ;
DATAFLASH_Chip_Select ;
@ -43,22 +56,19 @@ dataflash_buffer_to_page (unsigned int page, unsigned char buffer)
switch ( buffer )
{
default :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_1_TO_MAIN_MEMORY_PAGE_PROGRAM_WITH_BUILT_IN_ERASE ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_1_TO_MAIN_MEMORY_PAGE_PROGRAM_WITH_BUILT_IN_ERASE ,
page , 0x00 ) ;
break ;
case 2 :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_2_TO_MAIN_MEMORY_PAGE_PROGRAM_WITH_BUILT_IN_ERASE ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_2_TO_MAIN_MEMORY_PAGE_PROGRAM_WITH_BUILT_IN_ERASE ,
page , 0x00 ) ;
break ;
}
DATAFLASH_Chip_Unselect ;
}
void
dataflash_page_to_buffer ( unsigned int page , unsigned char buffer )
void dataflash_page_to_buffer ( unsigned int page , unsigned char buffer )
{
dataflash_wait ( ) ;
DATAFLASH_Chip_Select ;
@ -66,22 +76,19 @@ dataflash_page_to_buffer (unsigned int page, unsigned char buffer)
switch ( buffer )
{
default :
dataflash_opcode_and_address
( DATAFLASH_MAIN_MEMORY_PAGE_TO_BUFFER_1_TRANSFER ,
dataflash_opcode_and_address ( DATAFLASH_MAIN_MEMORY_PAGE_TO_BUFFER_1_TRANSFER ,
page , 0x00 ) ;
break ;
case 2 :
dataflash_opcode_and_address
( DATAFLASH_MAIN_MEMORY_PAGE_TO_BUFFER_2_TRANSFER ,
dataflash_opcode_and_address ( DATAFLASH_MAIN_MEMORY_PAGE_TO_BUFFER_2_TRANSFER ,
page , 0x00 ) ;
break ;
}
DATAFLASH_Chip_Unselect ;
}
void
dataflash_buffer_read ( unsigned char buffer , unsigned int offset ,
void dataflash_buffer_read ( unsigned char buffer , unsigned int offset ,
unsigned int length , unsigned char * array )
{
dataflash_wait ( ) ;
@ -90,14 +97,12 @@ dataflash_buffer_read (unsigned char buffer, unsigned int offset,
switch ( buffer )
{
default :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_1_READ_LF ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_1_READ_LF ,
0x00 , offset ) ;
break ;
case 2 :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_2_READ_LF ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_2_READ_LF ,
0x00 , offset ) ;
break ;
}
@ -112,8 +117,7 @@ dataflash_buffer_read (unsigned char buffer, unsigned int offset,
DATAFLASH_Chip_Unselect ;
}
void
dataflash_buffer_write ( unsigned char buffer , unsigned int offset ,
void dataflash_buffer_write ( unsigned char buffer , unsigned int offset ,
unsigned int length , unsigned char * array )
{
dataflash_wait ( ) ;
@ -122,14 +126,12 @@ dataflash_buffer_write (unsigned char buffer, unsigned int offset,
switch ( buffer )
{
default :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_1_WRITE ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_1_WRITE ,
0x00 , offset ) ;
break ;
case 2 :
dataflash_opcode_and_address
( DATAFLASH_BUFFER_2_WRITE ,
dataflash_opcode_and_address ( DATAFLASH_BUFFER_2_WRITE ,
0x00 , offset ) ;
break ;
}
@ -144,8 +146,7 @@ dataflash_buffer_write (unsigned char buffer, unsigned int offset,
DATAFLASH_Chip_Unselect ;
}
void
dataflash_read ( unsigned int page , unsigned int offset ,
void dataflash_read ( unsigned int page , unsigned int offset ,
unsigned int length , unsigned char * array )
{
dataflash_wait ( ) ;
@ -163,8 +164,7 @@ dataflash_read (unsigned int page, unsigned int offset,
DATAFLASH_Chip_Unselect ;
}
void
dataflash_chip_erase ( void )
void dataflash_chip_erase ( void )
{
dataflash_wait ( ) ;
DATAFLASH_Chip_Select ;