FT4222H的I2CSlave也支持I2C v2.1和v3版本。当FT4222H接收到I2C上的数据会暂存在一个256字节的缓存器中,然后再发送给USB。
【初始化函数】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_Init(IntPtr ftHandle);
复位初始化后I2C地址默认是0x40.
【从地址管理】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_GetAddress(IntPtr ftHandle, ref byte addr);
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_SetAddress(IntPtr ftHandle, byte addr);
FT4222_I2CSlave_GetAddress获取当前设置的I2C从地址值;FT4222_I2CSlave_SetAddress设置I2C从地址值。
【获取接收队列中数据的长度】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_GetRxStatus(IntPtr ftHandle, ref UInt16 pRxSize);
参数pRxSize是接收队列(即Master发送过来的数据)中的数据长度。
【写函数】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_Write(
IntPtr ftHandle, byte[] buffer, UInt16 bufferSize, ref UInt16 sizeTransferred);
参数buffer是写入的数据;参数bufferSize是写入的数据个数;参数sizeTransferred是实际写的数据个数。
【读函数】
[DllImport("LibFT4222.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern eFT4222Status FT4222_I2CSlave_Read(
IntPtr ftHandle, byte[] buffer, UInt16 bufferSize, ref UInt16 sizeTransferred);
参数的含义与写一样。
同样使用STM32F030平台作为Master验证FT4222H的I2C Slave功能,在STM32F030端接收发送数据,并把读到的数据打印到串口。
写测试代码如下,假设设备是8bit地址,地址为0x10,发送127个字节数据
for(i = 0; i < length; i++)
{
uartProtocolBuf[i] = i;
Printf("%2x ", uartProtocolBuf[i]);
}
if(i2cWrite(0x80, 8, 0x10, uartProtocolBuf, length) == FALSE)
Printf("I2C Slave Write fail\n");
串口打印信息如下:
I2C SLAVE TEST Write Data 127
0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e
FT4222H端接收到的数据如下:
10 00 01 02 03 04 05 06 07 08 12 0A 0B 0C 0D 1C 0F 10 22 12 13 14 15 16 2E 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 C2 62 63 64 65 66 67 68 69 6A 6B D8 6D 6E DE 70 71 72 73 E8 75 76 77 78 79 F4 7B 7C 7D 7E
读测试代码,假设设备是8bit地址,地址为0x10,接收2个字节的数据
if(i2cRead(0x80, 8, 0x10, uartProtocolBuf, length) == FALSE)
Printf("I2C Slave Read fail\n");
Printf("I2C Slave Read Data:");
for(i = 0; i < length; i++)
{
if(i % 16 == 0)
Printf("\n");
Printf("%2x ", uartProtocolBuf[i]);
}
Printf("\n");
FT4222H端发送的数据:
aa 55
MCU串口的信息:
I2C SLAVE TEST Read Data 2
I2C Slave Read Data:
aa 55
FT4222H端接收的数据:
10