satnettv 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба народ, помогите разобраться в следующем. для теста пишу в буфер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 микроконтроллера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба Честно говоря пишутолько на асм но если хочешь помогу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Glintvein 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба народ, помогите разобраться в следующем. для теста пишу в буфер1 несколько значений, затем переношу буфер1 на страницу памяти, например в 1. далее идет проверка читаю эту страницу-> переношу ее в буфер1, проверяю что есть в буфере1. если это делать без передергивания питания (или сброса), то все нормально работет. но если же передернуть питание, то проверка уже не проходит. В чем может быть проблема???? // переменная pgt хранится в eeprom микроконтроллера А вкакой момент питанием то передергиваешь не понятно, а буферы, если что, энергозависимые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
syslog 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба Случаем не нужно перед тем как что-либо записать в память, стереть страницу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
satnettv 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба А вкакой момент питанием то передергиваешь не понятно, а буферы, если что, энергозависимые. в первый раз слышу, что буферы энергонезависимые. 1. сначало стираю всю память 2. пишу несколько значений в буфер1 3. буфер1 перемещаю в страницу памяти. 4. затем проверяю правильность записанного, т.е. читаю страницу памяти 5. перемещаю ее в буфер1. проверка проходит нормально, но если сделать ресет контроллеру, после которого действия 1-3 не выполнятеся, то выполнив действия 4-5 проверка не проходит. Проверка заключается в правильном кол-ве миганий светодиода, кол-во миганий определяется из записанных в память значений. Случаем не нужно перед тем как что-либо записать в память, стереть страницу? возможно и нужно, но чем объяснить тот факт, что до передергивания питанием или сбросом проверка на правильность чтения из памяти проходит нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
satnettv 0 16 сентября, 2008 Опубликовано 16 сентября, 2008 · Жалоба Честно говоря пишутолько на асм но если хочешь помогу. буду рад помощи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться