📄 i2c_exam.c
字号:
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
mLength = i;
return( USBIO_WriteData( iIndex, mBuffer, &mLength ) ); // 写出数据块
}
else I2C_IssueStop( iIndex ); // 应答无效
}
return( FALSE );
}
BOOL WINAPI X76F640_WriteWithPasswd( // 写X76F640的块,使用指定的密码
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iWriteCommand, // 块写命令码
PVOID iPasswdBuf, // 指向一个缓冲区,放置8字节的密码数据
ULONG iAddress, // 指定操作地址
ULONG iOutLength, // 准备写出的数据字节数,单次必须小于32字节(1个扇区)
PVOID iOutBuffer ) // 指向一个缓冲区,放置准备写出的数据
{
UCHAR mBuffer[ mDEFAULT_BUFFER_LEN ];
ULONG i, mLength;
if ( iOutLength == 0 || iOutLength > 32 ) return( FALSE );
if ( X76F640_CheckPasswd( iIndex, iWriteCommand, iPasswdBuf, iAddress ) ) { // 发出命令及密码检查通过
if ( iOutLength > ( mUSBIO_PACKET_LENGTH - 1 - 1 - 1 - 1 - 1 ) ) { // 去掉前2字节后3字节,一个包不够用
mLength = iOutLength - ( mUSBIO_PACKET_LENGTH - 1 - 1 - 1 - 1 - 1); // 多出的长度
iOutLength -= mLength; // 第1个包的数据长度
}
else mLength = 0; // 1个包就够用了
i = 0;
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STREAM; // 命令码
mBuffer[ i++ ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_OUT | iOutLength ); // 输出数据,位5-位0为长度
memcpy( &mBuffer[ i ], iOutBuffer, iOutLength ); // 数据
i += iOutLength;
if ( mLength ) { // 第2包
mBuffer[ i ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
i += mUSBIO_PACKET_LENGTH - i % mUSBIO_PACKET_LENGTH; // 跳过当前包剩余部分
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STREAM; // 第2个包的首字节仍然是命令码
mBuffer[ i++ ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_OUT | mLength ); // 输出数据,位5-位0为长度
memcpy( &mBuffer[ i ], (PUCHAR)iOutBuffer + iOutLength, mLength ); // 剩余数据
i += mLength;
}
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_STO; // 产生停止位
mBuffer[ i++ ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_MS | 10 ); // 以亳秒为单位延时,位3-位0为延时值,延时10毫秒
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
return( USBIO_WriteData( iIndex, mBuffer, &i ) ); // 写出数据块
}
return( FALSE );
}
BOOL WINAPI X76F640_ReadWithPasswd( // 读X76F640的块,使用指定的密码 (包括:输出起始位,输出9字节数据(1命令+8密码),查询应答,输出2字节地址,读入数据块)
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iReadCommand, // 块读命令码
PVOID iPasswdBuf, // 指向一个缓冲区,放置8字节的密码数据
ULONG iAddress, // 指定操作地址
ULONG iInLength, // 准备读取的数据字节数,单次必须小于512字节 ( 每包32 * 16个包 = 512字节 )
PVOID oInBuffer ) // 指向一个缓冲区,返回后是读入的数据
{
UCHAR mBuffer[ mDEFAULT_BUFFER_LEN ];
ULONG i, mLength, mInLen;
if ( iInLength == 0 || iInLength > ( 16 * mUSBIO_PACKET_LENGTH ) ) return( FALSE );
if ( X76F640_CheckPasswd( iIndex, iReadCommand, iPasswdBuf, iAddress ) ) { // 发出命令及密码检查通过
i = 0;
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STREAM; // 命令码
for ( mInLen = 1; mInLen < iInLength; ) {
mLength = iInLength - mInLen >= mUSBIOSS_CMD_I2C_STM_MAX ? mUSBIOSS_CMD_I2C_STM_MAX : iInLength - mInLen; // 本次输入有效数据长度
mBuffer[ i++ ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_IN | mLength ); // 输入数据,位5-位0为长度
mInLen += mLength;
if ( mLength >= mUSBIOSS_CMD_I2C_STM_MAX ) { // 当前包将满
mBuffer[ i ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
i += mUSBIO_PACKET_LENGTH - i % mUSBIO_PACKET_LENGTH; // 跳过当前包剩余部分
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STREAM; // 新包的命令码
}
}
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_IN; // 输入最后一个字节数据,只接收一个字节并发送无应答
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_STO; // 产生停止位
mBuffer[ i++ ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
mLength = 0;
if ( USBIO_WriteRead( iIndex, i, mBuffer, mUSBIOSS_CMD_I2C_STM_MAX, ( iInLength + mUSBIOSS_CMD_I2C_STM_MAX - 1 ) / mUSBIOSS_CMD_I2C_STM_MAX, &mLength, oInBuffer ) ) { // 执行数据流命令,先输出再输入
if ( mLength == iInLength ) return( TRUE );
}
}
return( FALSE );
}
/* ********************************************************************************************** */
/* 例子:操作准双向I/O扩展PCF8574 */
BOOL WINAPI PCF8574_WriteIO( // 输出PCF8574的I/O
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iDeviceAddr, // 设备地址,最低位为命令方向位
ULONG iOutByte ) // 准备写出的I/O数据
{ // 可以直接用USBIO_StreamI2C( iIndex, 2, mBuffer, 0, NULL )实现
UCHAR mBuffer[ mUSBIO_PACKET_LENGTH ];
ULONG mLength;
mBuffer[ 0 ] = mUSBIOSS_CMD_I2C_STREAM; // 命令码
mBuffer[ 1 ] = mUSBIOSS_CMD_I2C_STM_STA; // 产生起始位
mBuffer[ 2 ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_OUT | 2 ); // 输出数据,位5-位0为长度,2字节
mBuffer[ 3 ] = (UCHAR)( iDeviceAddr & 0xFE ); // 设备地址,写操作
mBuffer[ 4 ] = (UCHAR)iOutByte; // I/O数据
mBuffer[ 5 ] = mUSBIOSS_CMD_I2C_STM_STO; // 产生停止位
mBuffer[ 6 ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
mLength = 7;
return( USBIO_WriteData( iIndex, mBuffer, &mLength ) ); // 写出数据块
}
BOOL WINAPI PCF8574_ReadIO( // 输入PCF8574的I/O
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iDeviceAddr, // 设备地址,最低位为命令方向位
PUCHAR oInByte ) // 指向一个字节的缓冲区,返回后是读入的I/O数据
{ // 可以直接用USBIO_StreamI2C( iIndex, 1, mBuffer, 1, oInByte )实现
UCHAR mBuffer[ mUSBIO_PACKET_LENGTH ];
ULONG mLength, mInLen;
mBuffer[ 0 ] = mUSBIOSS_CMD_I2C_STREAM; // 命令码
mBuffer[ 1 ] = mUSBIOSS_CMD_I2C_STM_STA; // 产生起始位
mBuffer[ 2 ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_OUT | 1 ); // 输出数据,位5-位0为长度,1字节
mBuffer[ 3 ] = (UCHAR)( iDeviceAddr | 0x01 ); // 设备地址,读操作
mBuffer[ 4 ] = (UCHAR)( mUSBIOSS_CMD_I2C_STM_IN | 1 ); // 输入数据,位5-位0为长度,1字节
mBuffer[ 5 ] = mUSBIOSS_CMD_I2C_STM_STO; // 产生停止位
mBuffer[ 6 ] = mUSBIOSS_CMD_I2C_STM_END; // 当前包提前结束
mLength = 7;
mInLen = 0;
if ( USBIO_WriteRead( iIndex, mLength, mBuffer, mUSBIOSS_CMD_I2C_STM_MAX, 1, &mInLen, mBuffer ) ) { // 执行数据流命令,先输出再输入
if ( mInLen ) {
*oInByte = mBuffer[ mInLen - 1 ]; // 返回的数据
return( TRUE );
}
}
return( FALSE );
}
/* ********************************************************************************************** */
/* 例子:操作双向I/O扩展PCA9554 */
BOOL WINAPI PCA9554_SetIO( // 设置PCA9554的I/O方向
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iDeviceAddr, // 设备地址,最低位为命令方向位
ULONG iSetByte ) // 方向数据
{ // 也可以用USBIO_WriteI2C实现
UCHAR mBuffer[ mUSBIO_PACKET_LENGTH ];
mBuffer[ 0 ] = (UCHAR)( iDeviceAddr & 0xFE ); // 设备地址,写操作
mBuffer[ 1 ] = 0x03;
mBuffer[ 2 ] = (UCHAR)iSetByte; // I/O方向数据
return( USBIO_StreamI2C( iIndex, 3, mBuffer, 0, NULL ) ); // 处理I2C数据流
}
BOOL WINAPI PCA9554_WriteIO( // 输出PCA9554的I/O
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iDeviceAddr, // 设备地址,最低位为命令方向位
ULONG iOutByte ) // 准备写出的I/O数据
{ // 也可以用USBIO_WriteI2C实现
UCHAR mBuffer[ mUSBIO_PACKET_LENGTH ];
mBuffer[ 0 ] = (UCHAR)( iDeviceAddr & 0xFE ); // 设备地址,写操作
mBuffer[ 1 ] = 0x01;
mBuffer[ 2 ] = (UCHAR)iOutByte; // I/O数据
return( USBIO_StreamI2C( iIndex, 3, mBuffer, 0, NULL ) ); // 处理I2C数据流
}
BOOL WINAPI PCA9554_ReadIO( // 输入PCA9554的I/O
ULONG iIndex, // 指定USB2I2C设备序号
ULONG iDeviceAddr, // 设备地址,最低位为命令方向位
PUCHAR oInByte ) // 指向一个字节的缓冲区,返回后是读入的I/O数据
{ // 也可以用USBIO_ReadI2C实现
UCHAR mBuffer[ mUSBIO_PACKET_LENGTH ];
mBuffer[ 0 ] = (UCHAR)( iDeviceAddr & 0xFE ); // 设备地址,USBIO_StreamI2C自动处理读操作
mBuffer[ 1 ] = 0x00;
return( USBIO_StreamI2C( iIndex, 2, mBuffer, 1, oInByte ) ); // 处理I2C数据流
}
/* ********************************************************************************************** */
main( ) {
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -