private void InitializeGpio(Ft4222Device device) { DeviceInformation = device; // Open device var ftStatus = FtFunction.FT_OpenEx(DeviceInformation.LocId, FtOpenType.OpenByLocation, out _ftHandle); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to open device {DeviceInformation.Description}, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetSuspendOut(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} changing Suspend out mode, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetWakeUpInterrupt(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} removing wake up interrupt, status: {ftStatus}"); } for (int i = 0; i < PinCountConst; i++) { _gpioDirections[i] = GpioPinMode.Output; } ftStatus = FtFunction.FT4222_GPIO_Init(_ftHandle, _gpioDirections); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description}, status: {ftStatus}"); } }
/// <summary> /// Create an SPI FT4222 class /// </summary> /// <param name="settings">SPI Connection Settings</param> public Ft4222Spi(SpiConnectionSettings settings) { _settings = settings; // Check device var devInfos = Device.FtCommon.FtCommon.GetDevices(); if (devInfos.Count == 0) { throw new IOException("No FTDI device available"); } // Select the one from bus Id // FT4222 propose depending on the mode multiple interfaces. Only the A is available for SPI or where there is none as it's the only interface var devInfo = devInfos.Where(m => m.Description == "FT4222 A" || m.Description == "FT4222").ToArray(); if ((devInfo.Length == 0) || (devInfo.Length < _settings.BusId)) { throw new IOException($"Can't find a device to open SPI on index {_settings.BusId}"); } DeviceInformation = new(devInfo[_settings.BusId]); // Open device var ftStatus = FtFunction.FT_OpenEx(DeviceInformation.LocId, FtOpenType.OpenByLocation, out _ftHandle); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to open device {DeviceInformation.Description} with error: {ftStatus}"); } // Set the clock but we need some math var(ft4222Clock, tfSpiDiv) = CalculateBestClockRate(); ftStatus = FtFunction.FT4222_SetClock(_ftHandle, ft4222Clock); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to set clock rate {ft4222Clock} on device: {DeviceInformation.Description}with error: {ftStatus}"); } SpiClockPolarity pol = SpiClockPolarity.ClockIdleLow; if ((_settings.Mode == SpiMode.Mode2) || (_settings.Mode == SpiMode.Mode3)) { pol = SpiClockPolarity.ClockIdelHigh; } SpiClockPhase pha = SpiClockPhase.ClockLeading; if ((_settings.Mode == SpiMode.Mode1) || (_settings.Mode == SpiMode.Mode3)) { pha = SpiClockPhase.ClockTailing; } // Configure the SPI ftStatus = FtFunction.FT4222_SPIMaster_Init(_ftHandle, SpiOperatingMode.Single, tfSpiDiv, pol, pha, (byte)_settings.ChipSelectLine); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed setup SPI on device: {DeviceInformation.Description} with error: {ftStatus}"); } }
/// <summary> /// Create a FT4222 I2C Device /// </summary> /// <param name="deviceInformation">Device information. Use FtCommon.GetDevices to get it.</param> public Ft4222I2cBus(Ft4222Device deviceInformation) { switch (deviceInformation.Type) { case FtDeviceType.Ft4222HMode0or2With2Interfaces: case FtDeviceType.Ft4222HMode1or2With4Interfaces: case FtDeviceType.Ft4222HMode3With1Interface: break; default: throw new ArgumentException($"Unknown device type: {deviceInformation.Type}"); } DeviceInformation = deviceInformation; // Open device var ftStatus = FtFunction.FT_OpenEx(DeviceInformation.LocId, FtOpenType.OpenByLocation, out _ftHandle); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to open device {DeviceInformation.Description}, status: {ftStatus}"); } // Set the clock FtClockRate ft4222Clock = FtClockRate.Clock24MHz; ftStatus = FtFunction.FT4222_SetClock(_ftHandle, ft4222Clock); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed set clock rate {ft4222Clock} on device: {DeviceInformation.Description}, status: {ftStatus}"); } // Set the device as I2C Master ftStatus = FtFunction.FT4222_I2CMaster_Init(_ftHandle, I2cMasterFrequencyKbps); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to initialize I2C Master mode on device: {DeviceInformation.Description}, status: {ftStatus}"); } }
/// <summary> /// Create a FT4222 GPIO driver /// </summary> /// <param name="device">An FT Device</param> #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. internal Ft4222Gpio(Ft4222Device device) #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. { InitializeGpio(device); }