Не удается получить данные из FTDI FT201X с помощью i2c - PullRequest
1 голос
/ 06 января 2020

У меня есть проект, использующий FTDI FT201X в качестве ведомого USB-устройства к i2 c, а ведущим устройством i2 c является микроконтроллер AVR. Я использую WPF Core 3.1 C# на машине Windows 10. В принципе, все с чипом FTDI работает нормально, за исключением того, что я не могу успешно получить данные, отправленные с P C на чип FTDI, независимо от того, что я пытаюсь. Функция записи D2XX сообщает, что она прошла успешно и не возвращает ошибок, но в буфере при попытке чтения никогда не появляется никаких данных.

С тех пор я написал небольшую тестовую программу, пытаясь изолировать проблему. но проблема остается. По сути, когда нажимается кнопка, мы открываем устройство по серийному номеру, записываем команду в буферы устройства, рукопожатие с AVR, чтобы дать ему знать, что он читает, а затем ждем, пока AVR установит низкий уровень сигнала подтверждения, что оно получено. данные.

public class USBLibrary
{
    byte targetDeviceCount = 0;
    FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
    public FTDI connectedUSBDevice;

    // Called from button click event
    public void ConnectUSB()
    {
        bool isOK = true; 
        byte numOfBytes = 1;
        uint bytesWritten = 0;
        bool usbInPinIsHigh = false;        // Tracks USB In Pin
        byte lowMask = 0b00010000;          // CBUS 0 is output (4-7), all pins low (0-3) (Default Setting)
        byte highMask = 0b00010001;         // CBUS 0 is output (4-7), CBUS 3 is high
        byte inPinMask = 0b00001000;        // AND with pin states to get input pin value (Bus3)
        byte pinStates = 0;                 // Used to get the current pin values
        double timeout = 0;

        // Create new instance of the FTDI device class
        connectedUSBDevice = new FTDI();

        // Determine the number of FTDI devices connected to the machine
        ftStatus = connectedUSBDevice.OpenBySerialNumber("P00001");

        /*** Write to Device ***/
        byte[] firmwareCmd = new byte[numOfBytes];

        firmwareCmd[0] = 128;       // 128 is Get Firmware Command
        // firmwareCmd[1] = 61;        // Just Testing

        // Write Firmware Command to Tx buffer
        ftStatus = connectedUSBDevice.Write(firmwareCmd, numOfBytes, ref bytesWritten);
        Trace.WriteLine(bytesWritten);

        // Handshake with BW Device
        isOK = DeviceHandshake(lowMask, highMask, inPinMask);

        // Check if handshake failed
        if (isOK == false)
        {
            return;
        }

        Task.Delay(10);

        // Wait until message is sent
        while ((usbInPinIsHigh == false) && (timeout <= 1000))
        {
            Task.Delay(1);

            // Check for USB In pin to go high. Signals FW transfer is complete and to retrieve.
            ftStatus = connectedUSBDevice.GetPinStates(ref pinStates);

            // Is input pin high or low?
            if ((pinStates & inPinMask) == inPinMask)       // In pin high
            {
                usbInPinIsHigh = true;                      // Means uC finished sending data
            }

            timeout++;
        }

        // TEST: displays timeout amount for testing
        Trace.WriteLine("Timeout=" + timeout);

        ftStatus = connectedUSBDevice.Close();
    }
}

ПРИМЕЧАНИЕ: Для этого кода я вынул много кода проверки ошибок для ясности. Кроме того, код квитирования не отображается, потому что он не должен быть релевантным: поднять выходной контакт, прослушать AVR, чтобы поднять выходной контакт, опустить выходной контакт, прослушать AVR, чтобы опустить выходной контакт.

На стороне AVR Мы просто опрашиваем пин-код FT201X до высоты go, а затем рукопожатие с чипом. Тогда мы просто читаем. Функция чтения всегда возвращает 0.

Я сомневаюсь, что проблема в i2 c, так как есть 3 микросхемы IO Expander, управляющих светодиодами и кнопками, и мы можем читать и записывать их. Кроме того, в микросхеме FT есть функция Get USB State, в которой вы можете проверить состояние устройства, отправив команду и прочитав результат через i2 c. Когда я делаю это, я всегда получаю правильное 0x03 «Настроенное» состояние. Таким образом, мы можем читать с чипа через i2 c.

Также есть функция, которая возвращает количество байтов в буфере, ожидающем чтения ... когда я делаю это, он всегда говорит 0 байтов .

И для хорошей меры я заменил чип на новый, если он был плохим, и снова у нас были те же результаты.

Есть ли что-то, чего мне не хватает в плане настройки чип вне использования FT_Prog, как процедура инициализации или установка регистров или что-то? Или мне нужно как-то сделать pu sh байт, который я записываю в начало очереди, или что-то еще, прежде чем его можно будет прочитать? Кто-нибудь видел что-нибудь подобное раньше?

Учитывая, что я не повлиял на результаты, я либо пропустил ключевую часть процесса, либо что-то не так с их драйвером / версией чипа. Прошло уже 3 недели, у меня нет идей, и мои волосы пятнистые от вырывания больших кусков. Пожалуйста, сохраните мои волосы.

1 Ответ

0 голосов
/ 30 января 2020

Проверьте с помощью осциллографа, что ваш I2 C мастер дает часы для вашего раба (FT201x). Попробуйте управлять только I2 C (отнимите элементы управления GPIO) и проверьте, можете ли вы таким образом изолировать проблему. Я полагаю, вы хорошо знакомы с таблицей FT201X . Удачи!

...