标题:
STM32F407驱动IT7259的驱动代码
[打印本页]
作者:
lfgxp
时间:
2019-12-24 16:27
标题:
STM32F407驱动IT7259的驱动代码
IT7259这个驱动IC在智能穿戴设备商用的比较多,它的驱动拿出来分享一下
#include "it7259.h"
#include "WM.h"
#include "mainview.h"
#include "string.h"
I2C_HandleTypeDef hi2c3;
TIM_HandleTypeDef htim6;
uint16_t XResolution;
uint16_t YResolution;
uint8_t Step;
extern WM_HWIN MainView;
#define IT7259_ADDR 0x8C
#define IT7259_ADDR_READ IT7259_ADDR | 1
#define COMMAND_BUFFER_INDEX 0x20
#define QUERY_BUFFER_INDEX 0x80
#define COMMAND_RESPONSE_BUFFER_INDEX 0xA0
#define POINT_BUFFER_INDEX 0xE0
#define QUERY_SUCCESS 0x00
#define QUERY_BUSY 0x01
#define QUERY_ERROR 0x02
#define QUERY_POINT 0x80
#define IIC_SCL GPIO_PIN_6 //PB6
#define IIC_SDA GPIO_PIN_7 //PB7
#define RST GPIO_PIN_9 //PB9
#define EINT GPIO_PIN_8 //PB8
#define IIC_SCL_PORT GPIOB //
#define IIC_SDA_PORT GPIOB //
#define RST_PORT GPIOB //
#define EINT_PORT GPIOB //
#define EINT_PORT_IRQ EXTI9_5_IRQn
#define LOW_PIN(x, y) (x->BSRR = y << 16)
#define HIGH_PIN(x, y) (x->BSRR = y)
#define READ_PIN(x, y) ((x->IDR & y) > 0 ? 1 : 0)
#define SDA_OUTPUT() GPIOB->MODER = (GPIOB->MODER & 0xFFFF3FFF) | 0x00004000; //
#define SDA_INPUT() GPIOB->MODER = (GPIOB->MODER & 0xFFFF3FFF);
#define ACK 0
#define NACK 1
#define POINT 0x08
#define GESTURES 0x80
#define TAP 0x20
#define FLICK 0x22
#define DOUBLE_TAP 0x23
#define UP 0x08
#define UPPER_RIGHT 0x09
#define RIGHT 0x0A
#define LOWER_RIGHT 0x0B
#define DOWN 0x0C
#define LOWER_LEFT 0x0D
#define LEFT 0x0E
#define UPPER_LEFT 0x0F
uint8_t pointdata[14]; //报点XY数据
static void I2CDelay(uint16_t n)
{
TIM6->ARR = 0x10000 - n;
TIM6->CNT = 0x10000 - n;
__HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);
TIM6->CR1 |= 1;
while(__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE) == RESET);
}
/*************************************************************
*函数名称:I2CStart
*函数功能:I2C开始信号
*输入参数:
*输出参数:
*备 注:时钟线高时,数据线由高到低的跳变,表示I2C开始信号
**************************************************************/
static void I2CStart( void )
{
SDA_OUTPUT();
HIGH_PIN(IIC_SDA_PORT, IIC_SDA);
//I2CDelay(6);
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
//I2CDelay(6);
LOW_PIN(IIC_SDA_PORT, IIC_SDA);
I2CDelay(6);
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
}
/*************************************************************
*函数名称:I2CStop
*函数功能:I2C停止信号
*输入参数:
*输出参数:
*备 注:时钟线高时,数据线由低到高的跳变,表示I2C停止信号
**************************************************************/
static void I2CStop( void )
{
SDA_OUTPUT();
LOW_PIN(IIC_SDA_PORT, IIC_SDA);
I2CDelay(6);
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
HIGH_PIN(IIC_SDA_PORT, IIC_SDA);
I2CDelay(6);
}
/*************************************************************
*函数名称:I2CWriteByte
*函数功能:I2C写一字节数据
*输入参数:
*输出参数:
*备 注:
**************************************************************/
static uint8_t I2CWriteByte(uint8_t byte)
{
uint8_t i;
uint8_t ucErrTime=0;
SDA_OUTPUT();
//LOW_PIN(IIC_SCL_PORT, IIC_SCL);
for (i=0; i<8; i++)
{
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
if(0x80 & byte)
HIGH_PIN(IIC_SDA_PORT, IIC_SDA);
else
LOW_PIN(IIC_SDA_PORT, IIC_SDA);
byte <<= 1;
I2CDelay(6);
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
}
SDA_INPUT();
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
while(READ_PIN(IIC_SDA_PORT, IIC_SDA))
{
if(ucErrTime++>250)
{
I2CStop();
return NACK;
}
}
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
return ACK;
}
//产生ACK应答
void IIC_Ack(void)
{
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
SDA_OUTPUT();
LOW_PIN(IIC_SDA_PORT, IIC_SDA);;
I2CDelay(6);
HIGH_PIN(IIC_SDA_PORT, IIC_SCL);
I2CDelay(6);
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
}
//不产生ACK应答
void IIC_NAck(void)
{
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
SDA_OUTPUT();
HIGH_PIN(IIC_SDA_PORT, IIC_SDA);
I2CDelay(6);
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
}
/*************************************************************
*函数名称:I2CReadByte
*函数功能:I2C读一字节数据
*输入参数:
*输出参数:
*备 注:
**************************************************************/
static uint8_t I2CReadByte(uint8_t ack)
{
int8_t i;
uint8_t ReadValue = 0;
SDA_INPUT();
for( i=7; i>=0; i-- )
{
LOW_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
HIGH_PIN(IIC_SCL_PORT, IIC_SCL);
I2CDelay(6);
ReadValue |= READ_PIN(IIC_SDA_PORT, IIC_SDA) << i;
}
SDA_OUTPUT();
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return ReadValue;
}
/*************************************************************
*函数名称:MemoryWriteByte
*函数功能:E2PROM指定地址写一字节数据
*输入参数:addr E2PROM地址
data 写入的数据
*输出参数:SET: 写入正常;RESET:写入错误
*备 注:
**************************************************************/
static uint8_t MemoryWriteBuffer(uint8_t addr, uint8_t* pdata, int len)
{
I2CStart();
if(I2CWriteByte(IT7259_ADDR) == NACK)
{
I2CStop();
return 0;
}
if(I2CWriteByte(addr) == NACK)
{
I2CStop();
return 0;
}
while(len--)
{
if(I2CWriteByte(*pdata++) == NACK)
{
I2CStop();
return 0;
}
}
I2CStop();
return 1;
}
/*************************************************************
*函数名称:E2promReadByte
*函数功能:E2PROM指定地址读一字节数据
*输入参数:addr E2PROM地址
*输出参数:返回读出的数据
*备 注:
**************************************************************/
static uint8_t MemoryReadBuffer(uint8_t addr, uint8_t* pdata, int len)
{
I2CStart();
if(I2CWriteByte(IT7259_ADDR) == NACK)
{
I2CStop();
return 0;
}
if(I2CWriteByte(addr) == NACK)
{
I2CStop();
return 0;
}
I2CStart();
if(I2CWriteByte(IT7259_ADDR_READ) == NACK) ///////////???????????
{
I2CStop();
return 0;
}
while(--len)
{
*pdata++ = I2CReadByte(ACK);
}
*pdata = I2CReadByte(NACK);
I2CStop();
return 1;
}
static void CTP_CheckBusy(void)
{
uint8_t query, result;
uint16_t i=0;
do
{
result = MemoryReadBuffer(QUERY_BUFFER_INDEX, &query, 1);
i++;
if(i>500)
return;
}while((query & QUERY_BUSY) || result == 0);
}
static uint8_t CTP_IdentifyCapSensor(void)
{
uint8_t cmd = 0;
uint8_t data[10];
CTP_CheckBusy();
if(!MemoryWriteBuffer(COMMAND_BUFFER_INDEX, &cmd, 1)) return 0;
CTP_CheckBusy();
if(!MemoryReadBuffer(COMMAND_RESPONSE_BUFFER_INDEX, data, 10)) return 0;
if(data[1] == 'I' && data[2] == 'T' && data[3] == 'E' && data[4] == '7' && data[5] == '2' && data[6] == '6' && data[7] == '0')
return 1;
return 0;
}
static uint8_t CTP_SetInterruptNotification(uint8_t ucStatus, uint8_t ucType)
{
uint8_t cmd[4] = {0x02, 0x04, ucStatus, ucType};
uint8_t data[2];
CTP_CheckBusy();
if(!MemoryWriteBuffer(COMMAND_BUFFER_INDEX, cmd, 4)) return 0;
CTP_CheckBusy();
if(!MemoryReadBuffer(COMMAND_RESPONSE_BUFFER_INDEX, data, 2)) return 0;
if(*(uint16_t *)data == 0)
return 1;
return 0;
}
static uint8_t CTP_GetFirmwareInformation(uint8_t* info)
{
uint8_t cmd[2] = {0x01, 0x00};
CTP_CheckBusy();
if(!MemoryWriteBuffer(COMMAND_BUFFER_INDEX, cmd, 2)) return 0;
CTP_CheckBusy();
if(!MemoryReadBuffer(COMMAND_RESPONSE_BUFFER_INDEX, info, 9)) return 0;
if(info[5]== 0 && info[6] == 0 && info[7] == 0 && info[8] == 0)
return 0;
return 1;
}
static uint8_t CTP_Get2DResolutions(uint16_t *pwXResolution, uint16_t *pwYResolution, uint8_t *pucStep)
{
uint8_t cmd[2] = {0x01, 0x02};
uint8_t data[14];
CTP_CheckBusy();
if(!MemoryWriteBuffer(COMMAND_BUFFER_INDEX, cmd, 2)) return 0;
CTP_CheckBusy();
if(!MemoryReadBuffer(COMMAND_RESPONSE_BUFFER_INDEX, data, 14)) return 0;
if(pwXResolution != NULL)
*pwXResolution = data[2] + (data[3] << 8);
if(pwYResolution != NULL)
*pwYResolution = data[4] + (data[5] << 8);
if(pucStep != NULL)
*pucStep = data[6];
return 1;
}
static void TOUCH_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//__HAL_RCC_GPIOC_CLK_ENABLE();
/**I2C1 GPIO Configuration
PA8 ------> I2C1_SCL
PC9 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = IIC_SCL;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = IIC_SDA;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = RST;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(RST_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = EINT;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(EINT_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EINT_PORT_IRQ, 1, 0);
}
/* TIM6 init function */
static void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
__HAL_RCC_TIM6_CLK_ENABLE();
htim6.Instance = TIM6;
htim6.Init.Prescaler = 84 - 1;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&htim6);
HAL_TIM_OnePulse_Init(&htim6, TIM_OPMODE_SINGLE);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);
}
uint8_t firmwareinfo[9];
void IT7259_Init(void)
{
TOUCH_IO_Init();
MX_TIM6_Init();
HAL_GPIO_WritePin(RST_PORT, RST, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(RST_PORT, RST, GPIO_PIN_SET);
HAL_Delay(200);
if(!CTP_IdentifyCapSensor()) return; //识别触摸屏
if(!CTP_GetFirmwareInformation(firmwareinfo)) return; //检测固件状态
if(!CTP_Get2DResolutions(&XResolution, &YResolution, &Step)) return; //获取触摸屏分辨率
//if(!CTP_SetInterruptNotification(1, 0)) return; //设置触摸产生下降沿中断
HAL_NVIC_EnableIRQ(EINT_PORT_IRQ); //使能PC7中断
}
static uint8_t CTP_CheckNewPoint(void)
{
uint8_t query;
if(!MemoryReadBuffer(QUERY_BUFFER_INDEX, &query, 1)) return 0;
if (query & QUERY_POINT) return 1;
}
uint8_t Read_X(void);
uint8_t Read_Y(void);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //触摸中断
{
uint16_t xraw,yraw;
if(CTP_CheckNewPoint())
{
if(!MemoryReadBuffer(POINT_BUFFER_INDEX, pointdata, 14)) return;
if(pointdata[0] & POINT) //报点
{
// Read_X();
// Read_Y();
xraw = ((pointdata[3] & 0x0F) << 8) + pointdata[2];
yraw = ((pointdata[3] & 0xF0) << 4) + pointdata[4];
GUI_TOUCH_Exec();
// memset(pointdata,0,14);
// GUI_TOUCH_GetState();
}
if(pointdata[0] & GESTURES) //手势
{
// if(pointdata[1] == TAP || pointdata[1] == DOUBLE_TAP) //单击
// {
// WM_SendMessageNoPara(MainView, WM_TAP);
// }
if(pointdata[1] == FLICK) //滑动
{
switch(pointdata[10])
{
case UP: //上
case UPPER_RIGHT:
WM_SendMessageNoPara(MainView, WM_SLIDE_UP);
break;
case RIGHT: //右
case LOWER_RIGHT:
WM_SendMessageNoPara(MainView, WM_SLIDE_RIGHT);
break;
case DOWN: //下
case LOWER_LEFT:
WM_SendMessageNoPara(MainView, WM_SLIDE_DOWN);
break;
case LEFT: //左
case UPPER_LEFT:
WM_SendMessageNoPara(MainView, WM_SLIDE_LEFT);
break;
}
}
}
}
}
uint16_t x,y,temp;
uint16_t Read_X(void)
{
x = pointdata[2];
temp = pointdata[3];
x |= ((temp & 0x0F)<<8);
return x;
}
uint16_t Read_Y(void)
{
y = pointdata[4];
temp = pointdata[3];
y |= ((temp & 0xF0)<<4);
return y;
//memset(pointdata,0,14);
}
复制代码
作者:
zxh51
时间:
2020-4-19 14:38
整体的源码 能发我吗?
作者:
lfgxp
时间:
2020-4-27 14:29
zxh51 发表于 2020-4-19 14:38
整体的源码 能发我吗?
留下你的邮箱地址
作者:
onono
时间:
2020-7-6 11:23
我也正在调这个,可以分享一下吗?
作者:
kshitij
时间:
2020-8-13 18:19
lfgxp 发表于 2020-4-27 14:29
留下你的邮箱地址
Hello! Can I get the overall source code too?
Here's my email :
Thank you in advance!
作者:
DSCX05
时间:
2020-12-13 23:03
我也正在调这个,可以分享一下吗?
作者:
gqm
时间:
2021-5-18 10:23
能把这个tp的整套驱动发大家一下吗,我也在调试,谢谢!
作者:
sanmu
时间:
2021-5-19 13:01
还能发吗 我也想要一份 给我发一份可以吗
作者:
shlj999
时间:
2023-5-10 15:10
Could you share the full source code?
作者:
1065307738
时间:
2023-7-19 08:29
大师 资料给我发一份吧,最近在调这个触摸芯片。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1