Технический форум по робототехнике.
grek » 03 июл 2013, 19:34
Добрый день.Подскажите как заставить записывать и считывать на данный тип флехи SPI флеш AT25DF041 - AVR. Может кто выложит рабочий код с данным типом флешки. Не могу записать и прочить байт. Может она не пишет побайтно. Если не так поправьте меня.
- Код: Выделить всё • Развернуть
//****************** SPI Definitions **************//
#define CHIP_SELECT_AT25 PORTE.3=0;delay_ms(100);
#define CHIP_UNSELECT_AT25 PORTE.3=1;delay_ms(100);
//******************* SPI Definitions *************//
//******************* Instruction Set ************//
// Read Commands
#define SPI_FLASH_INS_READ 0x03 // Read array
#define SPI_FLASH_INS_FAST_READ 0x0B // Read array(low frequency)
// Program and Erase Commands
#define SPI_FLASH_INS_BLOCK_ERASE_4K 0x20 // Sector erase
#define SPI_FLASH_INS_BLOCK_ERASE_32K 0x52 // Sector erase
#define SPI_FLASH_INS_BLOCK_ERASE_64K 0xD8 // Sector erase
#define SPI_FLASH_INS_CHIP_ERASE_1 0x60 // Sector erase
#define SPI_FLASH_INS_CHIP_ERASE_2 0xC7 // Sector erase
#define SPI_FLASH_INS_PAGE_PROGRAM 0x02 // Byte/Page program
// Protection commands
#define SPI_FLASH_INS_WRITE_ENABLE 0x06 // Write enable
#define SPI_FLASH_INS_WRITE_DISABLE 0x04 // Write disable
#define SPI_FLASH_INS_PROTECT_SECTOR 0x36 // Write disable
#define SPI_FLASH_INS_UNPROTECT_SECTOR 0x39 // Write disable
// Status register commands
#define SPI_FLASH_INS_READ_STATUS_REGISTER 0x05 // Read status register
#define SPI_FLASH_INS_WRITE_STATUS_REGISTER 0x01 // Write status register
// Miscellanous Commands
#define SPI_FLASH_INS_READ_DEVICE_ID 0x9F // Read identification
#define SPI_FLASH_INS_DEEP_POWER_DOWN 0xB9 // Deep power-down
#define SPI_FLASH_INS_RESUME_FROM_DEEP_POWER_DOWN 0xAB // Release from deep power- down
//*************** Instruction Set ***************//
while (1)
{
PORTE.2=0;
if(getchar()==0x31)
{
CHIP_SELECT_AT25 // _S Low
PORTE.2=1;
spi(SPI_FLASH_INS_PAGE_PROGRAM);
spi(0x00);
spi(0xFF);
spi(0x00); // adress 000005
spi(0x68); // данные
delay_ms(1);
putchar('w');
delay_ms(100);
CHIP_UNSELECT_AT25 // _S High
PORTE.2=0;
}
if(getchar()==0x32)
{
CHIP_SELECT_AT25 // _S Low
PORTE.2=1;
//spi(SPI_FLASH_INS_READ_STATUS_REGISTER);
spi(SPI_FLASH_INS_READ );
spi(0x00);
spi(0xFF);
spi(0x00);// adress 000005
receivedchar[0]=spi(0xFF); // считываем значение в переменную
delay_ms(1);
putchar('r');
delay_ms(1);
putchar(receivedchar[0]);
delay_ms(1);
CHIP_UNSELECT_AT25 // _S High
PORTE.2=0;
}
}
}
вот запись и вывод значения по 485 порту но постоянно вижу FF. Подскажите как правильно считать данные с флешки данного типа?
И статус регистор тоже не читает, FF постоянно
- Код: Выделить всё • Развернуть
if(getchar()==0x32)
{
CHIP_SELECT_AT25 // _S Low
PORTE.2=1;
spi(SPI_FLASH_INS_READ_STATUS_REGISTER);
/*spi(SPI_FLASH_INS_READ );
spi(0x00);
spi(0xFF);
spi(0x00);// adress 000005
*/
//receivedchar[0]=spi(0xFF); // считываем значение в переменную
receivedchar[0]=spi(0x00); // считываем значение в переменную
delay_ms(1);
putchar('r');
delay_ms(1);
putchar(receivedchar[0]);
delay_ms(1);
CHIP_UNSELECT_AT25 // _S High
PORTE.2=0;
}
grek » 08 июл 2013, 03:17
Подскажите на какой минимальной частоте работает данная флешка ?
avr123.nm.ru » 08 июл 2013, 18:44
Наверно даже в статике будет работать.
grek » 08 июл 2013, 20:14
Флешка стала отвечать, дело было в опторазвязке, которая стоит между контроллером и флеш. ADUM1401 может, что упустил в ее работе по SPI. Пока пробую без нее, настрою и потом буду искать в чем же проблема.
- Код: Выделить всё • Развернуть
PORTE.2=0;// прием по RS485
if(getchar()==0x31) // запрос ID
{
PORTE.2=1; // вкл передачу RS485
CHIP_SELECT_AT25 // _S Low // разрешение работы AT25
spi(SPI_FLASH_INS_READ_DEVICE_ID); // передача оптокода SPI_FLASH_INS_READ_DEVICE_ID ответ FF его не принимаем
receivedchar[0]=spi(0xFF); // принимает код предприятия от AT25
receivedchar[1]=spi(0xFF); // и соответствующее данные(для ответа подаем FF)
receivedchar[2]=spi(0xFF);
delay_ms(1);
CHIP_UNSELECT_AT25 // _S High; // запрет работы AT25
putchar(receivedchar[0]); // вывод значение принятых данных в терминал
delay_ms(1);
putchar(receivedchar[1]);
delay_ms(1);
putchar(receivedchar[2]);
delay_ms(1);
putchar('I');
delay_ms(1000);
PORTE.2=0;// прием по RS485
}
RoboHobbyRu » 08 июл 2013, 20:31
ХМ, а зачем между контроллером и флэшкой гальваноразвязка?
grek » 09 июл 2013, 01:03
Схема такая ,что требуется развязка и в принципе она должна работы.
grek » 09 июл 2013, 12:51
Что то я немного не понимаю, микросхема AT25DF041A-SSH-B работает от 5V , а от 3.3V не работает хотя по даташит от 2.3 до 3.6 ? Очень интересно,пробовал разные микросхемы. Обе работают от 5 V.
Duhas » 09 июл 2013, 17:39
а вы у нее на ногах измеряете ? и 0 и 3.3 прям с ее ног берете ?
RoboHobbyRu » 09 июл 2013, 18:10
>>микросхема AT25DF041A-SSH-B работает от 5V , а от 3.3V
скорее всего память-то работает, только контроллер её не понимает (работающий от 5 В).
Приведите свою схему.
grek » 09 июл 2013, 19:49
Сначала стояло так. Контролер Mega (5V) потом развязка Adum1401 с одной стороны ее 5v, со стороны флешки все питания 3.6 V. Не работает импульсы от нее исходили непонятные.Потом напрямую без развязки питания +5V, отвечает(по даташит не слова про 5v?). Далее решил попробовать +3.3 на питания выводы все управления остались на 5V не работает. Конечно правильнее и управление сделать на 3.6V , но так к сожалению не пробовал. Хотя как я думаю эти уровни для меги не должны быть креичными.
а вы у нее на ногах измеряете ? и 0 и 3.3 прям с ее ног берете ?
мерил все на ее ножках.
Добавлено спустя 7 минут 45 секунд:Может кто то выложит рабочий код записи и чтения. Не получается нечего записать. Как будто защита стоит. Хотя по статус регистру sowtware protection status все секторы защищены и как выключить не понятно. Бит SPRL тоже не пишется. Вроде все не так сложно, по описанию, но запихнуть в нее не как не могу.
grek » 15 июл 2013, 15:37
Работает и на 3 и на 5 вольтах. Все данные надо отправлять и передавать через запрос регистра статуса.
На приеме на контролер стоят две оптики, и у каждой выход заведен на контролер на вход MISO и вот они негодуют друг с другом, так они оба выхода. Вот думаю как решить этот вопрос. Через оптику по SPI идут ответы с разных устройств на один и тот же выход контролера .
elmot » 15 июл 2013, 16:02
grek » 15 июл 2013, 17:53
У меня выходы с оптики сидят вместе и идут на одну ногу микроконтроллера. И при такой схеме они уменьшают напряжение сигнала. Может конечно резисторы маловаты. Но по моему проблема в другом. Соответственно если поставить один резистор 500 ом то одна часть работает. А нужно чтобы обе работали и принимали от разных устройств в определенный момент времени.
Можно конечно добавить еще элементов в схему, но хотелось бы простого решения.
- Вложения
-

avr123.nm.ru » 15 июл 2013, 18:02
либо открытые коллекторы использовать или открытые стоки 2N7002 или логику 2ИЛИ если в неактивном устройстве "0" на выходе. Если там "1" то используйте логику 2И, есть и логика с открытым стоком. Либо буферы управл тем же сигналом выбора микрухи CS.
grek » 15 июл 2013, 18:21
либо открытые коллекторы использовать или открытые стоки 2N7002 или логику 2ИЛИ если в неактивном устройстве "0" на выходе. Если там "1" то используйте логику 2И, есть и логика с открытым стоком. Либо буферы управл тем же сигналом выбора микрухи CS.
Это все понятно. Я просто не думал, что выход будет сажать другой выход. Честно говоря так и не понимаю почему.Может еще попробовать выходом управления оптики поиграться, на одной из оптик всегда на управляющем сигнале висит 1(на VCC всегда разрешена работа). Такое ощущения, что один из входов вешиется на 0 и получается делитель и соответственно не хватает уровня сигнала для микроконтроллера.
У меня сейчас нет возможности подключить реальное второе устройство slave к выводу SPI, пока висит только память.