Перейти к содержанию
    

AVR + внешняя память

народ, помогите разобраться в следующем.

для теста пишу в буфер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 микроконтроллера

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно говоря

пишутолько на асм

но если хочешь помогу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

народ, помогите разобраться в следующем.

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

далее идет проверка

читаю эту страницу-> переношу ее в буфер1, проверяю что есть в буфере1.

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Случаем не нужно перед тем как что-либо записать в память, стереть страницу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

1. сначало стираю всю память

2. пишу несколько значений в буфер1

3. буфер1 перемещаю в страницу памяти.

 

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

5. перемещаю ее в буфер1.

 

 

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

 

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

 

Случаем не нужно перед тем как что-либо записать в память, стереть страницу?

 

 

возможно и нужно, но чем объяснить тот факт, что до передергивания питанием или сбросом проверка на правильность чтения из памяти проходит нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно говоря

пишутолько на асм

но если хочешь помогу.

 

 

буду рад помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...