1253 lines
35 KiB
C
1253 lines
35 KiB
C
/*
|
||
* 模å<C2A1>—å<E28094><C3A5>称:CH395F SPI Ethernet Protocol Stack Driver
|
||
* 模å<C2A1>—功能:CH395F 以太网å<E28098><C3A5>è®®æ ˆèŠ¯ç‰‡ SPI 驱动实现,æ<C592><C3A6>供芯片检测ã€<C3A3>åˆ<C3A5>始化ï¿? * 网络å<C593>‚æ•°é…<C3A9>ç½®ã€<C3A3>PHY 管ç<C2A1>†ã€<C3A3>DHCPã€<C3A3>Socket 管ç<C2A1>†å<E280A0>Šæ•°æ<C2B0>®æ”¶å<C2B6>‘功ï¿? * 适用平å<C2B3>°ï¼šSTM32F4 系列(SPI2 接å<C2A5>£ï¿? * 作者:王建ï¿? * 创建日期ï¿?026-03-14
|
||
* 修改记录ï¿? * 2026-03-14 王建ï¿? 创建åˆ<C3A5>始版本,按代ç <C3A7>规范é‡<C3A9>æž„
|
||
* 2026-07-18 王建ï¿? 改�?write_send_buf / read_recv_buf 使用 SPI2 DMA 批é‡<C3A9>ä¼ è¾“
|
||
*/
|
||
|
||
/* 头文件包å<E280A6>«åŒº - 先包å<E280A6>«ç³»ç»Ÿå¤´æ–‡ä»¶ï¼Œå†<C3A5>包å<E280A6>«æœ¬æ¨¡å<C2A1>—头文件 */
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
#include "ch395f.h"
|
||
#include "spi.h"
|
||
#include "usart.h"
|
||
|
||
/*
|
||
* 调试输出é…<C3A9>ç½®
|
||
*/
|
||
#define DBG_TAG "[CH395]"
|
||
#include "dbg_log.h"
|
||
|
||
/*
|
||
* ç§<C3A7>有å®<C3A5>定义区
|
||
*/
|
||
#define CH395F_CHECK_EXIST_TEST_DATA 0x57U /* 芯片检测测试å—ï¿?*/
|
||
#define CH395F_RESET_DELAY_MS 20U /* å¤<C3A5>ä½<C3A4>å<EFBFBD>Žç‰å¾…延时(msï¿?*/
|
||
#define CH395F_INIT_TIMEOUT_MS 500U /* åˆ<C3A5>始化超时时间(msï¿?*/
|
||
#define CH395F_SPI_BEGIN_DELAY_MS 1U /* SPI 事务开始延时(ms�*/
|
||
#define CH395F_DMA_BUF_SIZE 1500U /* DMA 缓冲区最大å—节数 */
|
||
|
||
/*
|
||
* ç§<C3A7>有å<E280B0>˜é‡<C3A9>ï¿?- DMA ä¼ è¾“ç›¸å…³
|
||
*/
|
||
static volatile uint8_t s_spi2_dma_done = 0U; /* DMA ä¼ è¾“å®Œæˆ<C3A6>æ ‡å¿— */
|
||
|
||
__attribute__((aligned(4)))
|
||
static uint8_t s_spi2_dma_tx_buf[CH395F_DMA_BUF_SIZE]; /* DMA å<>‘é€<C3A9>缓冲区 */
|
||
__attribute__((aligned(4)))
|
||
static uint8_t s_spi2_dma_rx_buf[CH395F_DMA_BUF_SIZE]; /* DMA 接收缓冲�*/
|
||
|
||
/*
|
||
* ç§<C3A7>有函数声明ï¿? */
|
||
static void ch395f_spi_begin(void);
|
||
static void ch395f_spi_end(void);
|
||
static void ch395f_spi_dma_transfer(uint16_t len);
|
||
|
||
/*
|
||
* ç§<C3A7>有函数实现ï¿? */
|
||
|
||
/*
|
||
* 函数功能:开ï¿?SPI 事务(CS 拉高 -> 拉低ï¿? * 函数说明:手册è¦<C3A8>ï¿?SPI 模å¼<C3A5>下å—èŠ‚é—´æ— éœ€é—´éš”ï¿? * CS 拉高å†<C3A5>拉低满足最å°<C3A5>片选间隔è¦<C3A8>ï¿? */
|
||
static void ch395f_spi_begin(void) {
|
||
/* CS 先拉高,确ä¿<C3A4>空闲状�?*/
|
||
HAL_GPIO_WritePin(CH395_SCS_GPIO_Port, CH395_SCS_Pin, GPIO_PIN_SET);
|
||
/* CS 拉低,å<C592>¯åŠ¨äº‹åŠ¡ï¼ˆæ— éœ€é¢<C3A9>外延时,SPI æ—¶åº<C3A5>ï¿?SCK 频率决定ï¿?*/
|
||
HAL_GPIO_WritePin(CH395_SCS_GPIO_Port, CH395_SCS_Pin, GPIO_PIN_RESET);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:结�SPI 事务(CS 拉高� */
|
||
static void ch395f_spi_end(void) {
|
||
/* CS 拉高,结æ<E2809C>Ÿäº‹ï¿?*/
|
||
HAL_GPIO_WritePin(CH395_SCS_GPIO_Port, CH395_SCS_Pin, GPIO_PIN_SET);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:DMA å…¨å<C2A8>Œå·¥ä¼ 输并ç‰å¾…完æˆ<C3A6>
|
||
* å…¥å<C2A5>£å<C2A3>‚数:len - ä¼ è¾“å—节ï¿? uint16_t
|
||
* 函数说明:å<C5A1>‘ï¿?s_spi2_dma_tx_buf,接收到 s_spi2_dma_rx_bufï¿? * 阻塞ç‰å¾… DMA 完æˆ<C3A6>回调置ä½<C3A4>æ ‡å¿—
|
||
*/
|
||
static void ch395f_spi_dma_transfer(uint16_t len) {
|
||
HAL_StatusTypeDef status;
|
||
uint32_t tickstart;
|
||
volatile uint32_t loop_cnt = 0U;
|
||
|
||
s_spi2_dma_done = 0U;
|
||
status = HAL_SPI_TransmitReceive_DMA(&hspi2, s_spi2_dma_tx_buf, s_spi2_dma_rx_buf, len);
|
||
if (status != HAL_OK) {
|
||
DBG_ERROR("HAL_SPI_TransmitReceive_DMA FAIL: %d, SPI_State=%d, SPI_Error=0x%lX, DMA_State=%d",
|
||
(int)status,
|
||
(int)hspi2.State,
|
||
hspi2.ErrorCode,
|
||
(int)hspi2.hdmarx->State);
|
||
return;
|
||
}
|
||
|
||
tickstart = HAL_GetTick();
|
||
while (s_spi2_dma_done == 0U) {
|
||
loop_cnt++;
|
||
if ((HAL_GetTick() - tickstart) > 1000U) {
|
||
DBG_ERROR("TIMEOUT after 1s, len=%d, loop=%lu, SPI_State=%d, SPI_Error=0x%lX",
|
||
(int)len, loop_cnt,
|
||
(int)hspi2.State,
|
||
hspi2.ErrorCode);
|
||
DBG_ERROR(" DMA_RX: State=%d, Dir=%lu, CNT=%lu",
|
||
(int)hspi2.hdmarx->State,
|
||
hspi2.hdmarx->Init.Direction,
|
||
__HAL_DMA_GET_COUNTER(hspi2.hdmarx));
|
||
DBG_ERROR(" DMA_TX: State=%d, Dir=%lu, CNT=%lu",
|
||
(int)hspi2.hdmatx->State,
|
||
hspi2.hdmatx->Init.Direction,
|
||
__HAL_DMA_GET_COUNTER(hspi2.hdmatx));
|
||
DBG_ERROR(" SPI2_CR1=0x%lX, CR2=0x%lX, SR=0x%lX",
|
||
SPI2->CR1, SPI2->CR2, SPI2->SR);
|
||
/* 强制å¤<C3A5>ä½<C3A4> SPI2 DMA 状æ€<C3A6>,é<C592>¿å…<C3A5>æ»é”<C3A9> */
|
||
HAL_SPI_Abort(&hspi2);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/* æ£€æŸ¥ä¼ è¾“æ˜¯å<C2AF>¦æˆ<C3A6>功:SPI 错误ç <C3A7>必须为 0 */
|
||
if (hspi2.ErrorCode != 0U) {
|
||
DBG_INFO("SPI DMA done with errors: ErrorCode=0x%lX, SPI_State=%d",
|
||
hspi2.ErrorCode, (int)hspi2.State);
|
||
__HAL_SPI_CLEAR_OVRFLAG(&hspi2);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 函数功能:SPI æ”¶å<C2B6>‘完æˆ<C3A6>回调
|
||
* 函数说明:由 HAL SPI 驱动ï¿?DMA TX+RX 完æˆ<C3A6>å<EFBFBD>Žè°ƒç”¨ï¼ˆHAL_SPI_TransmitReceive_DMA 触å<C2A6>‘æ¤å›žè°ƒï¼‰
|
||
*/
|
||
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) {
|
||
if (hspi->Instance == SPI2) {
|
||
s_spi2_dma_done = 1U;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 函数功能:SPI 错误回调
|
||
* 函数说明:由 HAL SPI 驱动ï¿?DMA ä¼ è¾“å‡ºé”™æ—¶è°ƒç”¨ï¼Œé‡Šæ”¾ç‰å¾…
|
||
*/
|
||
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
|
||
if (hspi->Instance == SPI2) {
|
||
s_spi2_dma_done = 1U;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 公共函数实现� */
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>‘ CH395 写入命令å—节
|
||
* å…¥å<C2A5>£å<C2A3>‚数:cmd - 命令ï¿? uint8_t 0x00 - 0xFF
|
||
* 返回值:命令ç <C3A7>回显�? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šéœ€ï¿?ch395f_spi_begin() ï¿?ch395f_spi_end() 之间调用
|
||
* 函数说明:SPI 模å¼<C3A5>下命令与数æ<C2B0>®ä¹‹é—´æ— 需间隔
|
||
*/
|
||
uint8_t ch395f_write_cmd(uint8_t cmd) {
|
||
uint8_t rx_data;
|
||
|
||
/* 通过 SPI å<>‘é€<C3A9>命令并接收回显 */
|
||
HAL_SPI_TransmitReceive(&hspi2, &cmd, &rx_data, 1, HAL_MAX_DELAY);
|
||
return rx_data;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>‘ CH395 写入数æ<C2B0>®å—节
|
||
* å…¥å<C2A5>£å<C2A3>‚数:data - æ•°æ<C2B0>®å—节 uint8_t 0x00 - 0xFF
|
||
* 返回值:数æ<C2B0>®å›žæ˜¾ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šéœ€ï¿?ch395f_spi_begin() ï¿?ch395f_spi_end() 之间调用
|
||
*/
|
||
uint8_t ch395f_write_data(uint8_t data) {
|
||
uint8_t rx_data;
|
||
|
||
/* 通过 SPI å<>‘é€<C3A9>æ•°æ<C2B0>®å¹¶æŽ¥æ”¶å›žæ˜¾ */
|
||
HAL_SPI_TransmitReceive(&hspi2, &data, &rx_data, 1, HAL_MAX_DELAY);
|
||
return rx_data;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:从 CH395 读å<C2BB>–æ•°æ<C2B0>®å—节
|
||
* 返回值:接收到的数æ<C2B0>®å—节 uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šéœ€ï¿?ch395f_spi_begin() ï¿?ch395f_spi_end() 之间调用
|
||
*/
|
||
uint8_t ch395f_read_data(void) {
|
||
uint8_t tx_dummy = 0xFFU;
|
||
uint8_t rx_data;
|
||
|
||
/* å<>‘�?0xFF 作为时钟æº<C3A6>,读å<C2BB>–芯片返回的数ï¿?*/
|
||
HAL_SPI_TransmitReceive(&hspi2, &tx_dummy, &rx_data, 1, HAL_MAX_DELAY);
|
||
return rx_data;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:检ï¿?CH395 芯片是å<C2AF>¦å˜åœ¨ä¸”通信æ£å¸¸
|
||
* 返回值:CH395F_STATUS_OK - 检测到芯片,CH395F_STATUS_NOT_DETECTED - 未检测到
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSPI2 å·²æ£ç¡®åˆ<C3A5>始化
|
||
* 函数说明:å<C5A1>‘ï¿?CMD_CHECK_EXIST (0x06) å<>Šæµ‹è¯•å—ï¿?0x57ï¿? * 芯片应返回按ä½<C3A4>å<EFBFBD>–å<E28093><C3A5>�?0xA8
|
||
*/
|
||
ch395f_status_t ch395f_check_exist(void) {
|
||
uint8_t test_data = CH395F_CHECK_EXIST_TEST_DATA;
|
||
uint8_t reply_data;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>检测命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_CHECK_EXIST);
|
||
|
||
/* å<>‘é€<C3A9>测试数ï¿?*/
|
||
ch395f_write_data(test_data);
|
||
|
||
/* 读å<C2BB>–芯片回å¤<C3A5> */
|
||
reply_data = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
/* 验è¯<C3A8>回å¤<C3A5>是å<C2AF>¦ä¸ºæµ‹è¯•æ•°æ<C2B0>®çš„æŒ‰ä½<C3A4>å<EFBFBD>–å<E28093><C3A5> */
|
||
if (reply_data == (uint8_t)(~test_data)) {
|
||
return CH395F_STATUS_OK;
|
||
}
|
||
|
||
return CH395F_STATUS_NOT_DETECTED;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:读ï¿?CH395 芯片版本ï¿? * 返回值:版本å—节(bit5:0 为版本å<C2AC>·ï¼‰uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²é€šè¿‡ ch395f_check_exist() 检ï¿? */
|
||
uint8_t ch395f_get_version(void) {
|
||
uint8_t version;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>版本读å<C2BB>–命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_IC_VER);
|
||
|
||
/* 读å<C2BB>–版本ï¿?*/
|
||
version = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return version;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获å<C2B7>–远ï¿?IP 和端ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* p_buf - 6 å—节输出缓冲区(4å—节IP + 2å—节端å<C2AF>£ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šTCP Server 模å¼<C3A5>下连接建立å<E280B9>Žè°ƒç”¨
|
||
* 函数说明:IP 低å—节在å‰<C3A5>,端å<C2AF>£ä½Žå—节在ï¿? */
|
||
void ch395f_get_remot_ipp(uint8_t sock, uint8_t *p_buf) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_buf == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>获å<C2B7>–远ï¿?IP 和端å<C2AF>£å‘½ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_REMOT_IPP_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* 读å<C2BB>– 4 å—节 IP 地å<C2B0>€ */
|
||
for (i = 0; i < 4; i++) {
|
||
p_buf[i] = ch395f_read_data();
|
||
}
|
||
|
||
/* 读å<C2BB>– 2 å—节端å<C2AF>£ï¿?*/
|
||
for (i = 4; i < 6; i++) {
|
||
p_buf[i] = ch395f_read_data();
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?CH395 功能å<C2BD>‚æ•°
|
||
* å…¥å<C2A5>£å<C2A3>‚数:para - 4 å—节功能å<C2BD>‚æ•° uint32_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_fun_para(uint32_t para) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置功能å<C2BD>‚数命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_FUN_PARA);
|
||
|
||
/* å<>‘�?4 å—节å<E2809A>‚数(低å—节在å‰<C3A5>ï¿?*/
|
||
ch395f_write_data((uint8_t)(para));
|
||
ch395f_write_data((uint8_t)(para >> 8));
|
||
ch395f_write_data((uint8_t)(para >> 16));
|
||
ch395f_write_data((uint8_t)(para >> 24));
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设�TCP MSS
|
||
* å…¥å<C2A5>£å<C2A3>‚数:mss - MSS ï¿? uint16_t 60~1460
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_tcp_mss(uint16_t mss) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?TCP MSS 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_TCP_MSS);
|
||
|
||
/* å<>‘�?2 å—节 MSS 值(低å—节在å‰<C3A5>) */
|
||
ch395f_write_data(mss & 0xFFU);
|
||
ch395f_write_data((mss >> 8) & 0xFFU);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket 接收缓冲ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* start_block - èµ·å§‹å<E280B9>—地å<C2B0>€ uint8_t
|
||
* block_count - å<>—个ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 OPEN_SOCKET_SN 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_recv_buf(uint8_t sock, uint8_t start_block, uint8_t block_count) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置接收缓冲区命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_RECV_BUF);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>èµ·å§‹å<E280B9>—地å<C2B0>€ */
|
||
ch395f_write_data(start_block);
|
||
|
||
/* å<>‘é€<C3A9>å<EFBFBD>—个数 */
|
||
ch395f_write_data(block_count);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket å<>‘é€<C3A9>缓冲区
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* start_block - èµ·å§‹å<E280B9>—地å<C2B0>€ uint8_t
|
||
* block_count - å<>—个ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 OPEN_SOCKET_SN 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_send_buf(uint8_t sock, uint8_t start_block, uint8_t block_count) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置å<C2AE>‘é€<C3A9>缓冲区命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_SEND_BUF);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>èµ·å§‹å<E280B9>—地å<C2B0>€ */
|
||
ch395f_write_data(start_block);
|
||
|
||
/* å<>‘é€<C3A9>å<EFBFBD>—个数 */
|
||
ch395f_write_data(block_count);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:清ï¿?Socket 接收缓冲ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开
|
||
*/
|
||
void ch395f_clear_recv_buf(uint8_t sock) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>清空接收缓冲区命令 */
|
||
ch395f_write_cmd(CH395F_CMD_CLEAR_RECV_BUF_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设�TCP KeepAlive 空闲时间
|
||
* å…¥å<C2A5>£å<C2A3>‚数:time - 空闲时间(秒ï¿? uint32_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_keepalive_idle(uint32_t time) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?KeepAlive 空闲时间命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_KEEPALIVE_IDLE);
|
||
|
||
/* å<>‘�?4 å—节时间值(低å—节在å‰<C3A5>) */
|
||
ch395f_write_data((uint8_t)(time));
|
||
ch395f_write_data((uint8_t)(time >> 8));
|
||
ch395f_write_data((uint8_t)(time >> 16));
|
||
ch395f_write_data((uint8_t)(time >> 24));
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设�TCP KeepAlive 探测间隔
|
||
* å…¥å<C2A5>£å<C2A3>‚数:time - 间隔时间(秒ï¿? uint32_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_keepalive_intvl(uint32_t time) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?KeepAlive 探测间隔命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_KEEPALIVE_INTVL);
|
||
|
||
/* å<>‘�?4 å—节时间值(低å—节在å‰<C3A5>) */
|
||
ch395f_write_data((uint8_t)(time));
|
||
ch395f_write_data((uint8_t)(time >> 8));
|
||
ch395f_write_data((uint8_t)(time >> 16));
|
||
ch395f_write_data((uint8_t)(time >> 24));
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设�TCP KeepAlive 探测次数
|
||
* å…¥å<C2A5>£å<C2A3>‚数:cnt - 探测次数 uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_keepalive_cnt(uint8_t cnt) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?KeepAlive 探测次数命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_KEEPALIVE_CNT);
|
||
|
||
/* å<>‘é€<C3A9>探测次ï¿?*/
|
||
ch395f_write_data(cnt);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>¯ï¿?ç¦<C3A7>用指定 Socket ï¿?KeepAlive
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* enable - 1 å<>¯ç”¨ï¿? ç¦<C3A7>用 uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开
|
||
*/
|
||
void ch395f_set_keepalive_enable(uint8_t sock, uint8_t enable) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?KeepAlive 使能命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_KEEPALIVE_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>ä½¿èƒ½æ ‡ï¿?*/
|
||
ch395f_write_data(enable);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?TCP é‡<C3A9>ä¼ æ¬¡æ•°
|
||
* å…¥å<C2A5>£å<C2A3>‚数:cnt - é‡<C3A9>ä¼ æ¬¡æ•° uint8_tï¿?=使用默认ï¿?ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_retrans_count(uint8_t cnt) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置é‡<C3A9>ä¼ æ¬¡æ•°å‘½ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_RETRAN_COUNT);
|
||
|
||
/* å<>‘é€<C3A9>é‡<C3A9>ä¼ æ¬¡ï¿?*/
|
||
ch395f_write_data(cnt);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?TCP é‡<C3A9>ä¼ å‘¨æœŸ
|
||
* å…¥å<C2A5>£å<C2A3>‚数:period - é‡<C3A9>ä¼ å‘¨æœŸï¼ˆæ¯«ç§’ï¼‰ uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå¿…须在 ch395f_init() 之å‰<C3A5>调用
|
||
*/
|
||
void ch395f_set_retrans_period(uint16_t period) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置é‡<C3A9>ä¼ å‘¨æœŸå‘½ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_RETRAN_PERIOD);
|
||
|
||
/* å<>‘�?2 å—节周期值(低å—节在å‰<C3A5>) */
|
||
ch395f_write_data(period & 0xFFU);
|
||
ch395f_write_data((period >> 8) & 0xFFU);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:软件å¤<C3A5>ï¿?CH395
|
||
* 返回值:CH395F_STATUS_OK
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSPI2 å·²æ£ç¡®åˆ<C3A5>始化
|
||
* 函数说明:å¤<C3A5>ä½<C3A4>耗时ï¿?15ms(TE0),函数内部已包å<E280A6>«å»¶ï¿? */
|
||
ch395f_status_t ch395f_reset(void) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>å¤<C3A5>ä½<C3A4>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_RESET_ALL);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
/* ç‰å¾…å¤<C3A5>ä½<C3A4>完æˆ<C3A6>(TE0 = 15ms 典型值,ç‰å¾… 20msï¿?*/
|
||
HAL_Delay(CH395F_RESET_DELAY_MS);
|
||
|
||
return CH395F_STATUS_OK;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:查询命令执行状ï¿? * 返回值:状æ€<C3A6>å—节(CH395F_ERR_SUCCESS / CH395F_ERR_BUSY / ...)uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šä»…在长执行命令(如åˆ<C3A5>始化)å<E280B0>Žè°ƒï¿? */
|
||
uint8_t ch395f_get_cmd_status(void) {
|
||
uint8_t status;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>状æ€<C3A6>查询命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_CMD_STATUS);
|
||
|
||
/* 读å<C2BB>–状æ€<C3A6>å—ï¿?*/
|
||
status = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:轮询ç‰å¾…命令执行完ï¿? * å…¥å<C2A5>£å<C2A3>‚数:timeout_ms - 超时时间(毫秒) uint32_t
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS ï¿?CH395F_CMD_RET_ABORTï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šåœ¨å<C2A8>‘é€<C3A9>长执行命令å<C2A4>Žè°ƒï¿? * 函数说明:æ¯<C3A6> 20ms 查询一次,直到命令完æˆ<C3A6>或超ï¿? */
|
||
uint8_t ch395f_poll_cmd_status(uint32_t timeout_ms) {
|
||
uint8_t status;
|
||
uint32_t retry_count = 0U;
|
||
uint32_t max_retries = (timeout_ms + 20U - 1U) / 20U;
|
||
|
||
while (1) {
|
||
HAL_Delay(20U);
|
||
status = ch395f_get_cmd_status();
|
||
|
||
if (status != CH395F_ERR_BUSY) {
|
||
return status;
|
||
}
|
||
|
||
if (++retry_count >= max_retries) {
|
||
return CH395F_ERR_BUSY; /* è¶…æ—¶ */
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 函数功能:åˆ<C3A5>始化 CH395(包ï¿?MACã€<C3A3>PHYã€<C3A3>TCP/IP å<><C3A5>è®®æ ˆï¼‰
|
||
* 返回值:CH395F_STATUS_OK - æˆ<C3A6>功,CH395F_STATUS_TIMEOUT - 超时失败
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²é€šè¿‡ ch395f_reset() å¤<C3A5>ä½<C3A4>
|
||
* 函数说明:阻塞ç‰å¾…åˆ<C3A5>始化完æˆ<C3A6>或超时(芯片需è¦<C3A8>约 200msï¼Œè¿™é‡Œç‰æœ€ï¿?4sï¿? */
|
||
ch395f_status_t ch395f_init(void) {
|
||
uint8_t status;
|
||
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_INIT_CH395);
|
||
ch395f_spi_end();
|
||
|
||
status = ch395f_poll_cmd_status(4000U);
|
||
|
||
if (status == CH395F_ERR_SUCCESS) {
|
||
return CH395F_STATUS_OK;
|
||
}
|
||
|
||
return (status == CH395F_ERR_BUSY) ? CH395F_STATUS_TIMEOUT : CH395F_STATUS_ERROR;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?CH395 IP 地å<C2B0>€ï¼ˆä½Žå—节在å‰<C3A5>ï¿? * å…¥å<C2A5>£å<C2A3>‚数:p_ip - 4 å—节 IP 地å<C2B0>€æŒ‡é’ˆ uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼ŒèŠ¯ç‰‡å·²åˆ<C3A5>始化
|
||
*/
|
||
void ch395f_set_ip_addr(uint8_t *p_ip) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_ip == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?IP 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_IP_ADDR);
|
||
|
||
/* é€<C3A9>å—节å<E2809A>‘ï¿?IP 地å<C2B0>€ */
|
||
for (i = 0; i < 4; i++) {
|
||
ch395f_write_data(p_ip[i]);
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设置网ï¿?IP 地å<C2B0>€ï¼ˆä½Žå—节在å‰<C3A5>ï¿? * å…¥å<C2A5>£å<C2A3>‚数:p_gwip - 4 å—节网关 IP 指针 uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼ŒèŠ¯ç‰‡å·²åˆ<C3A5>始化
|
||
*/
|
||
void ch395f_set_gwip_addr(uint8_t *p_gwip) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_gwip == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置网关命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_GWIP_ADDR);
|
||
|
||
/* é€<C3A9>å—节å<E2809A>‘é€<C3A9>网ï¿?IP */
|
||
for (i = 0; i < 4; i++) {
|
||
ch395f_write_data(p_gwip[i]);
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设置å<C3A5>网掩ç <C3A7>(低å—节在å‰<C3A5>)
|
||
* å…¥å<C2A5>£å<C2A3>‚数:p_mask - 4 å—节å<C3A5>网掩ç <C3A7>指针 uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼ŒèŠ¯ç‰‡å·²åˆ<C3A5>始化
|
||
*/
|
||
void ch395f_set_mask_addr(uint8_t *p_mask) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_mask == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置掩ç <C3A7>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_MASK_ADDR);
|
||
|
||
/* é€<C3A9>å—节å<E2809A>‘é€<C3A9>å<C3A5>网掩ï¿?*/
|
||
for (i = 0; i < 4; i++) {
|
||
ch395f_write_data(p_mask[i]);
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?MAC 地å<C2B0>€ï¼ˆä½Žå—节在å‰<C3A5>,å˜å‚¨äºŽ EEPROMï¿? * å…¥å<C2A5>£å<C2A3>‚数:p_mac - 6 å—节 MAC 地å<C2B0>€æŒ‡é’ˆ uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼ŒèŠ¯ç‰‡å·²åˆ<C3A5>始化
|
||
* 函数说明:执行耗时�30us(TE5� */
|
||
void ch395f_set_mac_addr(uint8_t *p_mac) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_mac == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?MAC 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_MAC_ADDR);
|
||
|
||
/* é€<C3A9>å—节å<E2809A>‘ï¿?MAC 地å<C2B0>€ */
|
||
for (i = 0; i < 6; i++) {
|
||
ch395f_write_data(p_mac[i]);
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:从 CH395 读å<C2BB>– MAC 地å<C2B0>€
|
||
* 出å<C2BA>£å<C2A3>‚数:p_mac - 6 å—节 MAC 地å<C2B0>€ç¼“冲区指ï¿? uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žï¿? */
|
||
void ch395f_get_mac_addr(uint8_t *p_mac) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_mac == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读ï¿?MAC 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_GET_MAC_ADDR);
|
||
|
||
/* é€<C3A9>å—节读ï¿?MAC 地å<C2B0>€ */
|
||
for (i = 0; i < 6; i++) {
|
||
p_mac[i] = ch395f_read_data();
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:读ï¿?IP ä¿¡æ<C2A1>¯ï¼ˆIP + 掩ç <C3A7> + DNS,共 20 å—节ï¿? * 出å<C2BA>£å<C2A3>‚数:p_buf - 20 å—节缓冲区指ï¿? uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žï¿? */
|
||
void ch395f_get_ip_inf(uint8_t *p_buf) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_buf == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读ï¿?IP ä¿¡æ<C2A1>¯å‘½ä»¤ */
|
||
ch395f_write_cmd(CH395F_CMD_GET_IP_INF);
|
||
|
||
/* é€<C3A9>å—节读ï¿?IP ä¿¡æ<C2A1>¯ï¼ˆå…± 20 å—节ï¿?*/
|
||
for (i = 0; i < 20; i++) {
|
||
p_buf[i] = ch395f_read_data();
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获ï¿?PHY 连接状�? * 返回值:PHY 状æ€<C3A6>ç <C3A7>(CH395F_PHY_DISCONNã€<C3A3>CH395F_PHY_10M_FULL ç‰ï¼‰uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
uint8_t ch395f_get_phy_status(void) {
|
||
uint8_t status;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读ï¿?PHY 状æ€<C3A6>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_PHY_STATUS);
|
||
|
||
/* 读å<C2BB>– PHY 状�?*/
|
||
status = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?PHY 连接模å¼<C3A5>
|
||
* å…¥å<C2A5>£å<C2A3>‚数:phystat - 连接模å¼<C3A5>ï¿? uint8_t 0x20 = 自动å<C2A8><C3A5>商
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
void ch395f_set_phy(uint8_t phystat) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设ï¿?PHY 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_PHY);
|
||
|
||
/* å<>‘é€<C3A9>连接模å¼<C3A5>å<EFBFBD>‚ï¿?*/
|
||
ch395f_write_data(phystat);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:使ï¿?å…³é— CH395 å“<C3A5>应 PING
|
||
* å…¥å<C2A5>£å<C2A3>‚数:enable - 1 使能 PING å“<C3A5>应ï¿? å…³é—
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? * 函数说明:手ï¿?5.37 CMD_PING_ENABLE,默认关ï¿? */
|
||
void ch395f_ping_enable(uint8_t enable) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘�?PING 使能命令 */
|
||
ch395f_write_cmd(CH395F_CMD_PING_ENABLE);
|
||
|
||
/* å<>‘é€<C3A9>ä½¿èƒ½æ ‡ï¿?*/
|
||
ch395f_write_data(enable);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>¯ï¿?ç¦<C3A7>用 DHCP
|
||
* å…¥å<C2A5>£å<C2A3>‚数:enable - 1 å<>¯ç”¨ï¿? ç¦<C3A7>用 uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
void ch395f_set_dhcp(uint8_t enable) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘�?DHCP 使能命令 */
|
||
ch395f_write_cmd(CH395F_CMD_DHCP_ENABLE);
|
||
|
||
/* å<>‘é€<C3A9>å<EFBFBD>¯ï¿?ç¦<C3A7>用å<C2A8>‚æ•° */
|
||
ch395f_write_data(enable);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获ï¿?DHCP 状�? * 返回值:0 = æˆ<C3A6>功,é<C592>žï¿?= 错误/è¶…æ—¶ uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>始化且 DHCP å·²å<C2B2>¯ï¿? */
|
||
uint8_t ch395f_get_dhcp_status(void) {
|
||
uint8_t status;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读ï¿?DHCP 状æ€<C3A6>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_DHCP_STATUS);
|
||
|
||
/* 读å<C2BB>– DHCP 状�?*/
|
||
status = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket å<><C3A5>议类型
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* proto - å<><C3A5>议类型 uint8_t CH395F_PROTO_TYPE_xxx
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 未打开
|
||
*/
|
||
void ch395f_set_proto_type(uint8_t sock, uint8_t proto) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置å<C2AE><C3A5>议类型命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_PROTO_TYPE_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>å<EFBFBD><C3A5>议类ï¿?*/
|
||
ch395f_write_data(proto);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket ç›®æ ‡ IP 地å<C2B0>€
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* p_ip - 4 å—èŠ‚ç›®æ ‡ IP 指针 uint8_t*
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žï¿? */
|
||
void ch395f_set_des_ip(uint8_t sock, uint8_t *p_ip) {
|
||
uint8_t i;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_ip == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置目ï¿?IP 命令 */
|
||
ch395f_write_cmd(CH395F_CMD_SET_IP_ADDR_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* é€<C3A9>å—节å<E2809A>‘é€<C3A9>ç›®ï¿?IP */
|
||
for (i = 0; i < 4; i++) {
|
||
ch395f_write_data(p_ip[i]);
|
||
}
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket ç›®æ ‡ç«¯å<C2AF>£ï¼ˆå°<C3A5>端åº<C3A5>ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* port - ç›®æ ‡ç«¯å<C2AF>£ uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæ—
|
||
*/
|
||
void ch395f_set_des_port(uint8_t sock, uint16_t port) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>è®¾ç½®ç›®æ ‡ç«¯å<C2AF>£å‘½ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_SET_DES_PORT_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>端å<C2AF>£ä½Žå—节 */
|
||
ch395f_write_data(port & 0xFFU);
|
||
|
||
/* å<>‘é€<C3A9>端å<C2AF>£é«˜å—节 */
|
||
ch395f_write_data((port >> 8) & 0xFFU);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?Socket æº<C3A6>端å<C2AF>£ï¼ˆå°<C3A5>端åº<C3A5>)
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* port - æº<C3A6>端ï¿? uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæ—
|
||
*/
|
||
void ch395f_set_sour_port(uint8_t sock, uint16_t port) {
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>设置æº<C3A6>端å<C2AF>£å‘½ä»¤ */
|
||
ch395f_write_cmd(CH395F_CMD_SET_SOUR_PORT_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* å<>‘é€<C3A9>端å<C2AF>£ä½Žå—节 */
|
||
ch395f_write_data(port & 0xFFU);
|
||
|
||
/* å<>‘é€<C3A9>端å<C2AF>£é«˜å—节 */
|
||
ch395f_write_data((port >> 8) & 0xFFU);
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:打开 Socket
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS 表示æˆ<C3A6>功ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå<C5A1><C3A5>议类型ã€<C3A3>ç›®ï¿?IPã€<C3A3>端å<C2AF>£å·²è®¾ç½®
|
||
*/
|
||
uint8_t ch395f_open_socket(uint8_t sock) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_OPEN_SOCKET_SN);
|
||
ch395f_write_data(sock);
|
||
ch395f_spi_end();
|
||
|
||
return ch395f_poll_cmd_status(4000U);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:关�Socket
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS 表示æˆ<C3A6>功ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开
|
||
*/
|
||
uint8_t ch395f_close_socket(uint8_t sock) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_CLOSE_SOCKET_SN);
|
||
ch395f_write_data(sock);
|
||
ch395f_spi_end();
|
||
|
||
return ch395f_poll_cmd_status(4000U);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>¯ï¿?TCP 监å<E28098>¬æ¨¡å¼<C3A5>
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS 表示æˆ<C3A6>功ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开且å<E2809D><C3A5>议类型为 TCP
|
||
*/
|
||
uint8_t ch395f_tcp_listen(uint8_t sock) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_TCP_LISTEN_SN);
|
||
ch395f_write_data(sock);
|
||
ch395f_spi_end();
|
||
|
||
return ch395f_poll_cmd_status(4000U);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>¯ï¿?TCP 连接
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS 表示æˆ<C3A6>功ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开且å<E2809D><C3A5>议类型为 TCP
|
||
*/
|
||
uint8_t ch395f_tcp_connect(uint8_t sock) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_TCP_CONNECT_SN);
|
||
ch395f_write_data(sock);
|
||
ch395f_spi_end();
|
||
|
||
return ch395f_poll_cmd_status(4000U);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:æ–å¼€ TCP 连接
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:命令执行状æ€<C3A6>ç <C3A7>(CH395F_ERR_SUCCESS 表示æˆ<C3A6>功ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šTCP 已建立连ï¿? */
|
||
uint8_t ch395f_tcp_disconnect(uint8_t sock) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_TCP_DISCONNECT_SN);
|
||
ch395f_write_data(sock);
|
||
ch395f_spi_end();
|
||
|
||
return ch395f_poll_cmd_status(4000U);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:å<C5A1>‘ Socket å<>‘é€<C3A9>缓冲区写入数æ<C2B0>®ï¼ˆDMA 批é‡<C3A9>ä¼ è¾“ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* p_data - æ•°æ<C2B0>®æŒ‡é’ˆ uint8_t*
|
||
* len - æ•°æ<C2B0>®é•¿åº¦ uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼Œé•¿åº¦å¤§äºŽ 0,TCP 已连接或 UDP 已打开
|
||
* 函数说明:将命令头和数æ<C2B0>®æ‰“包ï¿?DMA 缓冲区,一ï¿?SPI DMA ä¼ è¾“å®Œæˆ<C3A6>
|
||
*/
|
||
void ch395f_write_send_buf(uint8_t sock, uint8_t *p_data, uint16_t len) {
|
||
uint16_t total;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_data == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 计算总长度:1(cmd) + 1(sock) + 2(len) + data */
|
||
total = 4U + len;
|
||
if (total > CH395F_DMA_BUF_SIZE) {
|
||
return;
|
||
}
|
||
|
||
/* 打包命令头到 DMA å<>‘é€<C3A9>缓冲区 */
|
||
s_spi2_dma_tx_buf[0] = CH395F_CMD_WRITE_SEND_BUF_SN;
|
||
s_spi2_dma_tx_buf[1] = sock;
|
||
s_spi2_dma_tx_buf[2] = len & 0xFFU;
|
||
s_spi2_dma_tx_buf[3] = (len >> 8) & 0xFFU;
|
||
|
||
/* æ‹·è´<C3A8>用户数æ<C2B0>®ï¿?DMA å<>‘é€<C3A9>缓冲区 */
|
||
memcpy(&s_spi2_dma_tx_buf[4], p_data, len);
|
||
|
||
/* æ•°æ<C2B0>®å<C2AE>Œæ¥å±<C3A5>障:确ï¿?memcpy 写入ï¿?DMA 读å<C2BB>–å‰<C3A5>对总线å<C2BF>¯è§<C3A8> */
|
||
__DSB();
|
||
|
||
/* CS 拉低 -> DMA 批é‡<C3A9>ä¼ è¾“ -> CS 拉高 */
|
||
ch395f_spi_begin();
|
||
ch395f_spi_dma_transfer(total);
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:从 Socket 接收缓冲区读å<C2BB>–æ•°æ<C2B0>®ï¼ˆDMA 批é‡<C3A9>ä¼ è¾“ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* p_data - 输出缓冲区指� uint8_t*
|
||
* len - 待读å<C2BB>–æ•°æ<C2B0>®é•¿ï¿? uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæŒ‡é’ˆé<CB86>žç©ºï¼Œé•¿åº¦å¤§äºŽ 0,接收缓冲区有数ï¿? * 函数说明:命令头打包到å<C2B0>‘é€<C3A9>缓冲区(数æ<C2B0>®éƒ¨åˆ†å¡« 0xFF 作时钟)ï¿? * 一ï¿?SPI DMA å…¨å<C2A8>Œå·¥ä¼ 输,有效数æ<C2B0>®ä»ŽæŽ¥æ”¶ç¼“冲区å<C2BA><C3A5>ç§» 4 å—节处拷ï¿? */
|
||
void ch395f_read_recv_buf(uint8_t sock, uint8_t *p_data, uint16_t len) {
|
||
uint16_t total;
|
||
|
||
/* 检查输入å<C2A5>‚æ•°å<C2B0>ˆæ³•�?*/
|
||
if (p_data == NULL) {
|
||
return;
|
||
}
|
||
|
||
/* 计算总长度:1(cmd) + 1(sock) + 2(len) + data */
|
||
total = 4U + len;
|
||
if (total > CH395F_DMA_BUF_SIZE) {
|
||
return;
|
||
}
|
||
|
||
/* 命令头打包到 DMA å<>‘é€<C3A9>缓冲区 */
|
||
s_spi2_dma_tx_buf[0] = CH395F_CMD_READ_RECV_BUF_SN;
|
||
s_spi2_dma_tx_buf[1] = sock;
|
||
s_spi2_dma_tx_buf[2] = len & 0xFFU;
|
||
s_spi2_dma_tx_buf[3] = (len >> 8) & 0xFFU;
|
||
|
||
/* æ•°æ<C2B0>®éƒ¨åˆ†å¡«å…… 0xFF(SPI 时钟驱动用) */
|
||
memset(&s_spi2_dma_tx_buf[4], 0xFFU, len);
|
||
|
||
/* CS 拉低 -> DMA å…¨å<C2A8>Œå·¥ä¼ 输(å<CB86>‘命令头 + æ”¶æ•°æ<C2B0>®ï¼‰ -> CS 拉高 */
|
||
ch395f_spi_begin();
|
||
ch395f_spi_dma_transfer(total);
|
||
ch395f_spi_end();
|
||
|
||
/* ï¿?DMA 接收缓冲区å<C2BA><C3A5>ï¿?4 å—节处拷è´<C3A8>有效数æ<C2B0>®åˆ°ç”¨æˆ·ç¼“冲ï¿?*/
|
||
memcpy(p_data, &s_spi2_dma_rx_buf[4], len);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获ï¿?Socket 接收缓冲区数æ<C2B0>®é•¿ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 3
|
||
* 返回值:接收数æ<C2B0>®é•¿åº¦ uint16_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开
|
||
*/
|
||
uint16_t ch395f_get_recv_len(uint8_t sock) {
|
||
uint16_t recv_len;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>获å<C2B7>–接收长度命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_RECV_LEN_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* 读å<C2BB>–长度低å—ï¿?*/
|
||
recv_len = ch395f_read_data();
|
||
|
||
/* 读å<C2BB>–长度高å—节并组å<E2809E>ˆ */
|
||
recv_len |= (uint16_t)ch395f_read_data() << 8;
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return recv_len;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获å<C2B7>–免局䏿–状�? * è¿”å›žå€¼ï¼šä¸æ–状æ€<C3A6>å—ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
uint8_t ch395f_get_glob_int_status(void) {
|
||
uint8_t status;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读å<C2BB>–免局䏿–状æ€<C3A6>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_GLOB_INT_STATUS);
|
||
|
||
/* 读å<C2BB>–䏿–状�?*/
|
||
status = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获å<C2B7>–免局䏿–状æ€<C3A6>(2 å—节版,支æŒ<C3A6> Socket 0~7ï¿? * è¿”å›žå€¼ï¼šä¸æ–状�?uint16_t(低å—节=Socket 0~3 + PHY/DHCP,高å—节=Socket 4~7 + DHCPv6ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
uint16_t ch395f_get_glob_int_status_all(void) {
|
||
uint16_t status;
|
||
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_GET_GLOB_INT_STATUS_ALL);
|
||
status = (uint16_t)ch395f_read_data();
|
||
status |= ((uint16_t)ch395f_read_data() << 8U);
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获ï¿?Socket 䏿–状�? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* 返回值:Socket 䏿–状æ€<C3A6>å—ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
uint8_t ch395f_get_sock_int_status(uint8_t sock) {
|
||
uint8_t status;
|
||
|
||
/* 开�SPI 事务 */
|
||
ch395f_spi_begin();
|
||
|
||
/* å<>‘é€<C3A9>读ï¿?Socket 䏿–状æ€<C3A6>命ï¿?*/
|
||
ch395f_write_cmd(CH395F_CMD_GET_INT_STATUS_SN);
|
||
|
||
/* å<>‘�?Socket 索引 */
|
||
ch395f_write_data(sock);
|
||
|
||
/* 读å<C2BB>–䏿–状�?*/
|
||
status = ch395f_read_data();
|
||
|
||
/* 结æ<E2809C>Ÿ SPI 事务 */
|
||
ch395f_spi_end();
|
||
|
||
return status;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获ï¿?Socket 状æ€<C3A6>(2 å—节输出ï¿? * å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* status - 2 å—节输出缓冲ï¿?[0]=Socket状�? [1]=TCP状�? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šèŠ¯ç‰‡å·²åˆ<C3A5>å§‹ï¿? */
|
||
void ch395f_get_socket_status(uint8_t sock, uint8_t *p_status) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_GET_SOCKET_STATUS_SN);
|
||
ch395f_write_data(sock);
|
||
p_status[0] = ch395f_read_data();
|
||
p_status[1] = ch395f_read_data();
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设ï¿?ARP é‡<C3A9>ä¼ å<C2A0>‚æ•°
|
||
* å…¥å<C2A5>£å<C2A3>‚数:period_100ms - ARP é‡<C3A9>ä¼ å‘¨æœŸï¼ˆå<CB86>•ï¿?100msï¿?=默认ï¿?10ï¿?秒) uint8_t
|
||
* cnt - ARP é‡<C3A9>ä¼ æ¬¡æ•°ï¿?=默认ï¿?3ï¿? uint8_t
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šåº”ï¿?ch395f_init() 之å<E280B9>Žè°ƒç”¨
|
||
* 函数说明:周期最大值约 25.5 秒,255 è¡¨ç¤ºæ— é™<C3A9>é‡<C3A9>ä¼
|
||
*/
|
||
void ch395f_set_arp(uint8_t period_100ms, uint8_t cnt) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_SET_ARP);
|
||
ch395f_write_data(period_100ms);
|
||
ch395f_write_data(cnt);
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:设�Socket TTL
|
||
* å…¥å<C2A5>£å<C2A3>‚数:sock - Socket 索引 uint8_t 0 - 7
|
||
* ttl - TTL � uint8_t 最�128
|
||
* é™<C3A9>定æ<C5A1>¡ä»¶ï¼šSocket 已打开,TCP Server 模å¼<C3A5>下ä¸<C3A4>生效
|
||
*/
|
||
void ch395f_set_ttl(uint8_t sock, uint8_t ttl) {
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_SET_TTL);
|
||
ch395f_write_data(sock);
|
||
ch395f_write_data(ttl);
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获å<C2B7>–ä¸<C3A4>å<EFBFBD>¯è¾¾ä¿¡æ<C2A1>¯ï¼ˆç”¨äºŽè°ƒè¯•è¿žæŽ¥å¤±è´¥åŽŸå› ï¼‰
|
||
* 出å<C2BA>£å<C2A3>‚数:p_buf - 8 å—节输出缓冲区(类型+å<><C3A5>è®®ï¿?端å<C2AF>£+IPï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šæ”¶ï¿?GINT_STAT_UNREACH 䏿–å<C2AD>Žè°ƒï¿? */
|
||
void ch395f_get_unreach_info(uint8_t *p_buf) {
|
||
uint8_t i = 0;
|
||
|
||
ch395f_spi_begin();
|
||
ch395f_write_cmd(CH395F_CMD_GET_UNREACH_IPPT);
|
||
for (i = 0; i < 8; i++) {
|
||
p_buf[i] = ch395f_read_data();
|
||
}
|
||
ch395f_spi_end();
|
||
}
|
||
|
||
|