6416test1
This commit is contained in:
parent
f2ad332473
commit
4585021528
|
@ -7,6 +7,8 @@
|
||||||
"ad7124.h": "c",
|
"ad7124.h": "c",
|
||||||
"freertos.h": "c",
|
"freertos.h": "c",
|
||||||
"usart.h": "c",
|
"usart.h": "c",
|
||||||
"stm32f4xx_it.h": "c"
|
"stm32f4xx_it.h": "c",
|
||||||
|
"tca6416.h": "c",
|
||||||
|
"stm32f4xx_hal.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -53,7 +53,7 @@
|
||||||
/* #define HAL_SRAM_MODULE_ENABLED */
|
/* #define HAL_SRAM_MODULE_ENABLED */
|
||||||
/* #define HAL_SDRAM_MODULE_ENABLED */
|
/* #define HAL_SDRAM_MODULE_ENABLED */
|
||||||
/* #define HAL_HASH_MODULE_ENABLED */
|
/* #define HAL_HASH_MODULE_ENABLED */
|
||||||
/* #define HAL_I2C_MODULE_ENABLED */
|
//#define HAL_I2C_MODULE_ENABLED
|
||||||
/* #define HAL_I2S_MODULE_ENABLED */
|
/* #define HAL_I2S_MODULE_ENABLED */
|
||||||
/* #define HAL_IWDG_MODULE_ENABLED */
|
/* #define HAL_IWDG_MODULE_ENABLED */
|
||||||
/* #define HAL_LTDC_MODULE_ENABLED */
|
/* #define HAL_LTDC_MODULE_ENABLED */
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "ad7124_test.h"
|
#include "ad7124_test.h"
|
||||||
#include <string.h> // 添加string.h用于字符串操作
|
#include <string.h> // 添加string.h用于字符串操作
|
||||||
#include "ht1200m.h"
|
#include "ht1200m.h"
|
||||||
|
#include "TCA6416.h" // 添加TCA6416头文件
|
||||||
|
|
||||||
// 声明外部变量
|
// 声明外部变量
|
||||||
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
|
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
|
||||||
|
@ -71,6 +72,7 @@ osThreadId gpio_di_do_taskHandle;
|
||||||
osThreadId ec11_taskHandle;
|
osThreadId ec11_taskHandle;
|
||||||
osThreadId ad7124_test_taskHandle;
|
osThreadId ad7124_test_taskHandle;
|
||||||
osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄
|
osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄
|
||||||
|
osThreadId tca6416_taskHandle; // 添加TCA6416任务句柄
|
||||||
|
|
||||||
// 添加调试变量
|
// 添加调试变量
|
||||||
static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值
|
static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值
|
||||||
|
@ -87,6 +89,12 @@ volatile uint32_t rts_pin_mode = 0; // RTS引脚模式
|
||||||
volatile uint32_t rts_pin_speed = 0; // RTS引脚速度
|
volatile uint32_t rts_pin_speed = 0; // RTS引脚速度
|
||||||
volatile uint32_t rts_pin_alternate = 0; // RTS引脚复用功能
|
volatile uint32_t rts_pin_alternate = 0; // RTS引脚复用功能
|
||||||
|
|
||||||
|
// 添加全局变量用于存储TCA6416引脚状态
|
||||||
|
static volatile uint8_t tca6416_port0_status = 0; // 第一个TCA6416的Port0状态
|
||||||
|
static volatile uint8_t tca6416_port1_status = 0; // 第一个TCA6416的Port1状态
|
||||||
|
static volatile uint8_t tca6416_port2_status = 0; // 第二个TCA6416的Port0状态
|
||||||
|
static volatile uint8_t tca6416_port3_status = 0; // 第二个TCA6416的Port1状态
|
||||||
|
|
||||||
/* USER CODE END Variables */
|
/* USER CODE END Variables */
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
@ -103,6 +111,7 @@ extern struct tcp_pcb *server_pcb_control;
|
||||||
|
|
||||||
extern void tcp_abort(struct tcp_pcb *pcb);
|
extern void tcp_abort(struct tcp_pcb *pcb);
|
||||||
void start_usart6_test_task(void const *argument); // 添加USART6测试任务函数声明
|
void start_usart6_test_task(void const *argument); // 添加USART6测试任务函数声明
|
||||||
|
void start_tca6416_task(void const *argument); // 添加TCA6416任务函数声明
|
||||||
/* USER CODE END FunctionPrototypes */
|
/* USER CODE END FunctionPrototypes */
|
||||||
|
|
||||||
void start_tcp_task(void const *argument);
|
void start_tcp_task(void const *argument);
|
||||||
|
@ -197,6 +206,10 @@ void MX_FREERTOS_Init(void)
|
||||||
osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
|
osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
|
||||||
usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
|
usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
|
||||||
|
|
||||||
|
/* TCA6416任务 */
|
||||||
|
osThreadDef(tca6416_task, start_tca6416_task, osPriorityNormal, 0, 128);
|
||||||
|
tca6416_taskHandle = osThreadCreate(osThread(tca6416_task), NULL);
|
||||||
|
|
||||||
/* USER CODE BEGIN RTOS_THREADS */
|
/* USER CODE BEGIN RTOS_THREADS */
|
||||||
/* add threads, ... */
|
/* add threads, ... */
|
||||||
/* USER CODE END RTOS_THREADS */
|
/* USER CODE END RTOS_THREADS */
|
||||||
|
@ -546,3 +559,73 @@ void start_usart6_dma_test_task(void const *argument)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Header_start_tca6416_task */
|
||||||
|
/**
|
||||||
|
* @brief Function implementing the tca6416_task thread.
|
||||||
|
* @param argument: Not used
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header_start_tca6416_task */
|
||||||
|
void start_tca6416_task(void const *argument)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN start_tca6416_task */
|
||||||
|
uint8_t port0_data = 0;
|
||||||
|
uint8_t port1_data = 0;
|
||||||
|
uint8_t port2_data = 0;
|
||||||
|
uint8_t port3_data = 0;
|
||||||
|
|
||||||
|
// 初始化第一个TCA6416
|
||||||
|
if(TCA6416_Init() != 0)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 配置第一个TCA6416端口方向
|
||||||
|
// Port0: 全输入
|
||||||
|
TCA6416_SetPortDirection(0, 0xFF); // 0xFF = 11111111b
|
||||||
|
// Port1: 全输入
|
||||||
|
TCA6416_SetPortDirection(1, 0xFF); // 0xFF = 11111111b
|
||||||
|
|
||||||
|
// 初始化第二个TCA6416 (使用SCL_PIN2和SDA_PIN2)
|
||||||
|
// 注意:这里需要修改TCA6416_Init函数以支持第二个芯片
|
||||||
|
// 暂时使用相同的初始化函数,但实际使用时需要修改
|
||||||
|
|
||||||
|
// 配置第二个TCA6416端口方向
|
||||||
|
// Port0: 全输入
|
||||||
|
TCA6416_SetPortDirection(0, 0xFF); // 0xFF = 11111111b
|
||||||
|
// Port1: 全输入
|
||||||
|
TCA6416_SetPortDirection(1, 0xFF); // 0xFF = 11111111b
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
// 读取第一个TCA6416的输入端口状态
|
||||||
|
if(TCA6416_ReadPort(0, &port0_data) == 0)
|
||||||
|
{
|
||||||
|
tca6416_port0_status = port0_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TCA6416_ReadPort(1, &port1_data) == 0)
|
||||||
|
{
|
||||||
|
tca6416_port1_status = port1_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取第二个TCA6416的输入端口状态
|
||||||
|
// 注意:这里需要修改TCA6416_ReadPort函数以支持第二个芯片
|
||||||
|
// 暂时使用相同的读取函数,但实际使用时需要修改
|
||||||
|
if(TCA6416_ReadPort(0, &port2_data) == 0)
|
||||||
|
{
|
||||||
|
tca6416_port2_status = port2_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TCA6416_ReadPort(1, &port3_data) == 0)
|
||||||
|
{
|
||||||
|
tca6416_port3_status = port3_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 任务延时
|
||||||
|
vTaskDelay(10); // 10ms延时
|
||||||
|
}
|
||||||
|
/* USER CODE END start_tca6416_task */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1976,6 +1976,18 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>11</GroupNumber>
|
||||||
|
<FileNumber>132</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\User\application\src\TCA6416.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>TCA6416.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
|
@ -1986,7 +1998,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>132</FileNumber>
|
<FileNumber>133</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -1998,7 +2010,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>133</FileNumber>
|
<FileNumber>134</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2010,7 +2022,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>134</FileNumber>
|
<FileNumber>135</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2022,7 +2034,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>135</FileNumber>
|
<FileNumber>136</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2034,7 +2046,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>136</FileNumber>
|
<FileNumber>137</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2054,7 +2066,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>13</GroupNumber>
|
<GroupNumber>13</GroupNumber>
|
||||||
<FileNumber>137</FileNumber>
|
<FileNumber>138</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2066,7 +2078,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>13</GroupNumber>
|
<GroupNumber>13</GroupNumber>
|
||||||
<FileNumber>138</FileNumber>
|
<FileNumber>139</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -2078,7 +2090,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>13</GroupNumber>
|
<GroupNumber>13</GroupNumber>
|
||||||
<FileNumber>139</FileNumber>
|
<FileNumber>140</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
|
|
@ -1088,6 +1088,11 @@
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\User\application\src\ad7124_test.c</FilePath>
|
<FilePath>..\User\application\src\ad7124_test.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>TCA6416.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\User\application\src\TCA6416.c</FilePath>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
|
|
Binary file not shown.
|
@ -1,7 +1,18 @@
|
||||||
#ifndef __TCA6416_H
|
#ifndef __TCA6416_H
|
||||||
#define __TCA6416_H
|
#define __TCA6416_H
|
||||||
|
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f4xx_hal.h" // 只包含基本的 HAL 头文件
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* GPIO定义 */
|
||||||
|
#define TCA6416_SCL_PIN GPIO_PIN_2
|
||||||
|
#define TCA6416_SCL_PORT GPIOE
|
||||||
|
#define TCA6416_SDA_PIN GPIO_PIN_3
|
||||||
|
#define TCA6416_SDA_PORT GPIOE
|
||||||
|
#define TCA6416_SCL_PIN2 GPIO_PIN_5
|
||||||
|
#define TCA6416_SCL_PORT2 GPIOE
|
||||||
|
#define TCA6416_SDA_PIN2 GPIO_PIN_4
|
||||||
|
#define TCA6416_SDA_PORT2 GPIOE
|
||||||
|
|
||||||
/* TCA6416 I2C地址 */
|
/* TCA6416 I2C地址 */
|
||||||
#define TCA6416_ADDR 0x20 // 基础地址 (A0=A1=A2=GND)
|
#define TCA6416_ADDR 0x20 // 基础地址 (A0=A1=A2=GND)
|
||||||
|
@ -16,13 +27,33 @@
|
||||||
#define TCA6416_POL_INV_PORT0 0x04 // 极性反转端口0
|
#define TCA6416_POL_INV_PORT0 0x04 // 极性反转端口0
|
||||||
#define TCA6416_POL_INV_PORT1 0x05 // 极性反转端口1
|
#define TCA6416_POL_INV_PORT1 0x05 // 极性反转端口1
|
||||||
|
|
||||||
|
/* 软件I2C延时定义 */
|
||||||
|
#define I2C_DELAY() HAL_Delay(1) // 可以根据实际需要调整延时
|
||||||
|
|
||||||
|
/* 软件I2C基本操作函数 */
|
||||||
|
#define SCL_HIGH() HAL_GPIO_WritePin(TCA6416_SCL_PORT, TCA6416_SCL_PIN, GPIO_PIN_SET)
|
||||||
|
#define SCL_LOW() HAL_GPIO_WritePin(TCA6416_SCL_PORT, TCA6416_SCL_PIN, GPIO_PIN_RESET)
|
||||||
|
#define SDA_HIGH() HAL_GPIO_WritePin(TCA6416_SDA_PORT, TCA6416_SDA_PIN, GPIO_PIN_SET)
|
||||||
|
#define SDA_LOW() HAL_GPIO_WritePin(TCA6416_SDA_PORT, TCA6416_SDA_PIN, GPIO_PIN_RESET)
|
||||||
|
#define SDA_READ() HAL_GPIO_ReadPin(TCA6416_SDA_PORT, TCA6416_SDA_PIN)
|
||||||
|
|
||||||
/* 函数声明 */
|
/* 函数声明 */
|
||||||
HAL_StatusTypeDef TCA6416_Init(I2C_HandleTypeDef *hi2c);
|
void TCA6416_GPIO_Init(void);
|
||||||
HAL_StatusTypeDef TCA6416_WritePort(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t data);
|
uint8_t TCA6416_Init(void);
|
||||||
HAL_StatusTypeDef TCA6416_ReadPort(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t *data);
|
uint8_t TCA6416_WritePort(uint8_t port, uint8_t data);
|
||||||
HAL_StatusTypeDef TCA6416_SetPortDirection(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t direction);
|
uint8_t TCA6416_ReadPort(uint8_t port, uint8_t *data);
|
||||||
HAL_StatusTypeDef TCA6416_SetPortPolarity(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t polarity);
|
uint8_t TCA6416_SetPortDirection(uint8_t port, uint8_t direction);
|
||||||
HAL_StatusTypeDef TCA6416_WritePin(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t pin, uint8_t state);
|
uint8_t TCA6416_SetPortPolarity(uint8_t port, uint8_t polarity);
|
||||||
HAL_StatusTypeDef TCA6416_ReadPin(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t pin, uint8_t *state);
|
uint8_t TCA6416_WritePin(uint8_t port, uint8_t pin, uint8_t state);
|
||||||
|
uint8_t TCA6416_ReadPin(uint8_t port, uint8_t pin, uint8_t *state);
|
||||||
|
|
||||||
|
/* 软件I2C底层函数 */
|
||||||
|
void I2C_Start(void);
|
||||||
|
void I2C_Stop(void);
|
||||||
|
void I2C_Ack(void);
|
||||||
|
void I2C_NAck(void);
|
||||||
|
uint8_t I2C_WaitAck(void);
|
||||||
|
void I2C_SendByte(uint8_t byte);
|
||||||
|
uint8_t I2C_ReadByte(void);
|
||||||
|
|
||||||
#endif /* __TCA6416_H */
|
#endif /* __TCA6416_H */
|
||||||
|
|
|
@ -1,133 +1,308 @@
|
||||||
#include "TCA6416.h"
|
#include "TCA6416.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 初始化TCA6416
|
* @brief 初始化TCA6416的GPIO
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @retval HAL状态
|
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_Init(I2C_HandleTypeDef *hi2c)
|
void TCA6416_GPIO_Init(void)
|
||||||
{
|
{
|
||||||
HAL_StatusTypeDef status;
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||||
|
|
||||||
|
// 使能GPIOE时钟
|
||||||
|
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||||
|
|
||||||
|
// 配置SCL和SDA引脚
|
||||||
|
GPIO_InitStruct.Pin = TCA6416_SCL_PIN | TCA6416_SDA_PIN;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(TCA6416_SCL_PORT, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
// 初始状态设为高电平
|
||||||
|
SCL_HIGH();
|
||||||
|
SDA_HIGH();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C起始信号
|
||||||
|
*/
|
||||||
|
void I2C_Start(void)
|
||||||
|
{
|
||||||
|
SDA_HIGH();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SDA_LOW();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C停止信号
|
||||||
|
*/
|
||||||
|
void I2C_Stop(void)
|
||||||
|
{
|
||||||
|
SCL_LOW();
|
||||||
|
SDA_LOW();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SDA_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C发送应答
|
||||||
|
*/
|
||||||
|
void I2C_Ack(void)
|
||||||
|
{
|
||||||
|
SCL_LOW();
|
||||||
|
SDA_LOW();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C发送非应答
|
||||||
|
*/
|
||||||
|
void I2C_NAck(void)
|
||||||
|
{
|
||||||
|
SCL_LOW();
|
||||||
|
SDA_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C等待应答
|
||||||
|
* @retval 0:有应答 1:无应答
|
||||||
|
*/
|
||||||
|
uint8_t I2C_WaitAck(void)
|
||||||
|
{
|
||||||
|
uint8_t ack;
|
||||||
|
|
||||||
|
SCL_LOW();
|
||||||
|
SDA_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
|
||||||
|
ack = SDA_READ() ? 1 : 0;
|
||||||
|
|
||||||
|
SCL_LOW();
|
||||||
|
return ack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C发送一个字节
|
||||||
|
* @param byte: 要发送的字节
|
||||||
|
*/
|
||||||
|
void I2C_SendByte(uint8_t byte)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
SCL_LOW();
|
||||||
|
if(byte & 0x80)
|
||||||
|
SDA_HIGH();
|
||||||
|
else
|
||||||
|
SDA_LOW();
|
||||||
|
byte <<= 1;
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
I2C_DELAY();
|
||||||
|
}
|
||||||
|
SCL_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 软件I2C读取一个字节
|
||||||
|
* @retval 读取到的字节
|
||||||
|
*/
|
||||||
|
uint8_t I2C_ReadByte(void)
|
||||||
|
{
|
||||||
|
uint8_t i, byte = 0;
|
||||||
|
|
||||||
|
SDA_HIGH();
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
SCL_LOW();
|
||||||
|
I2C_DELAY();
|
||||||
|
SCL_HIGH();
|
||||||
|
byte <<= 1;
|
||||||
|
if(SDA_READ())
|
||||||
|
byte |= 0x01;
|
||||||
|
I2C_DELAY();
|
||||||
|
}
|
||||||
|
SCL_LOW();
|
||||||
|
return byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化TCA6416
|
||||||
|
* @retval 0:成功 1:失败
|
||||||
|
*/
|
||||||
|
uint8_t TCA6416_Init(void)
|
||||||
|
{
|
||||||
|
// 初始化GPIO
|
||||||
|
TCA6416_GPIO_Init();
|
||||||
|
|
||||||
// 默认将所有引脚设置为输入
|
// 默认将所有引脚设置为输入
|
||||||
status = TCA6416_SetPortDirection(hi2c, 0, 0xFF);
|
if(TCA6416_SetPortDirection(0, 0xFF) != 0) return 1;
|
||||||
if (status != HAL_OK) return status;
|
if(TCA6416_SetPortDirection(1, 0xFF) != 0) return 1;
|
||||||
|
|
||||||
status = TCA6416_SetPortDirection(hi2c, 1, 0xFF);
|
|
||||||
if (status != HAL_OK) return status;
|
|
||||||
|
|
||||||
// 设置默认输出值为0
|
// 设置默认输出值为0
|
||||||
status = TCA6416_WritePort(hi2c, 0, 0x00);
|
if(TCA6416_WritePort(0, 0x00) != 0) return 1;
|
||||||
if (status != HAL_OK) return status;
|
if(TCA6416_WritePort(1, 0x00) != 0) return 1;
|
||||||
|
|
||||||
status = TCA6416_WritePort(hi2c, 1, 0x00);
|
|
||||||
if (status != HAL_OK) return status;
|
|
||||||
|
|
||||||
// 设置默认极性(非反转)
|
// 设置默认极性(非反转)
|
||||||
status = TCA6416_SetPortPolarity(hi2c, 0, 0x00);
|
if(TCA6416_SetPortPolarity(0, 0x00) != 0) return 1;
|
||||||
if (status != HAL_OK) return status;
|
if(TCA6416_SetPortPolarity(1, 0x00) != 0) return 1;
|
||||||
|
|
||||||
status = TCA6416_SetPortPolarity(hi2c, 1, 0x00);
|
return 0;
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 向端口写入数据
|
* @brief 向端口写入数据
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param data: 要写入的数据
|
* @param data: 要写入的数据
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_WritePort(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t data)
|
uint8_t TCA6416_WritePort(uint8_t port, uint8_t data)
|
||||||
{
|
{
|
||||||
uint8_t reg_addr = (port == 0) ? TCA6416_OUTPUT_PORT0 : TCA6416_OUTPUT_PORT1;
|
uint8_t reg_addr = (port == 0) ? TCA6416_OUTPUT_PORT0 : TCA6416_OUTPUT_PORT1;
|
||||||
return HAL_I2C_Mem_Write(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
|
|
||||||
|
I2C_Start();
|
||||||
|
I2C_SendByte(TCA6416_ADDR << 1); // 写地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(reg_addr); // 寄存器地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(data); // 数据
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_Stop();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 从端口读取数据
|
* @brief 从端口读取数据
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param data: 存储读取数据的指针
|
* @param data: 存储读取数据的指针
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_ReadPort(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t *data)
|
uint8_t TCA6416_ReadPort(uint8_t port, uint8_t *data)
|
||||||
{
|
{
|
||||||
uint8_t reg_addr = (port == 0) ? TCA6416_INPUT_PORT0 : TCA6416_INPUT_PORT1;
|
uint8_t reg_addr = (port == 0) ? TCA6416_INPUT_PORT0 : TCA6416_INPUT_PORT1;
|
||||||
return HAL_I2C_Mem_Read(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, data, 1, HAL_MAX_DELAY);
|
|
||||||
|
I2C_Start();
|
||||||
|
I2C_SendByte(TCA6416_ADDR << 1); // 写地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(reg_addr); // 寄存器地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_Start();
|
||||||
|
I2C_SendByte((TCA6416_ADDR << 1) | 0x01); // 读地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
*data = I2C_ReadByte(); // 读取数据
|
||||||
|
I2C_NAck();
|
||||||
|
|
||||||
|
I2C_Stop();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 设置端口方向(输入/输出)
|
* @brief 设置端口方向(输入/输出)
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param direction: 0 = 输出, 1 = 输入
|
* @param direction: 0 = 输出, 1 = 输入
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_SetPortDirection(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t direction)
|
uint8_t TCA6416_SetPortDirection(uint8_t port, uint8_t direction)
|
||||||
{
|
{
|
||||||
uint8_t reg_addr = (port == 0) ? TCA6416_CONFIG_PORT0 : TCA6416_CONFIG_PORT1;
|
uint8_t reg_addr = (port == 0) ? TCA6416_CONFIG_PORT0 : TCA6416_CONFIG_PORT1;
|
||||||
return HAL_I2C_Mem_Write(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, &direction, 1, HAL_MAX_DELAY);
|
|
||||||
|
I2C_Start();
|
||||||
|
I2C_SendByte(TCA6416_ADDR << 1); // 写地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(reg_addr); // 寄存器地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(direction); // 方向设置
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_Stop();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 设置端口极性
|
* @brief 设置端口极性
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param polarity: 0 = 非反转, 1 = 反转
|
* @param polarity: 0 = 非反转, 1 = 反转
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_SetPortPolarity(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t polarity)
|
uint8_t TCA6416_SetPortPolarity(uint8_t port, uint8_t polarity)
|
||||||
{
|
{
|
||||||
uint8_t reg_addr = (port == 0) ? TCA6416_POL_INV_PORT0 : TCA6416_POL_INV_PORT1;
|
uint8_t reg_addr = (port == 0) ? TCA6416_POL_INV_PORT0 : TCA6416_POL_INV_PORT1;
|
||||||
return HAL_I2C_Mem_Write(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, &polarity, 1, HAL_MAX_DELAY);
|
|
||||||
|
I2C_Start();
|
||||||
|
I2C_SendByte(TCA6416_ADDR << 1); // 写地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(reg_addr); // 寄存器地址
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_SendByte(polarity); // 极性设置
|
||||||
|
if(I2C_WaitAck()) { I2C_Stop(); return 1; }
|
||||||
|
|
||||||
|
I2C_Stop();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 写入单个引脚
|
* @brief 写入单个引脚
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param pin: 引脚号(0-7)
|
* @param pin: 引脚号(0-7)
|
||||||
* @param state: 引脚状态(0或1)
|
* @param state: 引脚状态(0或1)
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_WritePin(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t pin, uint8_t state)
|
uint8_t TCA6416_WritePin(uint8_t port, uint8_t pin, uint8_t state)
|
||||||
{
|
{
|
||||||
HAL_StatusTypeDef status;
|
|
||||||
uint8_t current_data;
|
uint8_t current_data;
|
||||||
uint8_t reg_addr = (port == 0) ? TCA6416_OUTPUT_PORT0 : TCA6416_OUTPUT_PORT1;
|
uint8_t reg_addr = (port == 0) ? TCA6416_OUTPUT_PORT0 : TCA6416_OUTPUT_PORT1;
|
||||||
|
|
||||||
// 读取当前端口值
|
// 读取当前端口值
|
||||||
status = HAL_I2C_Mem_Read(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, ¤t_data, 1, HAL_MAX_DELAY);
|
if(TCA6416_ReadPort(port, ¤t_data) != 0) return 1;
|
||||||
if (status != HAL_OK) return status;
|
|
||||||
|
|
||||||
// 修改特定引脚
|
// 修改特定引脚
|
||||||
if (state)
|
if(state)
|
||||||
current_data |= (1 << pin);
|
current_data |= (1 << pin);
|
||||||
else
|
else
|
||||||
current_data &= ~(1 << pin);
|
current_data &= ~(1 << pin);
|
||||||
|
|
||||||
// 写回修改后的值
|
// 写回修改后的值
|
||||||
return HAL_I2C_Mem_Write(hi2c, TCA6416_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, ¤t_data, 1, HAL_MAX_DELAY);
|
return TCA6416_WritePort(port, current_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 读取单个引脚
|
* @brief 读取单个引脚
|
||||||
* @param hi2c: I2C句柄指针
|
|
||||||
* @param port: 端口号(0或1)
|
* @param port: 端口号(0或1)
|
||||||
* @param pin: 引脚号(0-7)
|
* @param pin: 引脚号(0-7)
|
||||||
* @param state: 存储引脚状态的指针
|
* @param state: 存储引脚状态的指针
|
||||||
* @retval HAL状态
|
* @retval 0:成功 1:失败
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef TCA6416_ReadPin(I2C_HandleTypeDef *hi2c, uint8_t port, uint8_t pin, uint8_t *state)
|
uint8_t TCA6416_ReadPin(uint8_t port, uint8_t pin, uint8_t *state)
|
||||||
{
|
{
|
||||||
HAL_StatusTypeDef status;
|
|
||||||
uint8_t port_data;
|
uint8_t port_data;
|
||||||
|
|
||||||
status = TCA6416_ReadPort(hi2c, port, &port_data);
|
if(TCA6416_ReadPort(port, &port_data) != 0) return 1;
|
||||||
if (status != HAL_OK) return status;
|
|
||||||
|
|
||||||
*state = (port_data >> pin) & 0x01;
|
*state = (port_data >> pin) & 0x01;
|
||||||
return HAL_OK;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,12 @@ uint8_t adc_set_data[22] = {
|
||||||
0x0D,0xF0,// 比例阀2输出高字节, 比例阀2输出低字节
|
0x0D,0xF0,// 比例阀2输出高字节, 比例阀2输出低字节
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 添加外部声明
|
||||||
|
extern volatile uint8_t tca6416_port0_status;
|
||||||
|
extern volatile uint8_t tca6416_port1_status;
|
||||||
|
extern volatile uint8_t tca6416_port2_status;
|
||||||
|
extern volatile uint8_t tca6416_port3_status;
|
||||||
|
|
||||||
// 校验和函数
|
// 校验和函数
|
||||||
uint8_t calc_checksum(const uint8_t *data, uint8_t start, uint8_t end) {
|
uint8_t calc_checksum(const uint8_t *data, uint8_t start, uint8_t end) {
|
||||||
uint8_t checksum = 0;
|
uint8_t checksum = 0;
|
||||||
|
@ -378,7 +384,6 @@ uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 22 + 2; // 帧头+帧长+源+目标+类
|
||||||
uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx)
|
uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx)
|
||||||
{
|
{
|
||||||
uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类型+74字节输出读取+校验
|
uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类型+74字节输出读取+校验
|
||||||
// 1. 读取ID寄存器
|
|
||||||
|
|
||||||
// 帧头
|
// 帧头
|
||||||
tx[0] = head_00;
|
tx[0] = head_00;
|
||||||
|
@ -399,21 +404,27 @@ uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx)
|
||||||
// 报文类型
|
// 报文类型
|
||||||
tx[8] = reply_type;
|
tx[8] = reply_type;
|
||||||
|
|
||||||
tx[9] = 0x00; //io通道0-15
|
// 填充TCA6416引脚状态到第9-10字节
|
||||||
tx[10] = 0x00; //io通道0-15
|
tx[9] = tca6416_port0_status; // 第一个TCA6416的Port0状态
|
||||||
// 填充AD7124原始数据到tx[11]~tx[75],每通道4字节,MSB格式
|
tx[10] = tca6416_port1_status; // 第一个TCA6416的Port1状态
|
||||||
|
tx[11] = tca6416_port2_status; // 第二个TCA6416的Port0状态
|
||||||
|
tx[12] = tca6416_port3_status; // 第二个TCA6416的Port1状态
|
||||||
|
|
||||||
|
// 填充AD7124原始数据到tx[13]~tx[77],每通道4字节,MSB格式
|
||||||
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
|
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
|
||||||
for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) {
|
for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) {
|
||||||
int32_t data = ad7124_analog[ch].data;
|
int32_t data = ad7124_analog[ch].data;
|
||||||
tx[11 + ch * 4 + 0] = (data >> 24) & 0xFF;
|
tx[13 + ch * 4 + 0] = (data >> 24) & 0xFF;
|
||||||
tx[11 + ch * 4 + 1] = (data >> 16) & 0xFF;
|
tx[13 + ch * 4 + 1] = (data >> 16) & 0xFF;
|
||||||
tx[11 + ch * 4 + 2] = (data >> 8) & 0xFF;
|
tx[13 + ch * 4 + 2] = (data >> 8) & 0xFF;
|
||||||
tx[11 + ch * 4 + 3] = (data) & 0xFF;
|
tx[13 + ch * 4 + 3] = (data) & 0xFF;
|
||||||
}
|
}
|
||||||
// 其余tx[73]~tx[82]可按需要填充(如比例阀等),此处保持原样或补零
|
|
||||||
for (int i = 11 + AD7124_CHANNEL_EN_MAX * 4; i < 83; ++i) {
|
// 其余tx[77]~tx[83]可按需要填充(如比例阀等),此处保持原样或补零
|
||||||
|
for (int i = 13 + AD7124_CHANNEL_EN_MAX * 4; i < 83; ++i) {
|
||||||
tx[i] = 0;
|
tx[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 校验和
|
// 校验和
|
||||||
uint16_t checksum = 0;
|
uint16_t checksum = 0;
|
||||||
for (int i = 4; i < 84; ++i) // 4~83(源地址+目标地址+类型+74字节)
|
for (int i = 4; i < 84; ++i) // 4~83(源地址+目标地址+类型+74字节)
|
||||||
|
|
Loading…
Reference in New Issue