Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR + внешняя память
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
satnettv
народ, помогите разобраться в следующем.
для теста пишу в буфер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
Честно говоря
пишутолько на асм
но если хочешь помогу.
Glintvein
Цитата(satnettv @ Sep 15 2008, 18:10) *
народ, помогите разобраться в следующем.
для теста пишу в буфер1 несколько значений, затем переношу буфер1 на страницу памяти, например в 1.
далее идет проверка
читаю эту страницу-> переношу ее в буфер1, проверяю что есть в буфере1.

если это делать без передергивания питания (или сброса), то все нормально работет. но если же передернуть питание, то проверка уже не проходит. В чем может быть проблема????

// переменная pgt хранится в eeprom микроконтроллера


А вкакой момент питанием то передергиваешь не понятно, а буферы, если что, энергозависимые.
Ph. Anatoliy
Случаем не нужно перед тем как что-либо записать в память, стереть страницу?
satnettv
Цитата(Glintvein @ Sep 15 2008, 18:58) *
А вкакой момент питанием то передергиваешь не понятно, а буферы, если что, энергозависимые.


в первый раз слышу, что буферы энергонезависимые.


1. сначало стираю всю память
2. пишу несколько значений в буфер1
3. буфер1 перемещаю в страницу памяти.

4. затем проверяю правильность записанного, т.е. читаю страницу памяти
5. перемещаю ее в буфер1.


проверка проходит нормально, но если сделать ресет контроллеру, после которого действия 1-3 не выполнятеся, то выполнив действия 4-5 проверка не проходит.

Проверка заключается в правильном кол-ве миганий светодиода, кол-во миганий определяется из записанных в память значений.

Цитата(Ph. Anatoliy @ Sep 15 2008, 19:35) *
Случаем не нужно перед тем как что-либо записать в память, стереть страницу?



возможно и нужно, но чем объяснить тот факт, что до передергивания питанием или сбросом проверка на правильность чтения из памяти проходит нормально.
satnettv
Цитата(domowoj @ Sep 15 2008, 18:44) *
Честно говоря
пишутолько на асм
но если хочешь помогу.



буду рад помощи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.