public SetBitMode ( byte Mask, byte BitMode ) : FT_STATUS | ||
Mask | byte | Sets up which bits are inputs and which are outputs. A bit value of 0 sets the corresponding pin to an input, a bit value of 1 sets the corresponding pin to an output. /// In the case of CBUS Bit Bang, the upper nibble of this value controls which pins are inputs and outputs, while the lower nibble controls which of the outputs are high and low. |
BitMode | byte | For FT232H devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_MPSSE, FT_BIT_MODE_SYNC_BITBANG, FT_BIT_MODE_CBUS_BITBANG, FT_BIT_MODE_MCU_HOST, FT_BIT_MODE_FAST_SERIAL, FT_BIT_MODE_SYNC_FIFO. /// For FT2232H devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_MPSSE, FT_BIT_MODE_SYNC_BITBANG, FT_BIT_MODE_MCU_HOST, FT_BIT_MODE_FAST_SERIAL, FT_BIT_MODE_SYNC_FIFO. /// For FT4232H devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_MPSSE, FT_BIT_MODE_SYNC_BITBANG. /// For FT232R devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_SYNC_BITBANG, FT_BIT_MODE_CBUS_BITBANG. /// For FT245R devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_SYNC_BITBANG. /// For FT2232 devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG, FT_BIT_MODE_MPSSE, FT_BIT_MODE_SYNC_BITBANG, FT_BIT_MODE_MCU_HOST, FT_BIT_MODE_FAST_SERIAL. /// For FT232B and FT245B devices, valid values are FT_BIT_MODE_RESET, FT_BIT_MODE_ASYNC_BITBANG. |
Результат | FT_STATUS |
public FT_STATUS SetBitMode(byte Mask, byte BitMode)
{
// Initialise ftStatus to something other than FT_OK
FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR;
FT_ERROR ftErrorCondition = FT_ERROR.FT_NO_ERROR;
// If the DLL hasn't been loaded, just return here
if (hFTD2XXDLL == IntPtr.Zero)
return ftStatus;
// Check for our required function pointers being set up
if (pFT_SetBitMode != IntPtr.Zero)
{
tFT_SetBitMode FT_SetBitMode = (tFT_SetBitMode)Marshal.GetDelegateForFunctionPointer(pFT_SetBitMode, typeof(tFT_SetBitMode));
if (ftHandle != IntPtr.Zero)
{
FT_DEVICE DeviceType = FT_DEVICE.FT_DEVICE_UNKNOWN;
// Set Bit Mode does not apply to FT8U232AM, FT8U245AM or FT8U100AX devices
GetDeviceType(ref DeviceType);
if (DeviceType == FT_DEVICE.FT_DEVICE_AM)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
else if (DeviceType == FT_DEVICE.FT_DEVICE_100AX)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_BM) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
if ((BitMode & (FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG)) == 0)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_2232) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
if ((BitMode & (FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_MPSSE | FT_BIT_MODES.FT_BIT_MODE_SYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_MCU_HOST | FT_BIT_MODES.FT_BIT_MODE_FAST_SERIAL)) == 0)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
if ((BitMode == FT_BIT_MODES.FT_BIT_MODE_MPSSE) & (InterfaceIdentifier != "A"))
{
// MPSSE mode is only available on channel A
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_232R) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
if ((BitMode & (FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_SYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_CBUS_BITBANG)) == 0)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_2232H) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
if ((BitMode & (FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_MPSSE | FT_BIT_MODES.FT_BIT_MODE_SYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_MCU_HOST | FT_BIT_MODES.FT_BIT_MODE_FAST_SERIAL | FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO)) == 0)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
if (((BitMode == FT_BIT_MODES.FT_BIT_MODE_MCU_HOST) | (BitMode == FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO)) & (InterfaceIdentifier != "A"))
{
// MCU Host Emulation and Single channel synchronous 245 FIFO mode is only available on channel A
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_4232H) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
if ((BitMode & (FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG | FT_BIT_MODES.FT_BIT_MODE_MPSSE | FT_BIT_MODES.FT_BIT_MODE_SYNC_BITBANG)) == 0)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
if ((BitMode == FT_BIT_MODES.FT_BIT_MODE_MPSSE) & ((InterfaceIdentifier != "A") & (InterfaceIdentifier != "B")))
{
// MPSSE mode is only available on channel A and B
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
else if ((DeviceType == FT_DEVICE.FT_DEVICE_232H) && (BitMode != FT_BIT_MODES.FT_BIT_MODE_RESET))
{
// FT232H supports all current bit modes!
if (BitMode > FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO)
{
// Throw an exception
ftErrorCondition = FT_ERROR.FT_INVALID_BITMODE;
ErrorHandler(ftStatus, ftErrorCondition);
}
}
// Requested bit mode is supported
// Note FT_BIT_MODES.FT_BIT_MODE_RESET falls through to here - no bits set so cannot check for AND
// Call FT_SetBitMode
ftStatus = FT_SetBitMode(ftHandle, Mask, BitMode);
}
}
else
{
if (pFT_SetBitMode == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_SetBitMode.");
}
}
return ftStatus;
}
/// <summary> /// Create a USB Relay Device and open it by the serial number /// </summary> /// <param name="serialNumber">Device serial number</param> public UsbRelay8( String serialNumber ) { // Open the relay device by serial number // The serial number is always uniques, so the safest _device = new FTDI(); _status = _device.OpenBySerialNumber(serialNumber); if (_status != FTDI.FT_STATUS.FT_OK) { throw new UsbRelayDeviceNotFoundException(); } // Set the baud rate _status = _device.SetBaudRate(BaudRate); if (_status != FTDI.FT_STATUS.FT_OK) { throw new UsbRelayConfigurationException(); } // Set the bit mode _status = _device.SetBitMode(BitMask, BitMode); if (_status != FTDI.FT_STATUS.FT_OK) { throw new UsbRelayConfigurationException(); } // Clear all the relays // Note: From the Data Sheet, when in Sync Mode you can // only read the interface pins when writing. So start // start out with all the values cleared. _values = 0x00; SetRelays(_values); }