TCP可以正常使用
This commit is contained in:
@@ -41,8 +41,15 @@ void MX_DMA_Init(void)
|
||||
|
||||
/* DMA controller clock enable */
|
||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
|
||||
/* DMA1_Stream4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 1, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);
|
||||
/* DMA2_Stream2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 3, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
||||
|
||||
@@ -45,6 +45,7 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* GPIO Ports Clock Enable */
|
||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOH_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
@@ -52,7 +53,6 @@ void MX_GPIO_Init(void)
|
||||
__HAL_RCC_GPIOG_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin, GPIO_PIN_SET);
|
||||
@@ -75,6 +75,12 @@ void MX_GPIO_Init(void)
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOE, GD_CS_Pin|GD_HOLD_Pin, GPIO_PIN_SET);
|
||||
|
||||
/*Configure GPIO pin : CH395_INT_Pin */
|
||||
GPIO_InitStruct.Pin = CH395_INT_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(CH395_INT_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : LED1_Pin LED2_Pin */
|
||||
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
|
||||
143
Src/main.c
143
Src/main.c
@@ -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 */
|
||||
}
|
||||
|
||||
52
Src/spi.c
52
Src/spi.c
@@ -26,6 +26,8 @@
|
||||
|
||||
SPI_HandleTypeDef hspi1;
|
||||
SPI_HandleTypeDef hspi2;
|
||||
DMA_HandleTypeDef hdma_spi2_rx;
|
||||
DMA_HandleTypeDef hdma_spi2_tx;
|
||||
|
||||
/* SPI1 init function */
|
||||
void MX_SPI1_Init(void)
|
||||
@@ -45,7 +47,7 @@ void MX_SPI1_Init(void)
|
||||
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
|
||||
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
|
||||
hspi1.Init.NSS = SPI_NSS_SOFT;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
@@ -77,7 +79,7 @@ void MX_SPI2_Init(void)
|
||||
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
|
||||
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
|
||||
hspi2.Init.NSS = SPI_NSS_SOFT;
|
||||
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
|
||||
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
@@ -149,6 +151,46 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
|
||||
HAL_GPIO_Init(CH395F_SDO_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* SPI2 DMA Init */
|
||||
/* SPI2_RX Init */
|
||||
hdma_spi2_rx.Instance = DMA1_Stream3;
|
||||
hdma_spi2_rx.Init.Channel = DMA_CHANNEL_0;
|
||||
hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi2_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi2_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||
hdma_spi2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_spi2_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi2_rx);
|
||||
|
||||
/* SPI2_TX Init */
|
||||
hdma_spi2_tx.Instance = DMA1_Stream4;
|
||||
hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0;
|
||||
hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi2_tx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi2_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||
hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi2_tx);
|
||||
|
||||
/* SPI2 interrupt Init */
|
||||
HAL_NVIC_SetPriority(SPI2_IRQn, 1, 0);
|
||||
HAL_NVIC_EnableIRQ(SPI2_IRQn);
|
||||
/* USER CODE BEGIN SPI2_MspInit 1 */
|
||||
|
||||
/* USER CODE END SPI2_MspInit 1 */
|
||||
@@ -192,6 +234,12 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, CH395F_SCK_Pin|CH395F_SDO_Pin|CH395F_SDOB15_Pin);
|
||||
|
||||
/* SPI2 DMA DeInit */
|
||||
HAL_DMA_DeInit(spiHandle->hdmarx);
|
||||
HAL_DMA_DeInit(spiHandle->hdmatx);
|
||||
|
||||
/* SPI2 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(SPI2_IRQn);
|
||||
/* USER CODE BEGIN SPI2_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END SPI2_MspDeInit 1 */
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern DMA_HandleTypeDef hdma_spi2_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_tx;
|
||||
extern SPI_HandleTypeDef hspi2;
|
||||
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
extern UART_HandleTypeDef huart4;
|
||||
@@ -204,6 +207,34 @@ void SysTick_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32f4xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream3 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream3_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream3_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi2_rx);
|
||||
/* USER CODE BEGIN DMA1_Stream3_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream4 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream4_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream4_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi2_tx);
|
||||
/* USER CODE BEGIN DMA1_Stream4_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line[9:5] interrupts.
|
||||
*/
|
||||
@@ -218,6 +249,20 @@ void EXTI9_5_IRQHandler(void)
|
||||
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SPI2 global interrupt.
|
||||
*/
|
||||
void SPI2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SPI2_IRQn 0 */
|
||||
|
||||
/* USER CODE END SPI2_IRQn 0 */
|
||||
HAL_SPI_IRQHandler(&hspi2);
|
||||
/* USER CODE BEGIN SPI2_IRQn 1 */
|
||||
|
||||
/* USER CODE END SPI2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles USART1 global interrupt.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user