Files
Bionic_sphere/test/EXIO_Test/TCA9554PWR_Test.c
T

215 lines
6.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Created by misaki on 2025/8/24.
//
#include "TCA9554PWR_Test.h"
#include "TCA9554PWR.h"
#include "I2C_Driver.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static const char *TAG = "TCA9554PWR_TEST";
/*-------------------------------------------------
* 宏:延时时间,方便肉眼观察
*------------------------------------------------*/
#define DELAY_MS(ms) vTaskDelay(pdMS_TO_TICKS(ms))
/*-------------------------------------------------
* 内部辅助函数:打印 8bit 数据为二进制格式
*------------------------------------------------*/
static void print_bin8(uint8_t val)
{
for (int i = 7; i >= 0; i--) {
printf("%c", (val & (1 << i)) ? '1' : '0');
}
}
/*-------------------------------------------------
* 测试 1:输出寄存器读写测试
* 步骤:
* 1. 先写入 0xAA10101010
* 2. 立即读回,比对是否一致
*------------------------------------------------*/
static esp_err_t test_output_reg_rw(void)
{
ESP_LOGI(TAG, ">> 测试1:输出寄存器读写测试");
/* 1. 写入数据 */
Write_REG(TCA9554_OUTPUT_REG, 0xAA);
DELAY_MS(10); /* 确保芯片完成写操作 */
/* 2. 读回数据 */
uint8_t read_back = Read_REG(TCA9554_OUTPUT_REG);
ESP_LOGI(TAG, "写入 0xAA,读回 0x%02X", read_back);
if (read_back != 0xAA) {
ESP_LOGE(TAG, "测试1 失败:数据不一致");
return ESP_FAIL;
}
ESP_LOGI(TAG, "测试1 通过");
return ESP_OK;
}
/*-------------------------------------------------
* 测试 2:配置寄存器读写测试
* 步骤:
* 1. 将 8 个 IO 全部设为输入(写 0xFF)
* 2. 读回,应为 0xFF
* 3. 再全部设为输出(写 0x00)
* 4. 读回,应为 0x00
*------------------------------------------------*/
static esp_err_t test_config_reg_rw(void)
{
ESP_LOGI(TAG, ">> 测试2:配置寄存器读写测试");
/* 1. 全部设为输入 */
Write_REG(TCA9554_CONFIG_REG, 0xFF);
DELAY_MS(10);
uint8_t read_back = Read_REG(TCA9554_CONFIG_REG);
ESP_LOGI(TAG, "写入 0xFF(全输入),读回 0x%02X", read_back);
if (read_back != 0xFF) {
ESP_LOGE(TAG, "测试2 失败:全输入模式设置错误");
return ESP_FAIL;
}
/* 2. 全部设为输出 */
Write_REG(TCA9554_CONFIG_REG, 0x00);
DELAY_MS(10);
read_back = Read_REG(TCA9554_CONFIG_REG);
ESP_LOGI(TAG, "写入 0x00(全输出),读回 0x%02X", read_back);
if (read_back != 0x00) {
ESP_LOGE(TAG, "测试2 失败:全输出模式设置错误");
return ESP_FAIL;
}
ESP_LOGI(TAG, "测试2 通过");
return ESP_OK;
}
/*-------------------------------------------------
* 测试 3:单管脚输出翻转测试
* 步骤:
* 1. 先把 IO1 设为输出
* 2. 先置高,延时 500ms
* 3. 再置低,延时 500ms
* 4. 再调用 Toggle 两次,肉眼可见两次翻转
*------------------------------------------------*/
static esp_err_t test_single_pin_toggle(void)
{
ESP_LOGI(TAG, ">> 测试3:单管脚输出翻转测试");
/* 1. 设置 IO1 为输出模式 */
Mode_EXIO(TCA9554_EXIO1, 0); /* 0 = 输出 */
DELAY_MS(10);
/* 2. 置高 */
Set_EXIO(TCA9554_EXIO1, 1);
ESP_LOGI(TAG, "IO1 置高,请观察电平");
DELAY_MS(500);
/* 3. 置低 */
Set_EXIO(TCA9554_EXIO1, 0);
ESP_LOGI(TAG, "IO1 置低,请观察电平");
DELAY_MS(500);
/* 4. 两次翻转 */
Set_Toggle(TCA9554_EXIO1);
ESP_LOGI(TAG, "IO1 Toggle 1");
DELAY_MS(500);
Set_Toggle(TCA9554_EXIO1);
ESP_LOGI(TAG, "IO1 Toggle 2");
DELAY_MS(500);
ESP_LOGI(TAG, "测试3 完成(请确认 LED/万用表现象)");
return ESP_OK;
}
/*-------------------------------------------------
* 测试 48 位整体输出测试
* 步骤:
* 1. 8 个 IO 全部设为输出
* 2. 依次输出 0x55、0xAA、0xFF、0x00
* 3. 每次输出后打印日志
*------------------------------------------------*/
static esp_err_t test_all_pin_output(void)
{
ESP_LOGI(TAG, ">> 测试4:8位整体输出测试");
/* 1. 全部设为输出 */
Mode_EXIOS(0x00); /* 0x00 = 全输出 */
DELAY_MS(10);
const uint8_t pattern[4] = {0x55, 0xAA, 0xFF, 0x00};
for (int i = 0; i < 4; i++) {
Set_EXIOS(pattern[i]);
ESP_LOGI(TAG, "输出 0x%02X (二进制: ", pattern[i]);
print_bin8(pattern[i]);
printf(")\n");
DELAY_MS(1000);
}
ESP_LOGI(TAG, "测试4 完成");
return ESP_OK;
}
/*-------------------------------------------------
* 测试 5:输入读取测试
* 步骤:
* 1. 将 IO2 设为输入
* 2. 提示用户把 IO2 拉高
* 3. 等待 3 秒,期间循环读取 IO2 电平
* 4. 再提示用户把 IO2 拉低
* 5. 再次循环读取 3 秒
*------------------------------------------------*/
static esp_err_t test_single_pin_input(void)
{
ESP_LOGI(TAG, ">> 测试5:输入读取测试(需要人工干预)");
/* 1. 设置 IO2 为输入 */
Mode_EXIO(TCA9554_EXIO2, 1); /* 1 = 输入 */
DELAY_MS(10);
ESP_LOGI(TAG, "请把 IO2 拉高,3 秒内将持续读取...");
for (int i = 0; i < 30; i++) {
uint8_t level = Read_EXIO(TCA9554_EXIO2);
ESP_LOGI(TAG, "IO2 当前电平 = %u", level);
DELAY_MS(100);
}
ESP_LOGI(TAG, "请把 IO2 拉低,3 秒内将持续读取...");
for (int i = 0; i < 30; i++) {
uint8_t level = Read_EXIO(TCA9554_EXIO2);
ESP_LOGI(TAG, "IO2 当前电平 = %u", level);
DELAY_MS(100);
}
ESP_LOGI(TAG, "测试5 完成");
return ESP_OK;
}
/*-------------------------------------------------
* 综合测试入口
*------------------------------------------------*/
esp_err_t EXIO_Test(void)
{
ESP_LOGI(TAG, "====== TCA9554PWR 综合测试开始 ======");
/* 1. 初始化 I2C 与 TCA9554 */
I2C_Init(); /* I2C 驱动初始化 */
EXIO_Init(); /* TCA9554 芯片初始化 */
/* 2. 依次运行各项测试 */
if (test_output_reg_rw() != ESP_OK) return ESP_FAIL;
if (test_config_reg_rw() != ESP_OK) return ESP_FAIL;
if (test_single_pin_toggle()!= ESP_OK) return ESP_FAIL;
if (test_all_pin_output() != ESP_OK) return ESP_FAIL;
if (test_single_pin_input()!= ESP_OK) return ESP_FAIL;
ESP_LOGI(TAG, "====== 所有测试通过!======");
return ESP_OK;
}