【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;
}

就没问题了

相关推荐
ifndef12 天前
GPIO同时复用(ADC与TIM)
mcu
callJJ16 天前
Volta + Claude Code 在 Windows 上的路径 Bug 复盘
windows·bug
ALINX技术博客17 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
xsc-xyc17 天前
记一次RK3568搭建NAS BUG:开发板插上 USB 移动硬盘没反应
bug
放风铃的兔子18 天前
我把 5 个 Python bug 投进 CubeSandbox 当沙盘 —— 从 envd 协议反编译到一键 RED→GREEN
bug·issue
硬件工程师宝典19 天前
I2C从入门到精通之一:I2C的历史起源和综合简介
服务器·嵌入式硬件·硬件架构·i2c
zh_xuan19 天前
诡异Bug:输入框删除字符,却越删越多
android·bug
绘梨衣54719 天前
采集基类设计遇到的描述符bug
爬虫·python·bug
不吃鱼的羊19 天前
达芬奇工具Bug
bug
LeoZY_20 天前
CH347应用 USB转JTAG功能之:probe-rs搭配CH347下载MCU命令全指南
单片机·嵌入式硬件·mcu·开源·github