Files
MoonshineOS/MSOS_ESP/main/tca9535.c
T
2026-07-30 19:51:54 +08:00

149 lines
3.7 KiB
C

#include "tca9535.h"
#include "iic.h"
#include "esp_log.h"
static const char *TAG = "TCA9535";
esp_err_t tca9535_read_reg(uint8_t reg, uint8_t *val)
{
if (val == NULL) {
return ESP_ERR_INVALID_ARG;
}
return iic_read_reg(TCA9535_ADDRESS, reg, val, 1);
}
esp_err_t tca9535_write_reg(uint8_t reg, uint8_t val)
{
unsigned char buf[2] = {reg, val};
return iic_send_bytes(TCA9535_ADDRESS, buf, 2);
}
esp_err_t tca9535_set_dir(uint16_t dir)
{
esp_err_t ret = tca9535_write_reg(TCA9535_REG_CONFIG0, (uint8_t)(dir & 0xFF));
if (ret != ESP_OK) {
return ret;
}
return tca9535_write_reg(TCA9535_REG_CONFIG1, (uint8_t)(dir >> 8));
}
esp_err_t tca9535_set_output(uint16_t val)
{
esp_err_t ret = tca9535_write_reg(TCA9535_REG_OUTPUT0, (uint8_t)(val & 0xFF));
if (ret != ESP_OK) {
return ret;
}
return tca9535_write_reg(TCA9535_REG_OUTPUT1, (uint8_t)(val >> 8));
}
esp_err_t tca9535_get_output(uint16_t *val)
{
if (val == NULL) {
return ESP_ERR_INVALID_ARG;
}
uint8_t p0 = 0, p1 = 0;
esp_err_t ret = tca9535_read_reg(TCA9535_REG_OUTPUT0, &p0);
if (ret != ESP_OK) {
return ret;
}
ret = tca9535_read_reg(TCA9535_REG_OUTPUT1, &p1);
if (ret != ESP_OK) {
return ret;
}
*val = (uint16_t)p0 | ((uint16_t)p1 << 8);
return ESP_OK;
}
esp_err_t tca9535_get_input(uint16_t *val)
{
if (val == NULL) {
return ESP_ERR_INVALID_ARG;
}
uint8_t p0 = 0, p1 = 0;
esp_err_t ret = tca9535_read_reg(TCA9535_REG_INPUT0, &p0);
if (ret != ESP_OK) {
return ret;
}
ret = tca9535_read_reg(TCA9535_REG_INPUT1, &p1);
if (ret != ESP_OK) {
return ret;
}
*val = (uint16_t)p0 | ((uint16_t)p1 << 8);
return ESP_OK;
}
esp_err_t tca9535_pin_mode(uint8_t pin, uint8_t mode)
{
if (pin >= TCA9535_PIN_COUNT) {
return ESP_ERR_INVALID_ARG;
}
uint8_t reg = (pin < 8) ? TCA9535_REG_CONFIG0 : TCA9535_REG_CONFIG1;
uint8_t bit = pin & 0x07;
uint8_t cur = 0;
esp_err_t ret = tca9535_read_reg(reg, &cur);
if (ret != ESP_OK) {
return ret;
}
if (mode == TCA9535_INPUT) {
cur |= (1 << bit);
} else {
cur &= ~(1 << bit);
}
return tca9535_write_reg(reg, cur);
}
esp_err_t tca9535_digital_write(uint8_t pin, uint8_t val)
{
if (pin >= TCA9535_PIN_COUNT) {
return ESP_ERR_INVALID_ARG;
}
uint8_t reg = (pin < 8) ? TCA9535_REG_OUTPUT0 : TCA9535_REG_OUTPUT1;
uint8_t bit = pin & 0x07;
uint8_t cur = 0;
esp_err_t ret = tca9535_read_reg(reg, &cur);
if (ret != ESP_OK) {
return ret;
}
if (val) {
cur |= (1 << bit);
} else {
cur &= ~(1 << bit);
}
return tca9535_write_reg(reg, cur);
}
esp_err_t tca9535_digital_read(uint8_t pin, uint8_t *val)
{
if (pin >= TCA9535_PIN_COUNT || val == NULL) {
return ESP_ERR_INVALID_ARG;
}
uint8_t reg = (pin < 8) ? TCA9535_REG_INPUT0 : TCA9535_REG_INPUT1;
uint8_t bit = pin & 0x07;
uint8_t cur = 0;
esp_err_t ret = tca9535_read_reg(reg, &cur);
if (ret != ESP_OK) {
return ret;
}
*val = (cur >> bit) & 0x01;
return ESP_OK;
}
esp_err_t tca9535_init(void)
{
esp_err_t ret = tca9535_write_reg(TCA9535_REG_POLARITY0, 0x00);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "TCA9535初始化失败");
return ret;
}
tca9535_write_reg(TCA9535_REG_POLARITY1, 0x00);
tca9535_write_reg(TCA9535_REG_OUTPUT0, 0x00);
tca9535_write_reg(TCA9535_REG_OUTPUT1, 0x00);
ret = tca9535_set_dir(0xFFFF);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "TCA9535初始化失败");
return ret;
}
ESP_LOGI(TAG, "TCA9535初始化成功, 地址0x%02X", TCA9535_ADDRESS);
return ESP_OK;
}