@@ -0,0 +1,215 @@
//
// 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. 先写入 0xAA( 10101010)
* 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 ;
}
/*-------------------------------------------------
* 测试 4: 8 位整体输出测试
* 步骤:
* 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 ;
}