У меня есть проект, использующий 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 недели, у меня нет идей, и мои волосы пятнистые от вырывания больших кусков. Пожалуйста, сохраните мои волосы.