народ, помогите разобраться в следующем.
для теста пишу в буфер1 несколько значений, затем переношу буфер1 на страницу памяти, например в 1.
далее идет проверка
читаю эту страницу-> переношу ее в буфер1, проверяю что есть в буфере1.
если это делать без передергивания питания (или сброса), то все нормально работет. но если же передернуть питание, то проверка уже не проходит. В чем может быть проблема????
вот мои функции:
Функция записи Байта в буфер1 - пример вызова:
void write_b1(unsigned char flash_data)
{
static unsigned int buffer_counter=0;
unsigned char temp = 0x80;
SPCR = 0x5C; // MSB first, SPI mode 3, Fcl/4
delay_ms(5);
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = BUFFER_1_WRITE;
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // don't cares
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(buffer_counter>>8); // don't cares plus first two bits of buffer address
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)buffer_counter; // buffer address (max. 2^8 = 256 pages)
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = flash_data; // write data into SPI Data Register
while (!(SPSR & temp)); // wait for data transfer to be completed
PORTB |= DF_CHIP_SELECT; // disable DataFlash
buffer_counter++; // Хранит позицию в буфере для записи байта
}
void read_b1 (void)
{
unsigned int buffer_counter = 0;
unsigned char temp = 0x80;
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = BUFFER_1_READ; // read from buffer1
SPDR = 0x00; // write don't care byte
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // write don't care byte
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // start at buffer address 0
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // write don't care byte
while (!(SPSR & temp)); // wait for data transfer to be completed
while (buffer_counter < 3) // читаю только первые 3 значения для проверки
{
SPDR = 0xFF; // write dummy value to start register shift
while (!(SPSR & temp)); // wait for data transfer to be completed
res=res+(char)SPDR;
buffer_counter++;
}
PORTB |= DF_CHIP_SELECT; // disable DataFlash
}
void b1_to_mm(unsigned char page_counter) //буфер1 переношу на страницу память
{
unsigned char temp = 0x80;
delay_ms(5);
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = B1_TO_MM_PAGE_PROG_WO_ERASE; // write data from buffer1 to page
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(page_counter>>6);
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(page_counter<<2);
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // don't cares
while (!(SPSR & temp)); // wait for data transfer to be completed
PORTB |= DF_CHIP_SELECT; // disable DataFlash and start transaction
}
void mm_to_b1 (unsigned char page_counter) // страницу памяти в буфер1
{
unsigned char temp = 0x80;
delay_ms(5);
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = MM_PAGE_TO_B1_XFER; // transfer next page to buffer1
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(page_counter >> 6);
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(page_counter << 2);
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // write don't care byte
while (!(SPSR & temp)); // wait for data transfer to be completed
PORTB |= DF_CHIP_SELECT; // disable DataFlash and start transaction
}
void main(void)
{
if (pgt==0)
{
SDON;
erasing();
SDOF;
delay_ms(500);
write_b1(1);
write_b1(2);
write_b1(3);
write_b1(4);
write_b1(5);
write_b1(6);
delay_ms(500);
b1_to_mm(1);
pgt=1;
}
delay_ms(500);
mm_to_b1(1);
delay_ms(500);
read_b1();
mig_sd(res,500); delay_ms(500); // мигает 6 раз
// переменная pgt хранится в eeprom микроконтроллера