народ, помогите разобраться в следующем. для теста пишу в буфер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 микроконтроллера
|