FTDI LibMPSSE SPI - PullRequest
       65

FTDI LibMPSSE SPI

0 голосов
/ 21 октября 2019

Недавно я приобрел 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) и увидел точно такое же поведение.

Я очень рад, чтобы это сработало, так что если кто-то может мне помочь с тем, что я делаю неправильно, это будет оченьоценили! Спасибо!

...