Files
player/Project/Src/Drive/Source/touch_iic.c

304 lines
9.5 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
/***
***************************************************************************************
* @file touch_iic.c
* @version V1.0
* @date 2018-1-1
* @author
* @brief IIC接口相关函数
***************************************************************************************
* @description
*
* STM32F429核心板 + 4.3RGB液晶屏(RGB043M1)
* https://shop212360197.taobao.com
* QQ交流群536665479
*
*
>>>>>
*
* 1.IIC函数
* 2.使IIC
* 3.100KHz
*
***************************************************************************************
***/
#include "touch_iic.h"
/*****************************************************************************************
* : Touch_IIC_GPIO_Config
* :
* :
* : IIC的GPIO口,
* : IIC通信速度不高IO口速度配置为2M即可
******************************************************************************************/
void Touch_IIC_GPIO_Config (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(Touch_IIC_SCL_CLK | Touch_IIC_SDA_CLK | Touch_INT_CLK | Touch_RST_CLK , ENABLE); //初始化IO口时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 开漏输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不带上下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 速度等级2M
GPIO_InitStructure.GPIO_Pin = Touch_IIC_SCL_PIN; // SCL
GPIO_Init(Touch_IIC_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Touch_IIC_SDA_PIN; // SDA
GPIO_Init(Touch_IIC_SDA_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_InitStructure.GPIO_Pin = Touch_INT_PIN; // INT
GPIO_Init(Touch_INT_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Touch_RST_PIN; // RST
GPIO_Init(Touch_RST_PORT, &GPIO_InitStructure);
GPIO_SetBits(Touch_IIC_SCL_PORT,Touch_IIC_SCL_PIN); // SCL输出高电平
GPIO_SetBits(Touch_IIC_SDA_PORT,Touch_IIC_SDA_PIN); // SDA输出高电平
GPIO_ResetBits(Touch_INT_PORT,Touch_INT_PIN); // INT输出低电平
GPIO_SetBits(Touch_RST_PORT,Touch_RST_PIN); // RST输出高 电平
}
/*****************************************************************************************
* : Touch_IIC_Delay
* : a -
* :
* :
* : 便使
******************************************************************************************/
void Touch_IIC_Delay(u32 a)
{
int i;
while (a --)
{
for (i = 0; i < 10; i++);
}
}
/*****************************************************************************************
* : Touch_IIC_INT_Out
* :
* :
* : IIC的INT脚为输出模式
* :
******************************************************************************************/
void Touch_INT_Out(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 速度等级2M
GPIO_InitStructure.GPIO_Pin = Touch_INT_PIN ; // 初始化 INT 引脚
GPIO_Init(Touch_INT_PORT, &GPIO_InitStructure);
}
/*****************************************************************************************
* : Touch_IIC_INT_In
* :
* :
* : IIC的INT脚为输入模式
* :
******************************************************************************************/
void Touch_INT_In(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 速度等级2M
GPIO_InitStructure.GPIO_Pin = Touch_INT_PIN ; // 初始化 INT 引脚
GPIO_Init(Touch_INT_PORT, &GPIO_InitStructure);
}
/*****************************************************************************************
* : Touch_IIC_Start
* :
* :
* : IIC起始信号
* : SCL处于高电平期间SDA由高到低跳变为起始信号
******************************************************************************************/
void Touch_IIC_Start(void)
{
Touch_IIC_SDA(1);
Touch_IIC_SCL(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SDA(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(0);
Touch_IIC_Delay(IIC_DelayVaule);
}
/*****************************************************************************************
* : Touch_IIC_Stop
* :
* :
* : IIC停止信号
* : SCL处于高电平期间SDA由低到高跳变为起始信号
******************************************************************************************/
void Touch_IIC_Stop(void)
{
Touch_IIC_SCL(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SDA(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SDA(1);
Touch_IIC_Delay(IIC_DelayVaule);
}
/*****************************************************************************************
* : Touch_IIC_ACK
* :
* :
* : IIC应答信号
* : SCL为高电平期间SDA引脚输出为低电平
******************************************************************************************/
void Touch_IIC_ACK(void)
{
Touch_IIC_SCL(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SDA(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(0); // SCL输出低时SDA应立即拉高释放总线
Touch_IIC_SDA(1);
Touch_IIC_Delay(IIC_DelayVaule);
}
/*****************************************************************************************
* : Touch_IIC_NoACK
* :
* :
* : IIC非应答信号
* : SCL为高电平期间SDA引脚为高电平
******************************************************************************************/
void Touch_IIC_NoACK(void)
{
Touch_IIC_SCL(0);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SDA(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(0);
Touch_IIC_Delay(IIC_DelayVaule);
}
/*****************************************************************************************
* : Touch_IIC_WaitACK
* :
* :
* :
* : SCL为高电平期间SDA引脚为低电平
******************************************************************************************/
u8 Touch_IIC_WaitACK(void)
{
Touch_IIC_SDA(1);
Touch_IIC_Delay(IIC_DelayVaule);
Touch_IIC_SCL(1);
Touch_IIC_Delay(IIC_DelayVaule);
if( GPIO_ReadInputDataBit(Touch_IIC_SDA_PORT,Touch_IIC_SDA_PIN) != 0) //判断设备是否有做出响应
{
Touch_IIC_SCL(0);
return ACK_ERR; //无应答
}
else
{
Touch_IIC_SCL(0);
return ACK_OK; //应答正常
}
}
/*****************************************************************************************
* : Touch_IIC_WriteByte
* : IIC_Data - 8
* : ACK_OK -
* ACK_ERR -
* :
* :
******************************************************************************************/
u8 Touch_IIC_WriteByte(u8 IIC_Data)
{
u8 i;
for (i = 0; i < 8; i++)
{
Touch_IIC_SDA(IIC_Data & 0x80);
Touch_IIC_Delay( IIC_DelayVaule );
Touch_IIC_SCL(1);
Touch_IIC_Delay( IIC_DelayVaule );
Touch_IIC_SCL(0);
if(i == 7)
{
Touch_IIC_SDA(1);
}
IIC_Data <<= 1;
}
return Touch_IIC_WaitACK(); //等待设备响应
}
/*****************************************************************************************
* : Touch_IIC_ReadByte
* : ACK_Mode - 10
* : ACK_OK -
* ACK_ERR -
* :
* :1.
* 2.
******************************************************************************************/
u8 Touch_IIC_ReadByte(u8 ACK_Mode)
{
u8 IIC_Data = 0;
u8 i = 0;
for (i = 0; i < 8; i++)
{
IIC_Data <<= 1;
Touch_IIC_SCL(1);
Touch_IIC_Delay( IIC_DelayVaule );
IIC_Data |= (GPIO_ReadInputDataBit(Touch_IIC_SDA_PORT,Touch_IIC_SDA_PIN) & 0x01);
Touch_IIC_SCL(0);
Touch_IIC_Delay( IIC_DelayVaule );
}
if ( ACK_Mode == 1 ) // 应答信号
Touch_IIC_ACK();
else
Touch_IIC_NoACK(); // 非应答信号
return IIC_Data;
}
/********************************************************************************************/