реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AVR + внешняя память, mega128 (at90can) + at45db161
satnettv
сообщение Sep 15 2008, 14:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



народ, помогите разобраться в следующем.
для теста пишу в буфер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 микроконтроллера
Go to the top of the page
 
+Quote Post
domowoj
сообщение Sep 15 2008, 14:44
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Честно говоря
пишутолько на асм
но если хочешь помогу.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Glintvein
сообщение Sep 15 2008, 14:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-05-06
Пользователь №: 16 649



Цитата(satnettv @ Sep 15 2008, 18:10) *
народ, помогите разобраться в следующем.
для теста пишу в буфер1 несколько значений, затем переношу буфер1 на страницу памяти, например в 1.
далее идет проверка
читаю эту страницу-> переношу ее в буфер1, проверяю что есть в буфере1.

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

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


А вкакой момент питанием то передергиваешь не понятно, а буферы, если что, энергозависимые.
Go to the top of the page
 
+Quote Post
Ph. Anatoliy
сообщение Sep 15 2008, 15:35
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-12-07
Из: г. Таганрог, Ростовская обл.
Пользователь №: 33 310



Случаем не нужно перед тем как что-либо записать в память, стереть страницу?
Go to the top of the page
 
+Quote Post
satnettv
сообщение Sep 15 2008, 17:39
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Цитата(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) *
Случаем не нужно перед тем как что-либо записать в память, стереть страницу?



возможно и нужно, но чем объяснить тот факт, что до передергивания питанием или сбросом проверка на правильность чтения из памяти проходит нормально.
Go to the top of the page
 
+Quote Post
satnettv
сообщение Sep 16 2008, 06:48
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



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



буду рад помощи.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 01:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016