ZHCSYC2A May 2025 – September 2025 TXE8116-Q1 , TXE8124-Q1
ADVANCE INFORMATION
第二个字节的 LSB 会启用多端口功能。当该位为 1 时,数据字节的每个位对应各个端口。所以,LSB 位 B0 对应 P0 端口,B1 对应 P1 端口,B2 对应 P2 端口。使用多端口编程时,特定端口中的所有 I/O 都将具有相同的配置。
例如,要将 P1 中的所有 I/O 设置为 1,控制器可以将 GPIO 方向配置为输出,然后设置 P1 端口。
以下是此命令在控制器端的示例代码:
// 定义 SPI 寄存器地址
#define REGISTER_CMD_BYTE 0x4 // 方向配置寄存器的寄存器命令字节
#define REGISTER_CMD_OUTPUT 0x3 // 输出端口寄存器的寄存器命令字节
#define DATA_BITS 0x2 // 将 B1 设置为 1,将 B0 设置为 0 以设置 P1 端口
#define READ_WRITE_BIT 0 // 0 表示写入操作,1 表示读取操作
// 用于将 24 位 SPI 帧发送到 I/O 扩展器(MSB 优先)的函数
void SPI_Send(uint32_t data) {
// 使用硬件 SPI 外设逐位发送 24 位数据(MSB 优先)
for (int i = 23; i >= 0; i--) {
SPI_Transmit((data >> i) & 0x01); // 首先移出 MSB
}
}
// 用于将多端口命令发送到 SPI I/O 扩展器的函数
void SPI_Multi_Port_Dir(void) {
uint32_t frame = 0;
// 设置读取/写入位(位 23)
frame |= (READ_WRITE_BIT << 23);
// 设置寄存器地址(位 20-16)
frame |= (REGISTER_CMD_BYTE << 16);
// 设置数据位(位 7-0)
frame |= (DATA_BITS & 0xFF); // 确保我们仅使用低 8 位
// 将 CS 拉至低电平以选择目标器件
CS_LOW();
// 发送构建的 SPI 帧(MSB 优先)
SPI_Send(frame);
// 将 CS 拉至高电平以在传输后取消选择器件
CS_HIGH();
}
void SPI_Multi_Port_Output(void) {
uint32_t frame = 0;
// 设置读取/写入位(位 23)
frame |= (READ_WRITE_BIT << 23);
// 设置寄存器地址(位 20-16)
frame |= (REGISTER_CMD_OUTPUT << 16);
// 设置数据位(位 7-0)
frame |= (DATA_BITS & 0xFF); // 确保我们仅使用低 8 位
// 将 CS 拉至低电平以选择目标器件
CS_LOW();
// 发送构建的 SPI 帧(MSB 优先)
SPI_Send(frame);
// 将 CS 拉至高电平以在传输后取消选择器件
CS_HIGH();
}