Недавно я приобрел USB-кабель FTDI C232HM-DDHSL-0 для использования с устройствами SPI и I2C;моя цель - прочитать память из микросхемы памяти SPI, которую я удалил из маршрутизатора. Однако у меня возникают проблемы с получением библиотеки libMPSSE и драйверов 2xx для отправки сигналов на подключенное устройство. Я подключил выводы C232 к логическому анализатору Saleae и увидел, что сигналы не выводятся!
Полезные ссылки на этот вопрос:
Яиспользуя машину Debian x86_64 . Для загрузки SPI MPSSE использовалась только версия библиотеки i386, поэтому я загрузил источник SPI MPSSE (https://www.ftdichip.com/Support/SoftwareExamples/MPSSE/LibMPSSE-SPI.htm) и собрал битовую версию x86_64. Не было ошибок или предупреждений при сборке.
Я скопировалlibftd2xx.so и libMPSSE.so в /usr/local/lib.
Я подключил кабель, затем удалил следующие модули ядра:
- ftdi_sio <- Readme говоритtake take out </li>
- usbserial <- Readme говорит, что вынуть </li>
- usb_wann <- необходимо удалить, чтобы вынуть usbserial </li>
- qcserial <- необходимо удалить, чтобы взятьout usbserial </li>
На данный момент я надеялся, что мои настройки выполнены правильно.
Я подключил 6x кабелей к 8-контактному чипу памяти:
- VCC <-> красный провод
- заземление <-> черный провод
- Выбор микросхемы <-> коричневый вывод
- Данные в <-> зеленом
- последовательные часы <-> оранжевый
- Выход данных <-> желтый
Я не подключил контакты удержания и защиты от записи oна чипе памяти. Напомним, моя цель - прочитать память из микросхемы, а форма сигнала для чтения не показала, что эти контакты были необходимы.
Я использую эту программу:
/* Standard C libraries */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "ftd2xx.h"
#include "libMPSSE_spi.h"
FT_HANDLE ftHandle;
uint8 tx_buffer[4096] = {0};
uint8 rx_buffer[4096] = {0};
int main()
{
uint8 i = 0;
int sizeToTransfer = 0;
int sizeTransfered = 0;
FT_STATUS status = FT_OK;
FT_DEVICE_LIST_INFO_NODE devList = {0};
ChannelConfig channelConf = {0};
channelConf.ClockRate = 30000000; // 30Mhz
channelConf.LatencyTimer = 75;
channelConf.configOptions = SPI_CONFIG_OPTION_MODE0 | SPI_CONFIG_OPTION_CS_DBUS3 | SPI_CONFIG_OPTION_CS_ACTIVELOW;
channelConf.Pin = 0x00000000;/*FinalVal-FinalDir-InitVal-InitDir (for dir 0=in, 1=out)*/
//
// Open the channel and dump some information
//
status = SPI_GetChannelInfo(0,&devList);
if (status != FT_OK)
{
printf("SPI_GetChannelInfo failed, status = %d\n", status);
return -1;
}
printf("Flags=0x%x\n",devList.Flags);
printf("Type=0x%x\n",devList.Type);
printf("ID=0x%x\n",devList.ID);
printf("LocId=0x%x\n",devList.LocId);
printf("SerialNumber=%s\n",devList.SerialNumber); // TODO: Why blank?
printf("Description=%s\n",devList.Description);
printf("ftHandle=0x%p\n",devList.ftHandle);/*is 0 unless open*/
//
// Open channel 0
//
status = SPI_OpenChannel(0,&ftHandle);
if (status != FT_OK)
{
printf("SPI_OpenChannel failed, status = %d\n", status);
return -1;
}
//
// Initialize the channel: See configuration structure at top of main()
//
status = SPI_InitChannel(ftHandle,&channelConf);
if (status != FT_OK)
{
printf("SPI_InitChannel failed, status = %d\n", status);
return -1;
}
//
// Send the read command (0x03), and read what we get in our receive buffer
//
sizeToTransfer=8;
sizeTransfered=0;
tx_buffer[0] = 0x03;
status = SPI_ReadWrite(ftHandle, rx_buffer, tx_buffer, sizeToTransfer, &sizeTransfered,
SPI_TRANSFER_OPTIONS_SIZE_IN_BYTES|SPI_TRANSFER_OPTIONS_CHIPSELECT_DISABLE|SPI_TRANSFER_OPTIONS_CHIPSELECT_ENABLE);
if (status != FT_OK)
{
printf("SPI_ReadWrite failed, status = %d\n", status);
return -1;
}
//
// Dump the receive buffer to see if we got anything.
//
printf("Size transfered = %d\n", sizeTransfered);
i = 0;
while (i < sizeTransfered)
{
printf("%02x",rx_buffer[i]);
i++;
}
printf("\n");
//
// Cleanup
//
status = SPI_CloseChannel(ftHandle);
if (status != FT_OK)
{
printf("SPI_CloseChannel failed, ret = %d\n", status);
}
return 0;
}
Чтобы сделатьи запустите программу:
To compile: gcc read_memory.c -lMPSSE -ldl
To run: sudo ./a.out
Мой вывод:
// The driver can at least detect the cable.
Flags=0x2
Type=0x8
ID=0x4036001
LocId=0x204
SerialNumber=
Description=USB <-> Serial
ftHandle=0x(nil)
Size transfered = 8
// Junk in the receive buffer
ff037fffffffffff
Независимо от того, оставляю ли я чип памяти подключенным или отключенным, я получаю тот же мусор в приемном буфере. Я не вижу светодиодов на кабеле или чего-либо, что бы указывало на его работоспособность. Я попытался SPI_Write () и SPI_Read () и получить аналогичное поведение. Я проверил на Ubuntu VM (работающем на хосте Windows) и увидел точно такое же поведение.
Я очень рад, чтобы это сработало, так что если кто-то может мне помочь с тем, что я делаю неправильно, это будет оченьоценили! Спасибо!