STM32F407驱动FDC1004的程序分享出来:
四通道
Touch.h头文件
#ifndef __Touch_I2C_H
#define __Touch_I2C_H
#include "stm32f4xx.h"
#define I2CT_FLAG_TIMEOUT ((uint32_t)0x1000)
#define I2CT_LONG_TIMEOUT ((uint32_t)(10 * I2CT_FLAG_TIMEOUT))
/*I2C引脚*/
#define GTP_I2C1_SCL_PIN GPIO_Pin_6
#define GTP_I2C1_SCL_GPIO_PORT GPIOB
#define GTP_I2C1_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB
#define GTP_I2C1_SCL_SOURCE GPIO_PinSource6
#define GTP_I2C1_SDA_PIN GPIO_Pin_7
#define GTP_I2C1_SDA_GPIO_PORT GPIOB
#define GTP_I2C1_SDA_GPIO_CLK RCC_AHB1Periph_GPIOB
#define GTP_I2C1_SDA_SOURCE GPIO_PinSource7
#define GTP_I2C2_SCL_PIN GPIO_Pin_1
#define GTP_I2C2_SCL_GPIO_PORT GPIOF
#define GTP_I2C2_SCL_GPIO_CLK RCC_AHB1Periph_GPIOF
#define GTP_I2C2_SCL_SOURCE GPIO_PinSource1
#define GTP_I2C2_SDA_PIN GPIO_Pin_0
#define GTP_I2C2_SDA_GPIO_PORT GPIOF
#define GTP_I2C2_SDA_GPIO_CLK RCC_AHB1Periph_GPIOF
#define GTP_I2C2_SDA_SOURCE GPIO_PinSource0
#define GTP_I2C3_SCL_PIN GPIO_Pin_8
#define GTP_I2C3_SCL_GPIO_PORT GPIOA
#define GTP_I2C3_SCL_GPIO_CLK RCC_AHB1Periph_GPIOA
#define GTP_I2C3_SCL_SOURCE GPIO_PinSource8
#define GTP_I2C3_SDA_PIN GPIO_Pin_9
#define GTP_I2C3_SDA_GPIO_PORT GPIOC
#define GTP_I2C3_SDA_GPIO_CLK RCC_AHB1Periph_GPIOC
#define GTP_I2C3_SDA_SOURCE GPIO_PinSource9
#define GTP_I2C4_SCL_PIN GPIO_Pin_12
#define GTP_I2C4_SCL_GPIO_PORT GPIOA
#define GTP_I2C4_SCL_GPIO_CLK RCC_AHB1Periph_GPIOA
#define GTP_I2C4_SCL_SOURCE GPIO_PinSource12
#define GTP_I2C4_SDA_PIN GPIO_Pin_11
#define GTP_I2C4_SDA_GPIO_PORT GPIOA
#define GTP_I2C4_SDA_GPIO_CLK RCC_AHB1Periph_GPIOA
#define GTP_I2C4_SDA_SOURCE GPIO_PinSource11
//#define GTP_I2C4_SCL_PIN GPIO_Pin_8
//#define GTP_I2C4_SCL_GPIO_PORT GPIOB
//#define GTP_I2C4_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB
//#define GTP_I2C4_SCL_SOURCE GPIO_PinSource8
//#define GTP_I2C4_SDA_PIN GPIO_Pin_9
//#define GTP_I2C4_SDA_GPIO_PORT GPIOB
//#define GTP_I2C4_SDA_GPIO_CLK RCC_AHB1Periph_GPIOB
//#define GTP_I2C4_SDA_SOURCE GPIO_PinSource9
#define I2C1_SCL_1() GPIO_SetBits(GTP_I2C1_SCL_GPIO_PORT, GTP_I2C1_SCL_PIN) /* SCL = 1 */
#define I2C1_SCL_0() GPIO_ResetBits(GTP_I2C1_SCL_GPIO_PORT, GTP_I2C1_SCL_PIN)/* SCL = 0 */
#define I2C1_SDA_1() GPIO_SetBits(GTP_I2C1_SDA_GPIO_PORT, GTP_I2C1_SDA_PIN) /* SDA = 1 */
#define I2C1_SDA_0() GPIO_ResetBits(GTP_I2C1_SDA_GPIO_PORT, GTP_I2C1_SDA_PIN)/* SDA = 0 */
#define I2C1_SDA_READ() GPIO_ReadInputDataBit(GTP_I2C1_SDA_GPIO_PORT, GTP_I2C1_SDA_PIN)
#define I2C2_SCL_1() GPIO_SetBits(GTP_I2C2_SCL_GPIO_PORT, GTP_I2C2_SCL_PIN) /* SCL = 1 */
#define I2C2_SCL_0() GPIO_ResetBits(GTP_I2C2_SCL_GPIO_PORT, GTP_I2C2_SCL_PIN)/* SCL = 0 */
#define I2C2_SDA_1() GPIO_SetBits(GTP_I2C2_SDA_GPIO_PORT, GTP_I2C2_SDA_PIN) /* SDA = 1 */
#define I2C2_SDA_0() GPIO_ResetBits(GTP_I2C2_SDA_GPIO_PORT, GTP_I2C2_SDA_PIN)/* SDA = 0 */
#define I2C2_SDA_READ() GPIO_ReadInputDataBit(GTP_I2C2_SDA_GPIO_PORT, GTP_I2C2_SDA_PIN)
#define I2C3_SCL_1() GPIO_SetBits(GTP_I2C3_SCL_GPIO_PORT, GTP_I2C3_SCL_PIN) /* SCL = 1 */
#define I2C3_SCL_0() GPIO_ResetBits(GTP_I2C3_SCL_GPIO_PORT, GTP_I2C3_SCL_PIN)/* SCL = 0 */
#define I2C3_SDA_1() GPIO_SetBits(GTP_I2C3_SDA_GPIO_PORT, GTP_I2C3_SDA_PIN) /* SDA = 1 */
#define I2C3_SDA_0() GPIO_ResetBits(GTP_I2C3_SDA_GPIO_PORT, GTP_I2C3_SDA_PIN)/* SDA = 0 */
#define I2C3_SDA_READ() GPIO_ReadInputDataBit(GTP_I2C3_SDA_GPIO_PORT, GTP_I2C3_SDA_PIN)
#define I2C4_SCL_1() GPIO_SetBits(GTP_I2C4_SCL_GPIO_PORT, GTP_I2C4_SCL_PIN) /* SCL = 1 */
#define I2C4_SCL_0() GPIO_ResetBits(GTP_I2C4_SCL_GPIO_PORT, GTP_I2C4_SCL_PIN)/* SCL = 0 */
#define I2C4_SDA_1() GPIO_SetBits(GTP_I2C4_SDA_GPIO_PORT, GTP_I2C4_SDA_PIN) /* SDA = 1 */
#define I2C4_SDA_0() GPIO_ResetBits(GTP_I2C4_SDA_GPIO_PORT, GTP_I2C4_SDA_PIN)/* SDA = 0 */
#define I2C4_SDA_READ() GPIO_ReadInputDataBit(GTP_I2C4_SDA_GPIO_PORT, GTP_I2C4_SDA_PIN)
//#define SDA_IN() { GPIOA->CRH &= 0xFFFFOFFF; GPIOA->CRH= 4<<12;}
//#define SDA_OUT() { GPIOA->CRH &= 0xFFFFOFFF; GPIOA->CRH= 7<<12;}
#define SDA_IN() { GPIOA->MODER &= 0xFF3FFFFF; }
#define SDA_OUT() { GPIOA->MODER &= 0xFF3FFFFF; GPIOA->MODER |= 1<<22; GPIOA-> OTYPER &= 0xFFFFF7FF; GPIOA-> OTYPER |= 1<<11;}
#define I2C_DIR_WR 0
#define I2C_DIR_RD 1
#define I2C_M_RD 0x0001
#define GTP_ADDR_LENGTH 1
struct i2c_msg
{
uint8_t addr; /*从设备的I2C设备地址 */
uint16_t flags; /*控制标志*/
uint16_t len; /*读写数据的长度 */
uint8_t *buf; /*存储读写数据的指针 */
};
#define FDC1004_COMM_ID1 0xA0
#define FDC1004_COMM_ID2 0xA0
#define FDC1004_COMM_ID3 0xA0
#define FDC1004_COMM_ID4 0xA0
#define FDC1004_DEVICE_ID 0x1004
#define FDC1004_TI_ID 0x5449
//FDC1004寄存器地址
#define MEAS1_MSB_ADDR 0x00
#define MEAS1_LSB_ADDR 0x01
#define MEAS2_MSB_ADDR 0x02
#define MEAS2_LSB_ADDR 0x03
#define MEAS3_MSB_ADDR 0x04
#define MEAS3_LSB_ADDR 0x05
#define MEAS4_MSB_ADDR 0x06
#define MEAS4_LSB_ADDR 0x07
#define CONF_MEAS1_ADDR 0x08
#define CONF_MEAS2_ADDR 0x09
#define CONF_MEAS3_ADDR 0x0A
#define CONF_MEAS4_ADDR 0x0B
#define FDC_CONF_ADDR 0x0C
#define OFFSET_CAL_CIN1_ADDR 0x0D
#define OFFSET_CAL_CIN2_ADDR 0x0E
#define OFFSET_CAL_CIN3_ADDR 0x0F
#define OFFSET_CAL_CIN4_ADDR 0x10
#define GAIN_CAL_CIN1_ADDR 0x11
#define GAIN_CAL_CIN2_ADDR 0x12
#define GAIN_CAL_CIN3_ADDR 0x13
#define GAIN_CAL_CIN4_ADDR 0x14
#define TI_ID_ADDR 0xFE
#define DEVICE_ID_ADDR 0xFF
void i2c_Delay(uint16_t time);
void I2C_GPIO_Config(void);
void I2C_Touch_Init(void);
int32_t TP1_FDC1004_init(uint8_t client_addr,uint8_t *buf,int32_t len);
int32_t TP2_FDC1004_init(uint8_t client_addr,uint8_t *buf,int32_t len);
int32_t TP3_FDC1004_init(uint8_t client_addr,uint8_t *buf,int32_t len);
int32_t TP4_FDC1004_init(uint8_t client_addr,uint8_t *buf,int32_t len);
float Touch4_Cap_Read(uint8_t client_addr,uint8_t *buf1,uint8_t *buf2,int32_t len);
float Touch3_Cap_Read(uint8_t client_addr,uint8_t *buf1,uint8_t *buf2,int32_t len);
float Touch2_Cap_Read(uint8_t client_addr,uint8_t *buf1,uint8_t *buf2,int32_t len);
float Touch1_Cap_Read(uint8_t client_addr,uint8_t *buf1,uint8_t *buf2,int32_t len);
void i2c4_Ack(void);
void i2c4_NAck(void);
uint8_t i2c4_WaitAck(void);
void i2c4_SendByte(uint8_t _ucByte);
uint8_t i2c4_ReadByte(void);
uint8_t i2c4_Start(void);
void i2c4_Stop(void);
#endif
|