Files
player/Project/Src/Drive/Source/touch_iic.c
2025-06-27 00:32:57 +08:00

304 lines
9.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***
***************************************************************************************
* @file touch_iic.c
* @version V1.0
* @date 2018-1-1
* @author 反客科技
* @brief 触摸屏IIC接口相关函数
***************************************************************************************
* @description
*
* 实验平台反客STM32F429核心板 + 4.3寸RGB液晶屏(屏幕型号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 - 响应模式输入1则发出应答信号输入0发出非应答信号
* 返 回 值: 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;
}
/********************************************************************************************/