TCP可以正常使用

This commit is contained in:
2026-07-19 00:59:56 +08:00
parent fe107ea9af
commit f72d08328f
24 changed files with 5505 additions and 352 deletions

View File

@@ -33,6 +33,8 @@
#include "tpafe5160.h"
#include "sd2506.h"
#include "rs485.h"
#include "net_socket.h"
#include "net_select.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -47,7 +49,10 @@
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define TS() do { \
uint32_t _t = HAL_GetTick(); \
printf("[%lu.%03lu] ", _t / 1000UL, _t % 1000UL); \
} while(0)
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
@@ -57,6 +62,9 @@
rs485_handle_t g_rs485;
#define RS485_RX_BUF_SIZE 256
uint8_t g_rs485_rx_buf[RS485_RX_BUF_SIZE];
/* TCP Server Echo 测试 */
static int s_listen_sock = -1;
static uint8_t s_echo_buf[1500];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@@ -110,49 +118,29 @@ int main(void)
/* USER CODE BEGIN 2 */
HAL_Delay(100);
/* CH395F 硬件检测 */
ch395f_status_t ch395f_ret = ch395f_check_exist();
printf("[CH395F] SPI: %s\r\n",
(ch395f_ret == CH395F_STATUS_OK) ? "OK" : "FAIL");
/* BSD Socket API 初始化(包含 CH395F 复位/配置/协议栈初始化/多连接模式) */
printf("[NET] init: %s\r\n",
(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) ? "OK" : "FAIL");
printf("[CH395F] version: 0x%02X\r\n", ch395f_get_version());
/* 读取 MAC */
uint8_t mac[6];
ch395f_get_mac_addr(mac);
printf("[CH395F] MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
if (ch395f_ret == CH395F_STATUS_OK) {
/* 1. 复位 */
ch395f_reset();
/* 2. 配置网络参数(必须在 INIT 之前INIT 会锁定协议栈参数) */
uint8_t ip[4] = {192, 168, 1, 100};
uint8_t gw[4] = {192, 168, 1, 1};
uint8_t mask[4] = {255, 255, 255, 0};
ch395f_set_ip_addr(ip);
ch395f_set_gwip_addr(gw);
ch395f_set_mask_addr(mask);
/* 3. 初始化协议栈(锁定 IP/GW/MASK 等参数) */
printf("[CH395F] init: %s\r\n",
(ch395f_init() == CH395F_STATUS_OK) ? "OK" : "FAIL");
/* 4. 读取 MAC */
uint8_t mac[6];
ch395f_get_mac_addr(mac);
printf("[CH395F] MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
/* 5. 强制 100M 全双工,建立 PHY 链路 */
ch395f_set_phy(CH395F_PHY_100M_FULL);
HAL_Delay(3000);
uint8_t phy = ch395f_get_phy_status();
const char *phy_str = "UNKNOWN";
switch (phy) {
case CH395F_PHY_DISCONN: phy_str = "DISCONNECT"; break;
case CH395F_PHY_10M_FULL: phy_str = "10M FULL"; break;
case CH395F_PHY_10M_HALF: phy_str = "10M HALF"; break;
case CH395F_PHY_100M_FULL: phy_str = "100M FULL"; break;
case CH395F_PHY_100M_HALF: phy_str = "100M HALF"; break;
}
printf("[CH395F] PHY: %s\r\n", phy_str);
/* 强制 100M 全双工,建立 PHY 链路 */
ch395f_set_phy(CH395F_PHY_100M_FULL);
HAL_Delay(3000);
uint8_t phy = ch395f_get_phy_status();
const char *phy_str = "UNKNOWN";
switch (phy) {
case CH395F_PHY_DISCONN: phy_str = "DISCONNECT"; break;
case CH395F_PHY_10M_FULL: phy_str = "10M FULL"; break;
case CH395F_PHY_10M_HALF: phy_str = "10M HALF"; break;
case CH395F_PHY_100M_FULL: phy_str = "100M FULL"; break;
case CH395F_PHY_100M_HALF: phy_str = "100M HALF"; break;
}
printf("[CH395F] PHY: %s\r\n", phy_str);
/* GD5F 初始化测试 */
int ret = gd5f2gq5ue_init();
@@ -213,6 +201,30 @@ int main(void)
/* 启动第一次 RS-485 接收 */
rs485_receive_start(&g_rs485, g_rs485_rx_buf, RS485_RX_BUF_SIZE);
/* 创建 TCP Server Echo 测试 */
{
s_listen_sock = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
printf("[NET] TCP listen socket: %d\r\n", s_listen_sock);
struct net_sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = NET_AF_INET;
serv_addr.sin_port = net_htons(8080);
serv_addr.sin_addr.s_addr = NET_INADDR_ANY;
if (net_bind(s_listen_sock, (struct net_sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
printf("[NET] TCP bind: OK (port 8080)\r\n");
} else {
printf("[NET] TCP bind: FAIL\r\n");
}
if (net_listen(s_listen_sock, NET_TCP_SERVER_MAX_CLIENTS) == 0) {
printf("[NET] TCP listen: OK (max_clients=%d)\r\n", NET_TCP_SERVER_MAX_CLIENTS);
} else {
printf("[NET] TCP listen: FAIL\r\n");
}
}
/* 启动第一次转换CubeMX 已配置 BUSY EXTI 中断) */
tpafe5160_start_conv_irq();
/* USER CODE END 2 */
@@ -224,22 +236,47 @@ int main(void)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* TPAFE5160 中断模式读取 */
if (tpafe5160_data_ready()) {
const int16_t *buf = tpafe5160_get_buf();
printf("[TPAFE5160] CH:");
for (int i = 0; i < 8; i++) {
printf(" %d", buf[i]);
/* 网络轮询(必须在主循环中调用) */
net_poll();
/* TCP Server Echo 处理 —— 多连接模式socket 0 监听socket 1~7 收发 */
{
int i;
for (i = NET_TCP_SERVER_DATA_SOCK_START; i < NET_MAX_SOCKETS; i++)
{
net_sock_t *sk = net_get_sock(i);
if (sk == NULL || !sk->in_use || sk->state != NET_SOCK_STATE_ESTABLISHED)
{
continue;
}
uint16_t rlen = ch395f_get_recv_len((uint8_t)i);
if (rlen > 0) {
uint16_t read_len = (rlen > sizeof(s_echo_buf)) ? sizeof(s_echo_buf) : rlen;
ch395f_read_recv_buf((uint8_t)i, s_echo_buf, read_len);
TS(); printf("[NET] recv sock%d: %d bytes\r\n", i, read_len);
ch395f_write_send_buf((uint8_t)i, s_echo_buf, read_len);
TS(); printf("[NET] send sock%d: %d bytes\r\n", i, read_len);
}
}
printf("\r\n");
tpafe5160_clear_ready();
/* 启动下一次转换 */
tpafe5160_start_conv_irq();
}
// /* TPAFE5160 中断模式读取 */
// if (tpafe5160_data_ready()) {
// const int16_t *buf = tpafe5160_get_buf();
// printf("[TPAFE5160] CH:");
// for (int i = 0; i < 8; i++) {
// printf(" %d", buf[i]);
// }
// printf("\r\n");
// tpafe5160_clear_ready();
// /* 启动下一次转换 */
// tpafe5160_start_conv_irq();
// }
/* 其他任务 */
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
HAL_Delay(500);
// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
// HAL_Delay(10);
}
/* USER CODE END 3 */
}