1. 测试了IO拓展芯片TCA9554PWR,测试结果正常,测试通过
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
//
|
||||
// Created by misaki on 2025/8/24.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
/**
|
||||
* @brief TCA9554PWR 芯片功能综合测试入口
|
||||
* 该函数会依次执行:
|
||||
* 1. 初始化 I2C 及 TCA9554
|
||||
* 2. 输出寄存器读写测试
|
||||
* 3. 配置寄存器读写测试
|
||||
* 4. 单管脚输出翻转测试
|
||||
* 5. 8 位整体输出测试
|
||||
* 6. 输入读取测试(需要把待测脚短暂拉高/拉低)
|
||||
* @return ESP_OK 全部测试通过
|
||||
* ESP_FAIL 任一测试失败
|
||||
*/
|
||||
esp_err_t EXIO_Test(void);
|
||||
Reference in New Issue
Block a user