304 lines
9.5 KiB
C
304 lines
9.5 KiB
C
|
/***
|
|||
|
***************************************************************************************
|
|||
|
* @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;
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************************************/
|