关于STM32的模拟IIC

最近项目中用到了台产的触摸芯片,通信方式是IIC,网上的大神们讲STM32的硬件IIC有问题,我还没有验证,于是就用IO口进行软件模拟IIC通信,遇到一些小问题,于是写在博客中记录一下。

下面是IIC总线的驱动程序,由于注释的编码格式不同,注释显示为乱码,所以我就把注释取消掉了,程序还是很好理解的。

首先是IIC起始信号产生

void i2c_Start(void)
{
		I2C_SDA_1();
		I2C_SCL_1();
		i2c_Delay();
		I2C_SDA_0();
		i2c_Delay();
		
		I2C_SCL_0();
		i2c_Delay();
}

IIC停止信号的产生

void i2c_Stop(void)
{
		I2C_SDA_0();
		I2C_SCL_1();
		i2c_Delay();
		I2C_SDA_1();
		i2c_Delay();
}

IIC主机发送一个字节的数据

void i2c_SendByte(uint8_t _ucByte)
{
		uint8_t i;
		for (i = 0; i < 8; i++)
		{
				if (_ucByte & 0x80)
				{
						I2C_SDA_1();
				}
				else
				{
						I2C_SDA_0();
				}
				i2c_Delay();
				I2C_SCL_1();
				i2c_Delay();
				I2C_SCL_0();
				if (i == 7)
				{
					 I2C_SDA_1(); 
				}
				_ucByte <<= 1;	
				i2c_Delay();
		}
}

IIC主机读取一个字节的数据

uint8_t i2c_ReadByte(void)
{
		uint8_t i;
		uint8_t value = 0;

		for (i = 0; i < 8; i++)
		{
				value <<= 1;
				I2C_SCL_1();
				i2c_Delay();
				if (I2C_SDA_READ())
				{
						value++;
				}
				I2C_SCL_0();
				i2c_Delay();
		}
		return value;
}

读取IIC从机的应答信号

uint8_t i2c_WaitAck(void)
{
		uint8_t re;

		I2C_SDA_1();	
		i2c_Delay();
		I2C_SCL_1();	
		i2c_Delay();
		if (I2C_SDA_READ())	
		{
				re = 1;
		}
		else
		{
				re = 0;
		}
		I2C_SCL_0();
		i2c_Delay();
		return re;
}
IIC主机发送应答信号
void i2c_Ack(void)
{
		I2C_SDA_0();	
		i2c_Delay();
		I2C_SCL_1();	
		i2c_Delay();
		I2C_SCL_0();
		i2c_Delay();
		I2C_SDA_1();	
}
IIC主机的非应答信号

void i2c_NAck(void)
{
		I2C_SDA_1();	
		i2c_Delay();
		I2C_SCL_1();	
		i2c_Delay();
		I2C_SCL_0();
		i2c_Delay();
}
检测IIC总线的设备,MCU发送设备地址,然后读取设备的应答来判断该设备是否在线

uint8_t i2c_CheckDevice(uint8_t _Address)
{
		uint8_t ucAck;

		if (I2C_SDA_READ() && I2C_SCL_READ())
		{
				i2c_Start();		

				i2c_SendByte(_Address | I2C_WR);
				ucAck = i2c_WaitAck();	

				i2c_Stop();			

				return ucAck;
		}
		return 1;	
}
到此IIC总线的驱动程序已经完成,下篇会讲解一下触摸芯片的驱动程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值