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

MEGA8 и SPI EEPROM

Доброго времени суток.

Такая проблема - решил поэксперементировать с внешним SPI-ПЗУ.

Для начала решил в протеусе смоделить.

Для обращения к памяти использую библиотеку Procyon AVRlib (http://hubbard.engr.scu.edu/avr/avrlib)

 

Код - элементарнейший, хотел считать байт из памяти и выставить на PORTD его. Однако, в протеусе видно, что данные от контроллера идут, а память обратно не отвечает - судя по даташиту, память так себя ведет при неправильном оп-коде команд. В дефайнах библы проверил - все опкоды соответствуют, не знаю что и думать.

 

Помогите плз )

 

В аттаче - ВинАВРовский проект + протеусовская модель в архиве.

MemTest.rar

Изменено пользователем Amon Ra

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


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

В дефайнах библы проверил - все опкоды соответствуют, не знаю что и думать.
Проверь правильность настройки SPI - MSB/LSB first (бит Data ORDer) в первую очередь. Потом режим тактирования (CPOL/CPHA).

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


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

Проверь правильность настройки SPI - MSB/LSB first (бит Data ORDer) в первую очередь. Потом режим тактирования (CPOL/CPHA).

 

Пробовал и руками инициализировать, и функцией инициализации из этой библы.

Вроде все норм, код инициализации из библы:

 

   sbi(PORTB, 5);  // set SCK hi
    sbi(DDRB, 5);   // set SCK as output
    cbi(DDRB, 4);   // set MISO as input
    sbi(DDRB, 3);   // set MOSI as output
    sbi(DDRB, 2);   // SS must be output for Master mode to work

    // setup SPI interface :
    // master mode
    sbi(SPCR, MSTR);
    // clock = f/4
//    cbi(SPCR, SPR0);
//    cbi(SPCR, SPR1);
    // clock = f/16
    cbi(SPCR, SPR0);
    sbi(SPCR, SPR1);
    // select clock phase positive-going in middle of data
    cbi(SPCR, CPOL);
    // Data order MSB first
    cbi(SPCR,DORD);
    // enable SPI
    sbi(SPCR, SPE);

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


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

Чем закончилось то? Сейчас хожу по тем же граблям. Между двумя контроллерами по SPI - все отлично и туда и обратно. Между контроллером и SPI дебагером - тоже все работает.

Между контроллером и EEPROM - только в одну сторону!!!

Глюк протеуса или что то не так делаю?

А когда отправляю в память данные, они должны дописыватся в файл .bin (прошивка для чипа памяти)?

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


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

Если ваша программа написана так же непонятно, как и это сообщение - неудивительно, что ничего не работает. Какой контроллер, какая память, какой дебаггер, при чем тут SPI, какие данные, как отправляете?

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


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

А если еще и читать внимательно, то вообще все хорошо будет. Какой контроллер и память вполне должно быть понятно из названия темы. В первом же сообщении было сказано про моделирование в протеусе. SPI Debugger - инструмент протеуса. Какое имеет значение какие данные я отправляю в память? вот ей не все равно что хранить? ну а причем тут SPI при обмене между контроллером и EEPROM с интерфейсом SPI я даже не знаю что ответить. Читайте внимательнее тему.

В любом случае вопрос решен, обмен идет.

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


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

В любом случае вопрос решен, обмен идет.

Как решили, поделитесь с народом? :)

Догадались память назначить Slave? Или что-то сверхъестественное, пляски с бубном?

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


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

получились танцы с бубном. заработало только после того, что сначала отправляю в еепром (25АА256) команду 0000 0001 (Write STATUS register)

после этого команду записи (потом данные) а после этого команду чтения.

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

пример кода:

//Запись

MEM_ON; //CS

SPDR= 0x01; //wrsr

while(!(SPSR & (1<<SPIF)));

SPDR=0x02; // write

while(!(SPSR & (1<<SPIF)));

SPDR=0; //adressH

while(!(SPSR & (1<<SPIF)));

SPDR=0; // adressL

