ZHCSYT1A August 2025 – October 2025 TXE8116
PRODUCTION DATA
第二個字節的 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();
}