Jump to content

    
Sign in to follow this  
satnettv

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites
народ, помогите разобраться в следующем.

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

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

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

 

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

 

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

 

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

Share this post


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

 

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

 

 

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

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

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

 

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

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

 

 

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

 

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

 

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

 

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this