while(!(SPSR & (1<<SPIF)));

SPDR=Data; // данные

while(!(SPSR & (1<<SPIF)));

MEM_OFF;

//Чтение

MEM_ON;

SPDR=0x03; //Read

while(!(SPSR & (1<<SPIF)));

SPDR=0;

while(!(SPSR & (1<<SPIF)));

SPDR=0;

while(!(SPSR & (1<<SPIF)));

SPDR = 0xff;

while(!(SPSR & (1<<SPIF)));

Data = SPDR;

MEM_OFF;

 

Думаю делаю неправильно. Надо более подробно читать даташит.

Получается что моя команда write становится как бы регистром статуса для команды wrsr.

В регистре SPCR бит DWORD = 0;

Как режим Slave для такой памяти сделать?

Изменено пользователем mmor

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


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

получились танцы с бубном.

...

Как режим Slave для такой памяти сделать?

А линия MOSI интерфейса SPI для чего используется?

Вообще, конкретно такую память не пользовал, даташита нет :laughing:

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


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

MOSI для записи данных в память.

Программа примерно такая: счетчик считает от 0 до 2047 (к примеру) и каждое число записывается в ЕЕПРОМ по линии MOSI. А затем в другом цикле эти числа считываются обратно по линии MISO. Вообще изначально идея была попробывать SPI ПЗУ, но в библиотеках протеуса такого нет, вот я и поставил за место него ЕЕПРОМ.

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


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

А что в момент передачи на линии SS происходит?

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


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

получились танцы с бубном. заработало только после того, что сначала отправляю в еепром (25АА256) команду 0000 0001 (Write STATUS register)

очевидно, что гражданин недочитал до WREN. Не ну а чо:

А если еще и читать внимательно, то вообще все хорошо будет.

прав ведь.

Изменено пользователем Herz
Оформление цитат

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


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

А что в момент передачи на линии SS происходит?

 

 

команда MEM_ON - SS = 0

MEM_OFF - SS = 1

 

а все таки как протеус реагировать должен на запись eeprom. Должен ли он бинарник, прошитый в eeprom заполнять входящими данными или нет?

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


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

Сам себе и отвечу.

 

//Запись в EEPROM
// инициализация EEPROM
CS_L;
CS_H;

//1. Разрешаем запись. Отправляем команду WREN
CS_L;
SPDR = 0x06;
while(!(SPSR & (1<<SPIF)));
CS_H;

//2. Пишем данные WRITE
CS_L;
SPDR = 0x02;
while(!(SPSR & (1<<SPIF)));
SPDR = 0;						//адрес 0
while(!(SPSR & (1<<SPIF)));
SPDR = 0x05;					//данные
while(!(SPSR & (1<<SPIF)));
PORTD = 0x05;					//
CS_H;

/*
//Чтение статуса
CS_L;
SPDR = 0x05;					//читаем регистр статуса
while(!(SPSR & (1<<SPIF)));
SPDR = 0xff; //заглушка
while(!(SPSR & (1<<SPIF)));
PORTD = SPDR; 				// считанные данные
CS_H;
*/
_delay_us(10);

//3. Чтение данных
CS_L;
SPDR = 0x03;					//READ
while(!(SPSR & (1<<SPIF)));
SPDR = 0;						// Адресс
while(!(SPSR & (1<<SPIF)));
SPDR = 0xff; 					//заглушка
while(!(SPSR & (1<<SPIF)));
PORTD = SPDR; 				// считанные данные
CS_H;

 

CS_L - low

CS_H - hight

 

Данные в EEPROM действительно пишутся в протеусе, но бинарник не меняется.

Для того, что бы проще было смотреть, выставил время записи 2us. Как раз попробую EEPROM в качестве ОЗУ с малым временем записи.

 

EEPROM 25AA020А.

 

Фмрма Интеграл выпускает полные аналоги этого EEPROM, и на сайте можно скачать русский даташит.

Изменено пользователем Herz

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


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

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

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

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

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

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

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

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

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

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