controller-pcba/User/application/inc/TCA6416.h

98 lines
4.4 KiB
C

#ifndef __TCA6416_H
#define __TCA6416_H
#include "main.h"
#include <stdint.h>
/* GPIO定义 */
#define TCA6416_SCL_PIN GPIO_PIN_2
#define TCA6416_SCL_PORT GPIOE
#define TCA6416_SDA_PIN GPIO_PIN_3
#define TCA6416_SDA_PORT GPIOE
#define TCA6416_SCL_PIN2 GPIO_PIN_5
#define TCA6416_SCL_PORT2 GPIOE
#define TCA6416_SDA_PIN2 GPIO_PIN_4
#define TCA6416_SDA_PORT2 GPIOE
/* TCA6416 I2C地址 */
#define TCA6416_ADDR 0x20 // 第一个芯片地址 (A0=A1=A2=GND)
#define TCA6416_ADDR2 0x21 // 第二个芯片地址 (A0=1, A1=A2=GND)
/* 寄存器地址定义 */
#define TCA6416_INPUT_PORT0 0x00 // 输入端口0
#define TCA6416_INPUT_PORT1 0x01 // 输入端口1
#define TCA6416_OUTPUT_PORT0 0x02 // 输出端口0
#define TCA6416_OUTPUT_PORT1 0x03 // 输出端口1
#define TCA6416_CONFIG_PORT0 0x06 // 配置端口0
#define TCA6416_CONFIG_PORT1 0x07 // 配置端口1
#define TCA6416_POL_INV_PORT0 0x04 // 极性反转端口0
#define TCA6416_POL_INV_PORT1 0x05 // 极性反转端口1
/* 软件I2C延时定义 */
#define I2C_DELAY() HAL_Delay(5) // 增加延时时间到5ms
/* 第一个芯片的软件I2C基本操作函数 */
#define SCL_HIGH() HAL_GPIO_WritePin(TCA6416_SCL_PORT, TCA6416_SCL_PIN, GPIO_PIN_SET)
#define SCL_LOW() HAL_GPIO_WritePin(TCA6416_SCL_PORT, TCA6416_SCL_PIN, GPIO_PIN_RESET)
#define SDA_HIGH() HAL_GPIO_WritePin(TCA6416_SDA_PORT, TCA6416_SDA_PIN, GPIO_PIN_SET)
#define SDA_LOW() HAL_GPIO_WritePin(TCA6416_SDA_PORT, TCA6416_SDA_PIN, GPIO_PIN_RESET)
#define SDA_READ() HAL_GPIO_ReadPin(TCA6416_SDA_PORT, TCA6416_SDA_PIN)
/* SDA输入/输出模式切换宏 */
#define SDA_INPUT_MODE() do { \
GPIO_InitTypeDef GPIO_InitStruct = {0}; \
GPIO_InitStruct.Pin = TCA6416_SDA_PIN; \
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
GPIO_InitStruct.Pull = GPIO_NOPULL; \
HAL_GPIO_Init(TCA6416_SDA_PORT, &GPIO_InitStruct); \
} while(0)
#define SDA_OUTPUT_MODE() do { \
GPIO_InitTypeDef GPIO_InitStruct = {0}; \
GPIO_InitStruct.Pin = TCA6416_SDA_PIN; \
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; \
GPIO_InitStruct.Pull = GPIO_NOPULL; \
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; \
HAL_GPIO_Init(TCA6416_SDA_PORT, &GPIO_InitStruct); \
} while(0)
/* 第二个芯片的软件I2C基本操作函数 */
#define SCL_HIGH2() HAL_GPIO_WritePin(TCA6416_SCL_PORT2, TCA6416_SCL_PIN2, GPIO_PIN_SET)
#define SCL_LOW2() HAL_GPIO_WritePin(TCA6416_SCL_PORT2, TCA6416_SCL_PIN2, GPIO_PIN_RESET)
#define SDA_HIGH2() HAL_GPIO_WritePin(TCA6416_SDA_PORT2, TCA6416_SDA_PIN2, GPIO_PIN_SET)
#define SDA_LOW2() HAL_GPIO_WritePin(TCA6416_SDA_PORT2, TCA6416_SDA_PIN2, GPIO_PIN_RESET)
#define SDA_READ2() HAL_GPIO_ReadPin(TCA6416_SDA_PORT2, TCA6416_SDA_PIN2)
/* 函数声明 */
void TCA6416_GPIO_Init(void);
uint8_t TCA6416_Init(void);
uint8_t TCA6416_Init2(void); // 第二个芯片的初始化函数
uint8_t TCA6416_WritePort(uint8_t port, uint8_t data);
uint8_t TCA6416_WritePort2(uint8_t port, uint8_t data); // 第二个芯片的写端口函数
uint8_t TCA6416_ReadPort(uint8_t port, uint8_t *data);
uint8_t TCA6416_ReadPort2(uint8_t port, uint8_t *data); // 第二个芯片的读端口函数
uint8_t TCA6416_SetPortDirection(uint8_t port, uint8_t direction);
uint8_t TCA6416_SetPortDirection2(uint8_t port, uint8_t direction); // 第二个芯片的设置方向函数
uint8_t TCA6416_SetPortPolarity(uint8_t port, uint8_t polarity);
uint8_t TCA6416_SetPortPolarity2(uint8_t port, uint8_t polarity); // 第二个芯片的设置极性函数
uint8_t TCA6416_WritePin(uint8_t port, uint8_t pin, uint8_t state);
uint8_t TCA6416_ReadPin(uint8_t port, uint8_t pin, uint8_t *state);
/* 软件I2C底层函数 */
void I2C_Start(void);
void I2C_Start2(void); // 第二个芯片的I2C起始信号
void I2C_Stop(void);
void I2C_Stop2(void); // 第二个芯片的I2C停止信号
void I2C_Ack(void);
void I2C_Ack2(void); // 第二个芯片的I2C应答
void I2C_NAck(void);
void I2C_NAck2(void); // 第二个芯片的I2C非应答
uint8_t I2C_WaitAck(void);
uint8_t I2C_WaitAck2(void); // 第二个芯片的等待应答
uint8_t I2C_SendByte(uint8_t byte); // 修正返回值类型
void I2C_SendByte2(uint8_t byte); // 第二个芯片的发送字节
uint8_t I2C_ReadByte(void);
uint8_t I2C_ReadByte2(void); // 第二个芯片的读取字节
#endif /* __TCA6416_H */