⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_exam.c

📁 USB2I2C开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -