FT4222H只有CNFMODE0(4路IO口)或CNFMODE1(2路IO口)时才能使用GPIO,第2(CNFMODE0)或第4(CNFMODE1)个接口才是GPIO的接口。另外,GPIO2默认是USB Suspend输出口。
另外,注意GPIO用的是第二个接口(FT4222_B):
FT4222H.FT_OpenEx(init,
FT4222H.FT_OPEN_BY_DESCRIPTION,
ref ft4222Device[cbDevice.SelectedIndex + 1].ftHandle);
【初始化函数】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_Init(
IntPtr ftHandle, eGPIODir[] gpioDir);
参数gpioDir是对应GPIO的方向。
public enum eGPIODir
{
GPIO_OUTPUT = 0,
GPIO_INPUT,
};
例如4个IO分别为输出,输入,输入,输入,其初始化代码如下:
FT4222H.eGPIODir[] gpioDir = new FT4222H.eGPIODir[4];
gpioDir[0] = FT4222H.eGPIODir.GPIO_OUTPUT;
gpioDir[1] = FT4222H.eGPIODir.GPIO_INPUT;
gpioDir[2] = FT4222H.eGPIODir.GPIO_INPUT;
gpioDir[3] = FT4222H.eGPIODir.GPIO_INPUT;
ftStatus = FT4222H.FT4222_GPIO_Init(ftGpioHandle, gpioDir);
【修改GPIO2为GPIO模式】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_SetSuspendOut(
IntPtr ftHandle, bool enable);
参数enable表示是否使能GPIO2为USB Suspend输出脚,这里要设置为false。
FT4222H.FT4222_SetSuspendOut(gpioHandle, false);
【IO输出】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_Write(
IntPtr ftHandle, eGPIOPort portNum, bool bValue);
参数portNum是IO口,
public enum eGPIOPort
{
GPIO_PORT0 = 0,
GPIO_PORT1,
GPIO_PORT2,
GPIO_PORT3
};
参数bValue是输出电平,false是低电平,true是高电平。
【IO输入】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_Read(
IntPtr ftHandle, eGPIOPort portNum, ref bool value);
参数与IO输出相同。
【IO的触发模式】
触发功能可以帮助开发者监控IO的变化情况。满足触发条件的值会保存在队列中。例如,如果设置GPIO0的触发条件是GPIO_TRIGGER_RISING,如果GPIO0从0变为1,事件GPIO_TRIGGER_RISING就会被记录在队列中,然后开发人员可以通过FT4222_GPIO_GetTriggerStatus和FT4222_GPIO_ReadTriggerQueue查询队列状态。
如果需要监控多个变化情况,可以设置多个条件,例如GPIO_TRIGGER_RISING | GPIO_TRIGGER_FALLING。
public enum eGPIOTrigger
{
GPIO_TRIGGER_RISING = 0x01,
GPIO_TRIGGER_FALLING = 0x02,
GPIO_TRIGGER_LEVEL_HIGH = 0x04,
GPIO_TRIGGER_LEVEL_LOW = 0X08
}
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_SetInputTrigger(
IntPtr ftHandle, eGPIOPort portNum, eGPIOTrigger trigger);
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_GetTriggerStatus(
IntPtr ftHandle, eGPIOPort portNum, ref UInt16 queueSize);
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_GPIO_ReadTriggerQueue(
IntPtr ftHandle, eGPIOPort portNum, eGPIOTrigger[] events,
UInt16 readSize, ref UInt16 sizeofRead);