Работа LPT порта в SPI режиме. Проблема записи SPI Flash.

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Аватара пользователя
Transformer-V
Друг Кота
Сообщения: 4170
Зарегистрирован: Пн окт 03, 2016 22:50:22
Контактная информация:

Работа LPT порта в SPI режиме. Проблема записи SPI Flash.

Сообщение Transformer-V »

Здравствуйте. Решил реализовать программную SPI шину на LPT порту компьютера. Написал драйвер для прямого доступа в программе к порту LPT и общение с шиной ассемблерными вставками (in/out). удалил драйвер по умолчанию установленный в Windows 7 для LPT порта, чтобы не мешал общению и не было коллизий.

BIOS: LPT режим: ECP

Аппаратная реализация LPT <-> "мост" буфер 74HC244 <-> SPI флешка
1 pin 378h - MOSI
2 pin 379h - MISO
3 pin 37Ah - CLOCK
4 pin 37Ah - CS

Реализовал программное общение с флешкой по SPI, корректно получил: ID, type, density флешки, корректно прочитал содержимое флешки.

Вот только уже второй день не могу записать флешку Winbond W25Q80, использовал другую флешку MX25L1606E такая же проблема

Флешка Winbond W25Q80:

Код: Выделить всё


//Открываю запись
SPI_Start();
SPI_Transmit(0x06); //WREN
SPI_Stop();

//Проверяю статус
SPI_Start();
SPI_Transmit(0x05); //RDSR
Status=SPI_Receive();
SPI_Stop();

Получаю Status = DEC: 2  или BIN: 0000 0010


//Пытаюсь записать в флешку 
SPI_Start();
SPI_Transmit(0x02); //WRITE
SPI_Transmit((0&0x0000ffff)>>8);
SPI_Transmit((0&0x000000ff);
SPI_Transmit(0,0);

for (i=0;i<256;i++)
{
SPI_Transmit(0x88); //Заполняю блок 256 байт, байтом 0x88
}

SPI_Stop();


Sleep(7000);

//Читаю из флешки
SPI_Start();
SPI_Transmit(0x03); //READ
SPI_Transmit(0x00);
SPI_Transmit(0x00);
SPI_Transmit(0x00);

unsigned char OutBufer[2097152];

//16777216 бит / 8 бит = 2097152 байт
for (i=0;i<2097152;i++)
{
OutBufer[i]=SPI_Receive();
}

SPI_Stop();


Далее записываю содержимое OutBufer[] в файл и просматриваю в HEX редакторе


Нулями 0x00 заполняется, а вот отличным от нулей байты не получается. :(

Либо я чего то недопонимаю
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15572
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Работа LPT порта в SPI режиме. Проблема записи SPI Flash

Сообщение BOB51 »

Для LPT под ХР реальна работа только по аналогии/применении схемы от программатора STK200.
Т.е. использование той же линии (и адреса порта) для сигналов mosi,miso и sck. Там нюанс по возвратному сигналу - иная конфигурация проблемна для программиста. Для загрузки данных в выходной регистр порта (0х0378) в любом случае проблем не будет. В остальные адреса - защита системы весьма пакостна - работа идет только через драйвера.
Возможно и с семеркой получится.
:roll:
Реклама
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Работа LPT порта в SPI режиме. Проблема записи SPI Flash

Сообщение Rtmip »

Transformer-V писал(а): Флешка Winbond W25Q80:

Код: Выделить всё

//Открываю запись...
//Проверяю статус...
Получаю Status = DEC: 2  или BIN: 0000 0010
Тут видно, что все три бита защиты памяти равны 0. Значит включена защита всей памяти.
Transformer-V писал(а): //Пытаюсь записать в флешку
SPI_Start();
SPI_Transmit(0x02); //WRITE
SPI_Transmit((0&0x0000ffff)>>8);
SPI_Transmit((0&0x000000ff);
SPI_Transmit(0,0);
[/code]
Вот тут странно, почему бы просто не передать три байта адреса, без сдвигов?
Например, так:

Код: Выделить всё

SPI_Transmit((0xff);
SPI_Transmit((0xff);
SPI_Transmit(0);
Но, прежде чем передавать адрес и данные для записи, надо указать какую область памяти открываете для записи.
То есть дать команду SPI_Transmit(0x01); и далее по даташиту, записать в STATUS REGISTER, например: BP1 и BP2 = 1.
Это будет означать доступ ко всей памяти, адреса с 000000h по 0FFFFFh. Не придется ломать голову, какой блок открыт, какой
закрыт, просто сразу все разрешили, мне кажется так удобнее. И записывать для теста лучше сначала, чтобы не колдовать с адресом.
Только после этого можно приступать к записи данных. Но лучше сначала прочитать STATUS REGISTER и убедиться, что биты
WEL, BP1 и BP2 = 1. Попробуйте, думаю все получится, расскажите потом, что и как :)
Аватара пользователя
Transformer-V
Друг Кота
Сообщения: 4170
Зарегистрирован: Пн окт 03, 2016 22:50:22
Контактная информация:

Re: Работа LPT порта в SPI режиме. Проблема записи SPI Flash

Сообщение Transformer-V »

BOB51 писал(а):Для LPT под ХР реальна работа только по аналогии/применении схемы от программатора STK200.
Т.е. использование той же линии (и адреса порта) для сигналов mosi,miso и sck. Там нюанс по возвратному сигналу - иная конфигурация проблемна для программиста. Для загрузки данных в выходной регистр порта (0х0378) в любом случае проблем не будет. В остальные адреса - защита системы весьма пакостна - работа идет только через драйвера.
Возможно и с семеркой получится.
:roll:
Переключил выводы CS, CLOCK, MOSI на порт 378h и все удачно записалось и считалось :)) Спасибо

Добавлено after 4 minutes 41 second:
Rtmip писал(а):
Transformer-V писал(а): Флешка Winbond W25Q80:

Код: Выделить всё

//Открываю запись...
//Проверяю статус...
Получаю Status = DEC: 2  или BIN: 0000 0010
Тут видно, что все три бита защиты памяти равны 0. Значит включена защита всей памяти.
Transformer-V писал(а): //Пытаюсь записать в флешку
SPI_Start();
SPI_Transmit(0x02); //WRITE
SPI_Transmit((0&0x0000ffff)>>8);
SPI_Transmit((0&0x000000ff);
SPI_Transmit(0,0);
[/code]
Вот тут странно, почему бы просто не передать три байта адреса, без сдвигов?
Например, так:

Код: Выделить всё

SPI_Transmit((0xff);
SPI_Transmit((0xff);
SPI_Transmit(0);
Но, прежде чем передавать адрес и данные для записи, надо указать какую область памяти открываете для записи.
То есть дать команду SPI_Transmit(0x01); и далее по даташиту, записать в STATUS REGISTER, например: BP1 и BP2 = 1.
Это будет означать доступ ко всей памяти, адреса с 000000h по 0FFFFFh. Не придется ломать голову, какой блок открыт, какой
закрыт, просто сразу все разрешили, мне кажется так удобнее. И записывать для теста лучше сначала, чтобы не колдовать с адресом.
Только после этого можно приступать к записи данных. Но лучше сначала прочитать STATUS REGISTER и убедиться, что биты
WEL, BP1 и BP2 = 1. Попробуйте, думаю все получится, расскажите потом, что и как :)
Три байта без сдвигов убрал из кода, насчет защиты и открытия записи определенного блока незнал спасибо за информацию, запрограммировалось после смены порта и команды полного стирания 0xc7 :)
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Интеграция с ПК»