我有一个项目,使用FTDIAVR微控制器作为从FT201X到i2c的i2c。我在Windows10机器上使用WPF Core3.1 C#。基本上,FTDI芯片的一切工作正常,除了我不能成功地将数据从PC发送到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 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的引脚,然后与芯片握手。然后我们简单地读一读。read函数总是返回0。
我怀疑问题出在i2c上,因为有3个IO扩展器芯片控制着LED和按钮,我们可以对它们进行读写。此外,FT芯片有一个名为Get USB State的功能,您可以通过发送命令并通过i2c读取结果来检查设备的状态。当我这样做时,我总是得到正确的0x03“已配置”状态。所以我们可以通过i2c从芯片上读取数据。
还有一个函数会返回缓冲区中等待为read...when的字节数,我这样做了,它总是返回0字节。
为了更好地衡量,我用新的芯片替换了它,以防它坏了,我们又一次得到了相同的结果。
除了使用FT_Prog之外,在设置芯片方面我还遗漏了什么吗,比如初始化过程或设置寄存器或其他什么?或者我是否需要以某种方式将我写入的字节推送到队列的前面,或者在它可以被读取之前做些什么?有没有人见过这样的东西?
考虑到我没有影响结果,我要么遗漏了过程中的一个关键部分,要么是他们的驱动程序/芯片版本出了问题。已经三个星期了,我没有想法了,我的头发因为撕开大块而散乱不堪。请留着我的头发。
发布于 2020-01-30 20:59:34
通过示波器检查您的I2C主机是否为您的从机(FT201x)提供时钟。尝试只控制I2C (取消GPIO控制),并检查是否可以以这种方式隔离问题。我想您对FT201X datasheet非常熟悉。祝好运!
发布于 2021-01-18 12:53:35
检查延迟计时器设置。本文档https://www.ftdichip.com/Support/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf中对此进行了描述。在3.3节中,您会发现有一节描述了没有数据可供应用程序使用的场景。
当主机控制器等待上述条件之一发生时,我们的驱动程序和用户的应用程序都不会接收到任何数据。数据,如果有的话,只有在上述条件之一发生后才会最终传输。“
如果你遇到这个问题,你可以使用延迟计时器来解决这个问题。尝试将其设置为1ms,这是其最低值。如果您的数据具有分隔符字符,请考虑将其设置为事件字符,这样可能会获得更好的结果。
发布于 2021-02-25 09:29:43
这个问题有没有得到解决?
遇到与FT200X相同的问题,但函数"bytes available“(0x0C)返回从主机PC发送的正确字节数,但无法使用数据手册中提到的读取过程读取实际字节。
我在总线上还有其他几个I2C设备,工作正常。
https://stackoverflow.com/questions/59617070
复制相似问题