【MCU】CH591用软件 I2C 出现的 bug

计算问题

写软件 I2C 时不支持

c 复制代码
byte |= (0x80 >> i);

详细:

c 复制代码
/**
 * @brief Receive one byte using I2C
 * @param XACK
 * @retval Byte
 */
uint8_t SW_I2C_ReceiveByte(uint8_t XACK)
{
	SW_I2C_SDA_SetInput();
	uint8_t byte = 0x00;
	for (uint8_t i = 0; i < 8; i++)
	{
		SW_I2C_Delay();
		SW_I2C_SCL_WriteBit(1);
		if (SW_I2C_SDA_ReadBit() == 1)
		{
			byte |= (0x80 >> i);
		}
		SW_I2C_Delay();
		SW_I2C_SCL_WriteBit(0);
		SW_I2C_Delay();
	}
	SW_I2C_SDA_SetOutput();
	// transmit ACK
	SW_I2C_SDA_WriteBit(XACK);
	SW_I2C_Delay();
	SW_I2C_SCL_WriteBit(1);
	SW_I2C_Delay();
	SW_I2C_SCL_WriteBit(0);
	// release SDA
	SW_I2C_SDA_WriteBit(1);
	SW_I2C_Delay();
	return byte;
}

如果改成

c 复制代码
/**
 * @brief Receive one byte using I2C
 * @param XACK
 * @retval Byte
 */
uint8_t SW_I2C_ReceiveByte(uint8_t XACK)
{
	SW_I2C_SDA_SetInput();
	uint8_t byte = 0x00;
	for (uint8_t i = 0; i < 8; i++)
	{
		byte<<=1;
		SW_I2C_Delay();
		SW_I2C_SCL_WriteBit(1);
		if (SW_I2C_SDA_ReadBit() == 1)
		{
			byte |= 0x01;
		}
		SW_I2C_Delay();
		SW_I2C_SCL_WriteBit(0);
		SW_I2C_Delay();
	}
	SW_I2C_SDA_SetOutput();
	// transmit ACK
	SW_I2C_SDA_WriteBit(XACK);
	SW_I2C_Delay();
	SW_I2C_SCL_WriteBit(1);
	SW_I2C_Delay();
	SW_I2C_SCL_WriteBit(0);
	// release SDA
	SW_I2C_SDA_WriteBit(1);
	SW_I2C_Delay();
	return byte;
}

就没问题了

相关推荐
7yewh3 小时前
嵌入式知识点总结 C/C++ 专题提升(五)-变量 数组
c语言·c++·单片机·嵌入式硬件·mcu·物联网
7yewh11 小时前
嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)
单片机·嵌入式硬件·mcu·数码相机·物联网
工程师平哥20 小时前
cmake foreach 条件判断
c语言·单片机·嵌入式硬件·mcu
Ronin-Lotus1 天前
嵌入式硬件篇---PID控制
单片机·嵌入式硬件·mcu·学习·程序人生·算法·硬件工程
阑梦清川3 天前
用户中心项目教程(二)---umi3的使用出现的错误
bug
JZC_xiaozhong3 天前
支付宝“政府补贴”bug事件背后的权限管理启示
大数据·数据库·安全·ci/cd·金融·云计算·bug
做测试的喵酱3 天前
在 JIRA 中利用仪表盘功能生成 Bug 相关图表的手册
bug·jira
我只有一岁半3 天前
记一次数据库连接 bug
数据库·bug
tadus_zeng3 天前
uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下
mcu·51单片机