Amon-Ra 0 9 мая, 2008 Опубликовано 9 мая, 2008 (изменено) · Жалоба Доброго времени суток. Такая проблема - решил поэксперементировать с внешним SPI-ПЗУ. Для начала решил в протеусе смоделить. Для обращения к памяти использую библиотеку Procyon AVRlib (http://hubbard.engr.scu.edu/avr/avrlib) Код - элементарнейший, хотел считать байт из памяти и выставить на PORTD его. Однако, в протеусе видно, что данные от контроллера идут, а память обратно не отвечает - судя по даташиту, память так себя ведет при неправильном оп-коде команд. В дефайнах библы проверил - все опкоды соответствуют, не знаю что и думать. Помогите плз ) В аттаче - ВинАВРовский проект + протеусовская модель в архиве. MemTest.rar Изменено 9 мая, 2008 пользователем Amon Ra Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 9 мая, 2008 Опубликовано 9 мая, 2008 · Жалоба В дефайнах библы проверил - все опкоды соответствуют, не знаю что и думать.Проверь правильность настройки SPI - MSB/LSB first (бит Data ORDer) в первую очередь. Потом режим тактирования (CPOL/CPHA). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Amon-Ra 0 9 мая, 2008 Опубликовано 9 мая, 2008 · Жалоба Проверь правильность настройки 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 20 декабря, 2013 Опубликовано 20 декабря, 2013 · Жалоба Чем закончилось то? Сейчас хожу по тем же граблям. Между двумя контроллерами по SPI - все отлично и туда и обратно. Между контроллером и SPI дебагером - тоже все работает. Между контроллером и EEPROM - только в одну сторону!!! Глюк протеуса или что то не так делаю? А когда отправляю в память данные, они должны дописыватся в файл .bin (прошивка для чипа памяти)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 20 декабря, 2013 Опубликовано 20 декабря, 2013 · Жалоба Если ваша программа написана так же непонятно, как и это сообщение - неудивительно, что ничего не работает. Какой контроллер, какая память, какой дебаггер, при чем тут SPI, какие данные, как отправляете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 · Жалоба А если еще и читать внимательно, то вообще все хорошо будет. Какой контроллер и память вполне должно быть понятно из названия темы. В первом же сообщении было сказано про моделирование в протеусе. SPI Debugger - инструмент протеуса. Какое имеет значение какие данные я отправляю в память? вот ей не все равно что хранить? ну а причем тут SPI при обмене между контроллером и EEPROM с интерфейсом SPI я даже не знаю что ответить. Читайте внимательнее тему. В любом случае вопрос решен, обмен идет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abell 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 · Жалоба В любом случае вопрос решен, обмен идет. Как решили, поделитесь с народом? :) Догадались память назначить Slave? Или что-то сверхъестественное, пляски с бубном? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 (изменено) · Жалоба получились танцы с бубном. заработало только после того, что сначала отправляю в еепром (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 для такой памяти сделать? Изменено 21 декабря, 2013 пользователем mmor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abell 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 · Жалоба получились танцы с бубном. ... Как режим Slave для такой памяти сделать? А линия MOSI интерфейса SPI для чего используется? Вообще, конкретно такую память не пользовал, даташита нет :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 · Жалоба MOSI для записи данных в память. Программа примерно такая: счетчик считает от 0 до 2047 (к примеру) и каждое число записывается в ЕЕПРОМ по линии MOSI. А затем в другом цикле эти числа считываются обратно по линии MISO. Вообще изначально идея была попробывать SPI ПЗУ, но в библиотеках протеуса такого нет, вот я и поставил за место него ЕЕПРОМ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abell 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 · Жалоба А что в момент передачи на линии SS происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 21 декабря, 2013 Опубликовано 21 декабря, 2013 (изменено) · Жалоба получились танцы с бубном. заработало только после того, что сначала отправляю в еепром (25АА256) команду 0000 0001 (Write STATUS register) очевидно, что гражданин недочитал до WREN. Не ну а чо: А если еще и читать внимательно, то вообще все хорошо будет. прав ведь. Изменено 25 декабря, 2013 пользователем Herz Оформление цитат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 25 декабря, 2013 Опубликовано 25 декабря, 2013 · Жалоба А что в момент передачи на линии SS происходит? команда MEM_ON - SS = 0 MEM_OFF - SS = 1 а все таки как протеус реагировать должен на запись eeprom. Должен ли он бинарник, прошитый в eeprom заполнять входящими данными или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mmor 0 25 декабря, 2013 Опубликовано 25 декабря, 2013 (изменено) · Жалоба Сам себе и отвечу. //Запись в 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, и на сайте можно скачать русский даташит. Изменено 25 декабря, 2013 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться