最近项目中用到了台产的触摸芯片,通信方式是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总线的驱动程序已经完成,下篇会讲解一下触摸芯片的驱动程序。