forked from gary/BCU
2
0
Fork 0

fix some bugs--restore w5500 section

This commit is contained in:
Carl 2025-05-19 14:22:47 +08:00
parent 69cf524761
commit aa35be0cd1
13 changed files with 4944 additions and 5367 deletions

View File

@ -21,91 +21,91 @@
uint8_t hmi_buf[4][APP_HMI_BUF_SIZE] __attribute__((section(".CCM_RAM")));
/************************************************ETH接口***************************************************/
//static void w5500_rcv_call(uint8_t socket, uint8_t *buf, uint16_t len);
static void w5500_rcv_call(uint8_t socket, uint8_t *buf, uint16_t len);
//ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
//W5500_STATIC_INIT(w5500, kSpiDev_3, kGpioType_W5500Cs, w5500_rcv_call);
ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
W5500_STATIC_INIT(w5500, kSpiDev_3, kGpioType_W5500Cs, w5500_rcv_call);
static void eth_ctrl_rx_int(uint8_t comm_dev, bool is_en)
{
}
//static bool w5500_tcp_send(uint8_t comm_dev, uint8_t *buf, int32_t len)
//{
// uint32_t cnt;
// bool res = false;
// uint16_t addr, tmp;
// uint8_t rcv_buf[2], socket_reg;
static bool w5500_tcp_send(uint8_t comm_dev, uint8_t *buf, int32_t len)
{
uint32_t cnt;
bool res = false;
uint16_t addr, tmp;
uint8_t rcv_buf[2], socket_reg;
// if (comm_dev < 8)
// {
// tmp = cnt = 0;
// socket_reg = W5500_CREAT_SOCKET_REG(comm_dev);
// while (cnt++ < 10)
// {
// drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_TX_FSR_0x20, rcv_buf, 2);
// tmp = READ_BT_INT16U_BY_CONST_POS(rcv_buf, 0);
// if (len < tmp)
// {
// drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_TX_WR_0x24, rcv_buf, 2);
// addr = READ_BT_INT16U_BY_CONST_POS(rcv_buf, 0);
if (comm_dev < 8)
{
tmp = cnt = 0;
socket_reg = W5500_CREAT_SOCKET_REG(comm_dev);
while (cnt++ < 10)
{
drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_TX_FSR_0x20, rcv_buf, 2);
tmp = READ_BT_INT16U_BY_CONST_POS(rcv_buf, 0);
if (len < tmp)
{
drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_TX_WR_0x24, rcv_buf, 2);
addr = READ_BT_INT16U_BY_CONST_POS(rcv_buf, 0);
// drv_w5500_dma_write_socket_reg(&w5500, W5500_CREAT_SOCKET_WRITE_BUF(comm_dev), addr, buf, len);
// addr += len;
// WRITE_BT_INT16U_BY_CONST_POS(rcv_buf, 0, addr);
// drv_w5500_write_socket_reg(&w5500, socket_reg, Sn_TX_WR_0x24, rcv_buf, 2);
drv_w5500_dma_write_socket_reg(&w5500, W5500_CREAT_SOCKET_WRITE_BUF(comm_dev), addr, buf, len);
addr += len;
WRITE_BT_INT16U_BY_CONST_POS(rcv_buf, 0, addr);
drv_w5500_write_socket_reg(&w5500, socket_reg, Sn_TX_WR_0x24, rcv_buf, 2);
// rcv_buf[0] = SOCKET_CMD_SEND;
// drv_w5500_write_socket_reg(&w5500, socket_reg, Sn_CR_0x01, rcv_buf, 1);
// res = true;
// break;
// }
// kit_time_dly_ms(1);
// }
// }
// return res;
//}
rcv_buf[0] = SOCKET_CMD_SEND;
drv_w5500_write_socket_reg(&w5500, socket_reg, Sn_CR_0x01, rcv_buf, 1);
res = true;
break;
}
kit_time_dly_ms(1);
}
}
return res;
}
//bool w5500_tcp_close(uint8_t socket)
//{
// bool res = false;
// if (socket < W5500_MODBUS_NUM)
// {
// res = drv_w5500_close_socket(&w5500, socket);
// }
// return res;
//}
bool w5500_tcp_close(uint8_t socket)
{
bool res = false;
if (socket < W5500_MODBUS_NUM)
{
res = drv_w5500_close_socket(&w5500, socket);
}
return res;
}
//void w5500_tcp_close_call(uint8_t socket)
//{
// if (socket < W5500_MODBUS_NUM)
// {
// }
//}
void w5500_tcp_close_call(uint8_t socket)
{
if (socket < W5500_MODBUS_NUM)
{
}
}
//void w5500_rcv_call(uint8_t socket, uint8_t *buf, uint16_t len)
//{
// bsp_modbus_push_data(&w5500_modbus_tcp_array[socket], buf, len);
//}
void w5500_rcv_call(uint8_t socket, uint8_t *buf, uint16_t len)
{
bsp_modbus_push_data(&w5500_modbus_tcp_array[socket], buf, len);
}
//void bms_poll_w5500(void)
//{
// drv_w5500_poll(&w5500);
//}
void bms_poll_w5500(void)
{
drv_w5500_poll(&w5500);
}
#define STM32_ID_ADDR 0x1FFF7A10
//void bms_w5500_net_protocol(void)
//{
// uint8_t mac_buf[6];
// uint16_t port, *port_array;
// uint32_t ip, len, addr, net_mask, gateway_ip;
void bms_w5500_net_protocol(void)
{
uint8_t mac_buf[6];
uint16_t port, *port_array;
uint32_t ip, len, addr, net_mask, gateway_ip;
// ip = get_eeprom_data(kEEData_Eth1IPAddr2_1, kEepromDataType_Double);
// net_mask = get_eeprom_data(kEEData_Eth1Mask2_1, kEepromDataType_Double);
// gateway_ip = get_eeprom_data(kEEData_Eth1Gate1Addr2_1, kEepromDataType_Double);
// drv_w5500_init(&w5500, ip, port_array, gateway_ip, net_mask, (uint8_t *)(STM32_ID_ADDR + 4), 40000);
//}
ip = get_eeprom_data(kEEData_Eth1IPAddr2_1, kEepromDataType_Double);
net_mask = get_eeprom_data(kEEData_Eth1Mask2_1, kEepromDataType_Double);
gateway_ip = get_eeprom_data(kEEData_Eth1Gate1Addr2_1, kEepromDataType_Double);
drv_w5500_init(&w5500, ip, port_array, gateway_ip, net_mask, (uint8_t *)(STM32_ID_ADDR + 4), 40000);
}
/**************************************************CAN接口**************************************************/
QUEUE_STATIC_INIT_CCM(inter_can_queue, 50, sizeof(CanMsg));
@ -315,21 +315,21 @@ void bms_init_comm(void)
drv_can_set_interrupt(EXTER_CAN_PORT, kcan_interrupt_e_Rx, APP_CFG_INT_PRIO_CAN2_RX, exter_can_rx_it_call);
drv_can_set_interrupt(EXTER_CAN_PORT, kcan_interrupt_e_Tx, APP_CFG_INT_PRIO_CAN2_TX, exter_can_tx_it_call);
// for (i = 0; i < W5500_MODBUS_NUM; i++)
// {
// w5500_modbus_tcp_array[i].type = kModbusType_TCP;
// w5500_modbus_tcp_array[i].comm_dev = i;
// w5500_modbus_tcp_array[i].start_addr = 0xFFFF;
// w5500_modbus_tcp_array[i].send_call = w5500_tcp_send;
// w5500_modbus_tcp_array[i].buf_size = MODBUS_BUF_SIZE;
// w5500_modbus_tcp_array[i].ctrl_rx_int_call = eth_ctrl_rx_int;
// };
// drv_w5500_set_close_call(&w5500, w5500_tcp_close_call);
// drv_spi_init(kSpiDev_3, kSpiFreq_Div2, kSpiMode_C0E0, SpiFrame_MSBFirst, kGpioType_W5500Clk, kGpioType_W5500Miso, kGpioType_W5500Mosi);
for (i = 0; i < W5500_MODBUS_NUM; i++)
{
w5500_modbus_tcp_array[i].type = kModbusType_TCP;
w5500_modbus_tcp_array[i].comm_dev = i;
w5500_modbus_tcp_array[i].start_addr = 0xFFFF;
w5500_modbus_tcp_array[i].send_call = w5500_tcp_send;
w5500_modbus_tcp_array[i].buf_size = MODBUS_BUF_SIZE;
w5500_modbus_tcp_array[i].ctrl_rx_int_call = eth_ctrl_rx_int;
};
drv_w5500_set_close_call(&w5500, w5500_tcp_close_call);
drv_spi_init(kSpiDev_3, kSpiFreq_Div2, kSpiMode_C0E0, SpiFrame_MSBFirst, kGpioType_W5500Clk, kGpioType_W5500Miso, kGpioType_W5500Mosi);
// drv_spi_set_dma(kSpiDev_3, true, true);
// drv_gpio_set_pin_status(kGpioType_W5500Rst, kGpioStatus_Low);
// kit_time_dly_ms(500);
// drv_gpio_set_pin_status(kGpioType_W5500Rst, kGpioStatus_High);
// kit_time_dly_ms(1500);
drv_gpio_set_pin_status(kGpioType_W5500Rst, kGpioStatus_Low);
kit_time_dly_ms(500);
drv_gpio_set_pin_status(kGpioType_W5500Rst, kGpioStatus_High);
kit_time_dly_ms(1500);
}

View File

@ -48,8 +48,8 @@ uint32_t hmi_fill_modbus_cfg(uint8_t *buf);
uint16_t hmi_write_modbus_cfg(uint16_t offset_addr, uint16_t data);
//void bms_poll_w5500(void);
//void bms_w5500_net_protocol(void);
void bms_poll_w5500(void);
void bms_w5500_net_protocol(void);
#ifdef __cplusplus
}
#endif

View File

@ -84,12 +84,12 @@ const GpioArray io_array[kGpioType_End] =
kGpioMode_Output_PP, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 11), kGpioPort_B, kGpioPin_11, //ADC_CS SPI2通讯信号
/*网口*/
// kGpioMode_Comm_Tx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 5), kGpioPort_B, kGpioPin_5, //W5500_MOSI
// kGpioMode_Comm_Rx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 4), kGpioPort_B, kGpioPin_4, //W5500_MISO
// kGpioMode_Comm_Tx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 3), kGpioPort_B, kGpioPin_3, //W5500_SCK
// kGpioMode_Output_PP, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_A, 15), kGpioPort_A, kGpioPin_15, //W5500_CS
// kGpioMode_Output_PP, kGpioStatus_Low, GPIO_PORT_PIN(kGpioPort_G, 14), kGpioPort_G, kGpioPin_14, //W5500_RST
// kGpioMode_Input_Floating, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_G, 15), kGpioPort_G, kGpioPin_15, //W5500_INT
kGpioMode_Comm_Tx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 5), kGpioPort_B, kGpioPin_5, //W5500_MOSI
kGpioMode_Comm_Rx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 4), kGpioPort_B, kGpioPin_4, //W5500_MISO
kGpioMode_Comm_Tx, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_B, 3), kGpioPort_B, kGpioPin_3, //W5500_SCK
kGpioMode_Output_PP, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_A, 15), kGpioPort_A, kGpioPin_15, //W5500_CS
kGpioMode_Output_PP, kGpioStatus_Low, GPIO_PORT_PIN(kGpioPort_G, 14), kGpioPort_G, kGpioPin_14, //W5500_RST
kGpioMode_Input_Floating, kGpioStatus_High, GPIO_PORT_PIN(kGpioPort_G, 15), kGpioPort_G, kGpioPin_15, //W5500_INT
};
void bms_init_gpio(void)

View File

@ -91,12 +91,12 @@ typedef enum
kGpioType_ADC_Cs,
/*以太网模块*/
// kGpioType_W5500Mosi,
// kGpioType_W5500Miso,
// kGpioType_W5500Clk,
// kGpioType_W5500Cs,
// kGpioType_W5500Rst,
// kGpioType_W5500Int,
kGpioType_W5500Mosi,
kGpioType_W5500Miso,
kGpioType_W5500Clk,
kGpioType_W5500Cs,
kGpioType_W5500Rst,
kGpioType_W5500Int,
kGpioType_End,
} GpioType;

View File

@ -21,7 +21,7 @@ bool is_first_run = false;
static int a = 0;
void task_1ms_handler(uint32_t base_time)
{
// bms_poll_w5500();
bms_poll_w5500();
}
void task_can1_handler(uint32_t base_time)
@ -179,17 +179,17 @@ void poll_10ms_task_init(void)
bsp_create_task(&modbus_rtu_task2, (uint8_t *)"exter1_modbus");
bsp_create_task(&modbus_rtu_task3, (uint8_t *)"exter2_modbus");
// bms_w5500_net_protocol();
// for (i = 0; i < W5500_MODBUS_NUM; i++)
// {
// tcp_server_task[i].task_id = i + 10;
// tcp_server_task[i].stk_size = 300;
// tcp_server_task[i].stk_array = tcp_server_stk[i];
// tcp_server_task[i].interval = 100;
// tcp_server_task[i].timeout = 1000;
// tcp_server_task[i].handler_func = tcp_server_poll[i];
// bsp_create_task(&tcp_server_task[i], (uint8_t *)&tcp_server_task_name[i][0]);
// }
bms_w5500_net_protocol();
for (i = 0; i < W5500_MODBUS_NUM; i++)
{
tcp_server_task[i].task_id = i + 10;
tcp_server_task[i].stk_size = 300;
tcp_server_task[i].stk_array = tcp_server_stk[i];
tcp_server_task[i].interval = 100;
tcp_server_task[i].timeout = 1000;
tcp_server_task[i].handler_func = tcp_server_poll[i];
bsp_create_task(&tcp_server_task[i], (uint8_t *)&tcp_server_task_name[i][0]);
}
}
void poll_mqtt_init(void)

View File

@ -10,14 +10,14 @@
<TargetName>stm32f407</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pArmCC>5060750::V5.06 update 6 (build 750)::ARMCC</pArmCC>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
<pArmCC>5050106::V5.05 update 1 (build 106)::ARMCC</pArmCC>
<pCCUsed>5050106::V5.05 update 1 (build 106)::ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F407ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
@ -186,6 +186,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -352,7 +354,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -471,7 +473,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -880,7 +882,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -1066,7 +1068,7 @@
<TargetCommonOption>
<Device>STM32F407VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
@ -1235,6 +1237,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -1401,7 +1405,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@ typedef struct
extern QueueItem inter_can_queue;
extern QueueItem exter_can_queue;
//extern ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
extern ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
extern const UintArgFunCall tcp_server_poll[W5500_MODBUS_NUM];
QueueItem *queue_can[kcan_dev_e_End] =
@ -211,77 +211,77 @@ void modbus_rtu_externII_handler(uint32_t base_time)
}
typedef void (* UintArgCall) (uint32_t arg);
//#if W5500_MODBUS_NUM > 0
//void protocol_w5500_modbus_tcp_server1_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[0]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[0], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 1
//void protocol_w5500_modbus_tcp_server2_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[1]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[1], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 2
//void protocol_w5500_modbus_tcp_server3_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[2]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[2], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 3
//void protocol_w5500_modbus_tcp_server4_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[3]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[3], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 4
//void protocol_w5500_modbus_tcp_server5_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[4]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[4], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 5
//void protocol_w5500_modbus_tcp_server6_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[5]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[5], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 6
//void protocol_w5500_modbus_tcp_server7_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[6]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[6], true);
//}
//#endif
//#if W5500_MODBUS_NUM > 7
//void protocol_w5500_modbus_tcp_server8_poll(uint32_t base_time)
//{
// //bsp_iec104_poll(&w5500_iec104_array[7]);
// bsp_modbus_poll(&w5500_modbus_tcp_array[7], true);
//}
//#endif
#if W5500_MODBUS_NUM > 0
void protocol_w5500_modbus_tcp_server1_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[0]);
bsp_modbus_poll(&w5500_modbus_tcp_array[0], true);
}
#endif
#if W5500_MODBUS_NUM > 1
void protocol_w5500_modbus_tcp_server2_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[1]);
bsp_modbus_poll(&w5500_modbus_tcp_array[1], true);
}
#endif
#if W5500_MODBUS_NUM > 2
void protocol_w5500_modbus_tcp_server3_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[2]);
bsp_modbus_poll(&w5500_modbus_tcp_array[2], true);
}
#endif
#if W5500_MODBUS_NUM > 3
void protocol_w5500_modbus_tcp_server4_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[3]);
bsp_modbus_poll(&w5500_modbus_tcp_array[3], true);
}
#endif
#if W5500_MODBUS_NUM > 4
void protocol_w5500_modbus_tcp_server5_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[4]);
bsp_modbus_poll(&w5500_modbus_tcp_array[4], true);
}
#endif
#if W5500_MODBUS_NUM > 5
void protocol_w5500_modbus_tcp_server6_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[5]);
bsp_modbus_poll(&w5500_modbus_tcp_array[5], true);
}
#endif
#if W5500_MODBUS_NUM > 6
void protocol_w5500_modbus_tcp_server7_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[6]);
bsp_modbus_poll(&w5500_modbus_tcp_array[6], true);
}
#endif
#if W5500_MODBUS_NUM > 7
void protocol_w5500_modbus_tcp_server8_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[7]);
bsp_modbus_poll(&w5500_modbus_tcp_array[7], true);
}
#endif
//const UintArgCall tcp_server_poll[W5500_MODBUS_NUM] =
//{
// protocol_w5500_modbus_tcp_server1_poll,
// protocol_w5500_modbus_tcp_server2_poll,
//
// /*
// protocol_w5500_modbus_tcp_server3_poll,
// protocol_w5500_modbus_tcp_server4_poll,
// protocol_w5500_modbus_tcp_server5_poll,
// protocol_w5500_modbus_tcp_server6_poll,
// protocol_w5500_modbus_tcp_server7_poll,
// protocol_w5500_modbus_tcp_server8_poll,
// */
//};
const UintArgCall tcp_server_poll[W5500_MODBUS_NUM] =
{
protocol_w5500_modbus_tcp_server1_poll,
protocol_w5500_modbus_tcp_server2_poll,
/*
protocol_w5500_modbus_tcp_server3_poll,
protocol_w5500_modbus_tcp_server4_poll,
protocol_w5500_modbus_tcp_server5_poll,
protocol_w5500_modbus_tcp_server6_poll,
protocol_w5500_modbus_tcp_server7_poll,
protocol_w5500_modbus_tcp_server8_poll,
*/
};

View File

@ -872,7 +872,7 @@ void protocol_build_json(uint16_t groupId)
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
cJSON_AddStringToObject(deviceObj, "sn", "SN11223344");
cJSON_AddNumberToObject(deviceObj, "currentPack", groupId);
cJSON_AddNumberToObject(deviceObj, "totalPack", 16);
@ -930,7 +930,7 @@ void protocol_build_volt_json(uint8_t i)
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
cJSON_AddStringToObject(deviceObj, "sn", "SN11223344");
cJSON_AddNumberToObject(deviceObj, "currentPack", i + 3); // 当前包数
cJSON_AddNumberToObject(deviceObj, "totalPack", 16); // 总包数
@ -984,7 +984,7 @@ void protocol_build_temp_json(uint8_t i)
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
cJSON_AddStringToObject(deviceObj, "sn", "SN11223344");
cJSON_AddNumberToObject(deviceObj, "currentPack", i + 13); // 当前包数
cJSON_AddNumberToObject(deviceObj, "totalPack", 16); // 总包数

View File

@ -107,7 +107,7 @@ void drv_eg25g_init2(void)
#define MQTT_CLIENT_ID "fc41d_client" // 客户端 ID
#define MQTT_USER "user" // MQTT 用户名
#define MQTT_PASSWORD "password" // MQTT 密码
#define MQTT_TOPIC "BCU01" // 订阅/发布的主题
#define MQTT_TOPIC "bluesun/bms/period/11223344" // 订阅/发布的主题
#define MQTT_MESSAGE "Hello from FC41D!" // 发送的消息
#define WIFI_TIMEOUT 1000

View File

@ -216,7 +216,7 @@ static uint8_t drv_ble_init()
}
//设置wifi名称必须以BSM开头后缀可以加sn码
if (!drv_at_send_cmd("AT+QBLENAME=BSM123456", "OK", WIFI_TIMEOUT))
if (!drv_at_send_cmd("AT+QBLENAME=BSM11223344", "OK", WIFI_TIMEOUT))
{
KIT_PRINTF("Failed to start BLE advertising!\r\n");
return 1;
@ -256,7 +256,7 @@ uint8_t drv_qfc41d_init(void)
#define MQTT_CLIENT_ID "fc41d_client" // 客户端 ID
#define MQTT_USER "user" // MQTT 用户名
#define MQTT_PASSWORD "password" // MQTT 密码
#define MQTT_TOPIC "BCU01" // 订阅/发布的主题
#define MQTT_TOPIC "bluesun/bms/period/11223344" // 订阅/发布的主题
#define MQTT_MESSAGE "Hello from FC41D!" // 发送的消息
// 连接 MQTT 服务器

View File

@ -1,428 +1,427 @@
///******************************************************************************
// * @file drv_w5500.c
// * @brief w5500 drivers
// * @version V1.0
// * @author Gary
// * @copyright
// ******************************************************************************/
//#include "drv_gpio.h"
//#include "drv_w5500.h"
/******************************************************************************
* @file drv_w5500.c
* @brief w5500 drivers
* @version V1.0
* @author Gary
* @copyright
******************************************************************************/
#include "drv_gpio.h"
#include "drv_w5500.h"
//#include "bsp_task.h"
#include "bsp_task.h"
//#include "kit_time.h"
//#include "kit_data.h"
//#include "kit_debug.h"
#include "kit_time.h"
#include "kit_data.h"
#include "kit_debug.h"
//#include "ucos_ii.h"
#include "ucos_ii.h"
//OS_EVENT *w5500_semaphore;
OS_EVENT *w5500_semaphore;
////void drv_w5500_init(W5500Item *item, uint32_t ip, uint16_t *port_array, uint32_t gateway_ip, uint32_t net_mask, uint8_t *mac, uint16_t timeout)
////{
//// uint8_t buf[20];
//// uint32_t cnt = 0;
////
//// item->server_port = port_array;
//// //自动协商 最高位置位否则PHY重启
//// buf[0] = 0x38 | 0x80 | 0x40;
//// drv_w5500_write_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
////
//// buf[0] = 0;
//// while(((buf[0] & 0x01) == 0x00) && (cnt++ < 50))
//// {
//// bsp_task_delay_ms(100);
//// drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
//// }
////
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 connet res %d\r\n", cnt < 100);
//// cnt = 0;
//// //设置网关IP
//// WRITE_LT_INT32U(buf, cnt, gateway_ip);
//// drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4);
////
//// //设置子网掩码
//// cnt = 0;
//// WRITE_LT_INT32U(buf, cnt, net_mask);
//// drv_w5500_write_comm_reg(item, W5500_SUBR0_REG_0x05, buf, 4);
////
//// //设置MAC 地址
//// cnt = 0;
//// kit_copy_buf(buf, mac, 6);
//// drv_w5500_write_comm_reg(item, W5500_SHAR0_REG_0x09, buf, 6);
////
//// //设置ip地址
//// cnt = 0;
//// WRITE_LT_INT32U(buf, cnt, ip);
//// drv_w5500_write_comm_reg(item, W5500_SIPR0_REG_0x0F, buf, 4);
////
//// buf[0] = timeout / 200;
//// drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 1);
////#ifdef W5500_DEBUG
//// drv_w5500_read_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4 + 4 + 6 + 4);
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 param:");
//// KIT_PRINTF_U8_BUF(buf, 4 + 4 + 6 + 4);
////#endif
//// w5500_semaphore = OSSemCreate(1);
////}
void drv_w5500_init(W5500Item *item, uint32_t ip, uint16_t *port_array, uint32_t gateway_ip, uint32_t net_mask, uint8_t *mac, uint16_t timeout)
{
uint8_t buf[20];
uint32_t cnt = 0;
item->server_port = port_array;
//自动协商 最高位置位否则PHY重启
buf[0] = 0x38 | 0x80 | 0x40;
drv_w5500_write_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
buf[0] = 0;
while(((buf[0] & 0x01) == 0x00) && (cnt++ < 50))
{
bsp_task_delay_ms(100);
drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
}
KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 connet res %d\r\n", cnt < 100);
cnt = 0;
//设置网关IP
WRITE_LT_INT32U(buf, cnt, gateway_ip);
drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4);
//设置子网掩码
cnt = 0;
WRITE_LT_INT32U(buf, cnt, net_mask);
drv_w5500_write_comm_reg(item, W5500_SUBR0_REG_0x05, buf, 4);
//设置MAC 地址
cnt = 0;
kit_copy_buf(buf, mac, 6);
drv_w5500_write_comm_reg(item, W5500_SHAR0_REG_0x09, buf, 6);
//设置ip地址
cnt = 0;
WRITE_LT_INT32U(buf, cnt, ip);
drv_w5500_write_comm_reg(item, W5500_SIPR0_REG_0x0F, buf, 4);
buf[0] = timeout / 200;
drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 1);
#ifdef W5500_DEBUG
drv_w5500_read_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4 + 4 + 6 + 4);
KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 param:");
KIT_PRINTF_U8_BUF(buf, 4 + 4 + 6 + 4);
#endif
w5500_semaphore = OSSemCreate(1);
}
////uint8_t drv_w5500_get_socket_status(W5500Item *item, uint8_t socket)
////{
//// uint8_t buf[1];
//// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
//// //读取当前socket状态
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, buf, 1);
////
//// return buf[0];
////}
uint8_t drv_w5500_get_socket_status(W5500Item *item, uint8_t socket)
{
uint8_t buf[1];
uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
//读取当前socket状态
drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, buf, 1);
return buf[0];
}
////bool drv_w5500_close_socket(W5500Item *item, uint8_t socket)
////{
//// bool res = false;
//// uint8_t tmp_buf[1];
//// uint32_t cnt;
//// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
//// //读取当前socket状态
////
//// if(item->close_call != NULL)
//// {
//// item->close_call(socket);
//// }
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d close st %x\r\n", socket, tmp_buf[0]);
//// if(tmp_buf[0] != SOCK_CLOSED)
//// {
//// tmp_buf[0] = SOCKET_CMD_CLOSE;
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
////
//// cnt = 0;
//// while((tmp_buf[0] != SOCK_CLOSED) && (cnt++ < 20))
//// {
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
//// kit_time_dly_ms(1);
//// }
//// if(cnt < 20)
//// {
//// //强制关闭一个socket
//// tmp_buf[0] = 0;
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
//// //清除socket所有中断
//// tmp_buf[0] = 0xFF;
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
//// //关闭所有中断
//// tmp_buf[0] = 0;
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
//// res = true;
//// }
//// }
////
//// return res;
////}
////MTU
//#define SOCKET_UDP_PACKSIZE 1472 //1-1472
//#define SOCKET_TCP_PACKSIZE 1460 //1-1460
//#define SOCKET_PPPOE_PACKSIZE 1464 //1-1464
//#define SOCKET_MACRAW_PACKSIZE 1514 //1-1514
//bool drv_w5500_creat_tcp_server(W5500Item *item, uint8_t socket, uint16_t local_port)
//{
// uint8_t tmp_buf[4];
// uint32_t cnt;
// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
// if(socket < W5500_MAX_SOCKET_NUM)
// {
// //尝试关闭socket
// drv_w5500_close_socket(item, socket);
// kit_time_dly_ms(1);
//
// //设置位TCP模式 无延时ACK
// tmp_buf[0] = (SOCKET_TCP & 0x07) | 0x20;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
// //设置本地端口号
// WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, local_port);
// drv_w5500_write_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
//
// drv_w5500_read_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
// KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d creat port %d\r\n", socket, READ_BT_INT16U_BY_CONST_POS(tmp_buf, 0));
// //打开socket
// tmp_buf[0] = SOCKET_CMD_OPEN;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
//
// cnt = 0;
// while((tmp_buf[0] != SOCK_INIT) && (cnt++ < 50))
// {
// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
// //KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
// kit_time_dly_ms(1);
// }
// if(cnt < 50)
// {
// //监听socket
// tmp_buf[0] = SOCKET_CMD_LISTEN;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
//
// for(cnt = 0; cnt < 40; cnt++)
// {
// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
// //KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
// if(tmp_buf[0] == SOCK_LISTEN)
// {
// //设置MTU
// WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, SOCKET_TCP_PACKSIZE);
// drv_w5500_write_socket_reg(item, socket_reg, Sn_MSSR_0x12, tmp_buf, 2);
// //心跳包间隔
// tmp_buf[0] = 1;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_KPALVTR_0x2F, tmp_buf, 1);
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register success\r\n", socket);
// //清除socket所有中断
// tmp_buf[0] = 0xFF;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
// //关闭所有中断
// tmp_buf[0] = 0xFF;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
// tmp_buf[0] = 1;
// drv_w5500_read_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d ir %d \r\n", socket, tmp_buf[0]);
// return true;
// }
// kit_time_dly_ms(100);
// }
// }
// }
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register fail\r\n", socket);
// return false;
//}
//bool drv_w5500_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
//{
// bool res = false;
// uint8_t buf[3], err;
//
// buf[0] = reg >> 8;
// buf[1] = (uint8_t)reg;
// buf[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
// OSSemPend(w5500_semaphore, 500, &err);
// if(err == OS_ERR_NONE)
// {
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
// OSSemPost(w5500_semaphore);
// }
//
// return res;
//}
////len > 实际长度 + 3
//bool drv_w5500_dma_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
//{
// bool res = false;
// uint32_t i;
// uint8_t err;
//
// value[0] = reg >> 8;
// value[1] = (uint8_t)reg;
// value[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
// OSSemPend(w5500_semaphore, 500, &err);
// if(err == OS_ERR_NONE)
// {
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res = (drv_spi_dma_sync_receive(item->spi, value, len + 3) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
// OSSemPost(w5500_semaphore);
//
// for(i = 0 ; i < len; i++)
// {
// value[i] = value[i + 3];
// }
// }
// return res;
//}
//bool drv_w5500_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
//{
// bool res = false;
// uint8_t buf[3], err;
//
// buf[0] = reg >> 8;
// buf[1] = reg;
// buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
// OSSemPend(w5500_semaphore, 500, &err);
// if(err == OS_ERR_NONE)
// {
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
// res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
//
// OSSemPost(w5500_semaphore);
// }
//
// return res;
//}
bool drv_w5500_close_socket(W5500Item *item, uint8_t socket)
{
bool res = false;
uint8_t tmp_buf[1];
uint32_t cnt;
uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
//读取当前socket状态
if(item->close_call != NULL)
{
item->close_call(socket);
}
drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d close st %x\r\n", socket, tmp_buf[0]);
if(tmp_buf[0] != SOCK_CLOSED)
{
tmp_buf[0] = SOCKET_CMD_CLOSE;
drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
cnt = 0;
while((tmp_buf[0] != SOCK_CLOSED) && (cnt++ < 20))
{
drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
kit_time_dly_ms(1);
}
if(cnt < 20)
{
//强制关闭一个socket
tmp_buf[0] = 0;
drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
//清除socket所有中断
tmp_buf[0] = 0xFF;
drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
//关闭所有中断
tmp_buf[0] = 0;
drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
res = true;
}
}
return res;
}
//bool drv_w5500_dma_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
//{
// bool res = false;
// uint8_t w5500_send_buf[300], err;
// if(len + 3 < 300)
// {
// w5500_send_buf[0] = reg >> 8;
// w5500_send_buf[1] = reg;
// w5500_send_buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
// kit_copy_buf(&w5500_send_buf[3], value, len);
//
// OSSemPend(w5500_semaphore, 0, &err);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res = (drv_spi_dma_sync_send(item->spi, w5500_send_buf, len + 3) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
// OSSemPost(w5500_semaphore);
// }
//
// return res;
//}
#define SOCKET_UDP_PACKSIZE 1472 //1-1472
#define SOCKET_TCP_PACKSIZE 1460 //1-1460
#define SOCKET_PPPOE_PACKSIZE 1464 //1-1464
#define SOCKET_MACRAW_PACKSIZE 1514 //1-1514
bool drv_w5500_creat_tcp_server(W5500Item *item, uint8_t socket, uint16_t local_port)
{
uint8_t tmp_buf[4];
uint32_t cnt;
uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
if(socket < W5500_MAX_SOCKET_NUM)
{
//尝试关闭socket
drv_w5500_close_socket(item, socket);
kit_time_dly_ms(1);
//设置位TCP模式 无延时ACK
tmp_buf[0] = (SOCKET_TCP & 0x07) | 0x20;
drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
//设置本地端口号
WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, local_port);
drv_w5500_write_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
drv_w5500_read_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d creat port %d\r\n", socket, READ_BT_INT16U_BY_CONST_POS(tmp_buf, 0));
//打开socket
tmp_buf[0] = SOCKET_CMD_OPEN;
drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
cnt = 0;
while((tmp_buf[0] != SOCK_INIT) && (cnt++ < 50))
{
drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
//KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
kit_time_dly_ms(1);
}
if(cnt < 50)
{
//监听socket
tmp_buf[0] = SOCKET_CMD_LISTEN;
drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
for(cnt = 0; cnt < 40; cnt++)
{
drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
//KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
if(tmp_buf[0] == SOCK_LISTEN)
{
//设置MTU
WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, SOCKET_TCP_PACKSIZE);
drv_w5500_write_socket_reg(item, socket_reg, Sn_MSSR_0x12, tmp_buf, 2);
//心跳包间隔
tmp_buf[0] = 1;
drv_w5500_write_socket_reg(item, socket_reg, Sn_KPALVTR_0x2F, tmp_buf, 1);
KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register success\r\n", socket);
//清除socket所有中断
tmp_buf[0] = 0xFF;
drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
//关闭所有中断
tmp_buf[0] = 0xFF;
drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
tmp_buf[0] = 1;
drv_w5500_read_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d ir %d \r\n", socket, tmp_buf[0]);
return true;
}
kit_time_dly_ms(100);
}
}
}
KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register fail\r\n", socket);
return false;
}
bool drv_w5500_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
{
bool res = false;
uint8_t buf[3], err;
buf[0] = reg >> 8;
buf[1] = (uint8_t)reg;
buf[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
OSSemPend(w5500_semaphore, 500, &err);
if(err == OS_ERR_NONE)
{
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
OSSemPost(w5500_semaphore);
}
return res;
}
bool drv_w5500_dma_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
{
bool res = false;
uint32_t i;
uint8_t err;
value[0] = reg >> 8;
value[1] = (uint8_t)reg;
value[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
OSSemPend(w5500_semaphore, 500, &err);
if(err == OS_ERR_NONE)
{
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res = (drv_spi_dma_sync_receive(item->spi, value, len + 3) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
OSSemPost(w5500_semaphore);
for(i = 0 ; i < len; i++)
{
value[i] = value[i + 3];
}
}
return res;
}
bool drv_w5500_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
{
bool res = false;
uint8_t buf[3], err;
buf[0] = reg >> 8;
buf[1] = reg;
buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
OSSemPend(w5500_semaphore, 500, &err);
if(err == OS_ERR_NONE)
{
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
OSSemPost(w5500_semaphore);
}
return res;
}
//bool drv_w5500_read_comm_reg(W5500Item *item, uint16_t reg, uint8_t *value, uint16_t len)
//{
// bool res = false;
// uint8_t buf[3];
//
// buf[0] = reg >> 8;
// buf[1] = reg;
// buf[2] = SELECT_GREG_00 | W5500_READ_ACCESS_MODE;
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
//
// return res;
//}
//bool drv_w5500_write_comm_reg(W5500Item *item, uint8_t reg, uint8_t *value, uint16_t len)
//{
// bool res = true;
// uint8_t buf[3];
//
// buf[0] = reg >> 8;
// buf[1] = reg;
// buf[2] = SELECT_GREG_00 | W5500_WRITE_ACCESS_MODE;
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
// res &= (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
// res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
//
// return res;
//}
bool drv_w5500_dma_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
{
bool res = false;
uint8_t w5500_send_buf[300], err;
if(len + 3 < 300)
{
w5500_send_buf[0] = reg >> 8;
w5500_send_buf[1] = reg;
w5500_send_buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
kit_copy_buf(&w5500_send_buf[3], value, len);
OSSemPend(w5500_semaphore, 0, &err);
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res = (drv_spi_dma_sync_send(item->spi, w5500_send_buf, len + 3) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
OSSemPost(w5500_semaphore);
}
return res;
}
//void drv_w5500_poll(W5500Item *item)
//{
// static uint8_t link_off_cnt = 0;
// uint8_t socket_reg, buf[4];
// uint16_t addr, len;
// uint32_t i;
// if((item->rcv_call != NULL) && (item->server_port != NULL))
// {
// drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
// if((buf[0] & 0x01) == 0)
// {
// buf[1] = (link_off_cnt++ > 10) ? 0x80 : 0;
// }
// else
// {
// buf[1] = link_off_cnt = 0;
// }
bool drv_w5500_read_comm_reg(W5500Item *item, uint16_t reg, uint8_t *value, uint16_t len)
{
bool res = false;
uint8_t buf[3];
buf[0] = reg >> 8;
buf[1] = reg;
buf[2] = SELECT_GREG_00 | W5500_READ_ACCESS_MODE;
// for(i = 0; i < W5500_MAX_SOCKET_NUM; i++)
// {
// if(buf[1] != 0x80)
// {
// socket_reg = W5500_CREAT_SOCKET_REG(i);
// //读取w5500 socket状态
// drv_w5500_read_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 2);
// }
// else
// {
// link_off_cnt = 11;
// }
// switch(buf[1])
// {
// //建立连接后可能存在有通信数据
// case SOCK_ESTABLISHED:
// item->close_cnt[i] = 0;
// drv_w5500_read_socket_reg(item, socket_reg, Sn_RX_RSR_0x26, buf, 4);
// len = READ_BT_INT16U_BY_CONST_POS(buf, 0);
// if((len > 0) && (len < W5500_MAX_READ_BUF_SIZE))
// {
// //获取地址并读数据
// addr = READ_BT_INT16U_BY_CONST_POS(buf, 2);
// drv_w5500_dma_read_socket_reg(item, W5500_CREAT_SOCKET_READ_BUF(i), addr, item->read_buf, len);
//
// item->rcv_call(i, item->read_buf, len);
//
// addr += len;
// WRITE_BT_INT16U_BY_CONST_POS(buf, 0, addr);
// drv_w5500_write_socket_reg(item, socket_reg, Sn_RX_RD_0x28, buf, 2);
//
// buf[0] = SOCKET_CMD_RECV;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, buf, 1);
//
//// cnt = buf[0] = 1;
//// while((buf[0] != 0) && (cnt++ < 4))
//// {
//// drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_CR_0x01, buf, 1);
//// }
// }
// break;
// case SOCK_CLOSED:
// case SOCK_CLOSE_WAIT:
// if(item->close_cnt[i]++ >= 5)
// {
// if((buf[0] & 0x08) == 0x08)
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
return res;
}
bool drv_w5500_write_comm_reg(W5500Item *item, uint8_t reg, uint8_t *value, uint16_t len)
{
bool res = true;
uint8_t buf[3];
buf[0] = reg >> 8;
buf[1] = reg;
buf[2] = SELECT_GREG_00 | W5500_WRITE_ACCESS_MODE;
drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
res &= (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
return res;
}
void drv_w5500_poll(W5500Item *item)
{
static uint8_t link_off_cnt = 0;
uint8_t socket_reg, buf[4];
uint16_t addr, len;
uint32_t i;
if((item->rcv_call != NULL) && (item->server_port != NULL))
{
drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
if((buf[0] & 0x01) == 0)
{
buf[1] = (link_off_cnt++ > 10) ? 0x80 : 0;
}
else
{
buf[1] = link_off_cnt = 0;
}
for(i = 0; i < W5500_MAX_SOCKET_NUM; i++)
{
if(buf[1] != 0x80)
{
socket_reg = W5500_CREAT_SOCKET_REG(i);
//读取w5500 socket状态
drv_w5500_read_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 2);
}
else
{
link_off_cnt = 11;
}
switch(buf[1])
{
//建立连接后可能存在有通信数据
case SOCK_ESTABLISHED:
item->close_cnt[i] = 0;
drv_w5500_read_socket_reg(item, socket_reg, Sn_RX_RSR_0x26, buf, 4);
len = READ_BT_INT16U_BY_CONST_POS(buf, 0);
if((len > 0) && (len < W5500_MAX_READ_BUF_SIZE))
{
//获取地址并读数据
addr = READ_BT_INT16U_BY_CONST_POS(buf, 2);
drv_w5500_dma_read_socket_reg(item, W5500_CREAT_SOCKET_READ_BUF(i), addr, item->read_buf, len);
item->rcv_call(i, item->read_buf, len);
addr += len;
WRITE_BT_INT16U_BY_CONST_POS(buf, 0, addr);
drv_w5500_write_socket_reg(item, socket_reg, Sn_RX_RD_0x28, buf, 2);
buf[0] = SOCKET_CMD_RECV;
drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, buf, 1);
// cnt = buf[0] = 1;
// while((buf[0] != 0) && (cnt++ < 4))
// {
// buf[0] = 0x08;
// item->close_cnt[i] = 0;
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 1);
// drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_CR_0x01, buf, 1);
// }
// else
// {
// drv_w5500_close_socket(item, i);
// drv_w5500_creat_tcp_server(item, i, item->server_port[i]);
// }
// }
// break;
//
// case SOCK_LISTEN:
// item->close_cnt[i] = 0;
// break;
// case 0x80:
// drv_w5500_close_socket(item, i);
// break;
// default :
//
// break;
// }
// }
// }
//}
}
break;
case SOCK_CLOSED:
case SOCK_CLOSE_WAIT:
if(item->close_cnt[i]++ >= 5)
{
if((buf[0] & 0x08) == 0x08)
{
buf[0] = 0x08;
item->close_cnt[i] = 0;
drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 1);
}
else
{
drv_w5500_close_socket(item, i);
drv_w5500_creat_tcp_server(item, i, item->server_port[i]);
}
}
break;
case SOCK_LISTEN:
item->close_cnt[i] = 0;
break;
case 0x80:
drv_w5500_close_socket(item, i);
break;
default :
break;
}
}
}
}
//void drv_w5500_set_close_call(W5500Item *item, W5500CloseCall call)
//{
// item->close_call = call;
//}
void drv_w5500_set_close_call(W5500Item *item, W5500CloseCall call)
{
item->close_call = call;
}

View File

@ -1,214 +1,214 @@
///******************************************************************************
// * @file drv_w5500.h
// * @brief w5500 drivers
// * @version V1.0
// * @author Gary
// * @copyright
// ******************************************************************************/
//#ifndef DRV_W5500_H_
//#define DRV_W5500_H_
/******************************************************************************
* @file drv_w5500.h
* @brief w5500 drivers
* @version V1.0
* @author Gary
* @copyright
******************************************************************************/
#ifndef DRV_W5500_H_
#define DRV_W5500_H_
//#include <stdint.h>
//#include "drv_spi.h"
#include <stdint.h>
#include "drv_spi.h"
//#define W5500_PRT_EN false
//#define W5500_READ_ACCESS_MODE (0u)
//#define W5500_WRITE_ACCESS_MODE (4u)
//#define W5500_MAX_SOCKET_NUM (8u)
//#define W5500_MAX_READ_BUF_SIZE (2048u)
//#define W5500_CREAT_SOCKET_REG(socket) ((socket) << 2 | 0x01)
//#define W5500_CREAT_SOCKET_WRITE_BUF(socket) ((socket) << 2 | 0x02)
//#define W5500_CREAT_SOCKET_READ_BUF(socket) ((socket) << 2 | 0x03)
#define W5500_PRT_EN false
#define W5500_READ_ACCESS_MODE (0u)
#define W5500_WRITE_ACCESS_MODE (4u)
#define W5500_MAX_SOCKET_NUM (8u)
#define W5500_MAX_READ_BUF_SIZE (2048u)
#define W5500_CREAT_SOCKET_REG(socket) ((socket) << 2 | 0x01)
#define W5500_CREAT_SOCKET_WRITE_BUF(socket) ((socket) << 2 | 0x02)
#define W5500_CREAT_SOCKET_READ_BUF(socket) ((socket) << 2 | 0x03)
//#define Sn_IR_SEND_OK 0x10 /**< complete sending */
#define Sn_IR_SEND_OK 0x10 /**< complete sending */
////寄存器选择定义
//typedef enum
//{
// SELECT_GREG_00 = 0, //通用寄存器
// SELECT_SECKET0_01 = 1, //socket0寄存器
// SELECT_SECKET1_05 = 5, //socket1寄存器
// SELECT_SECKET2_09 = 9, //socket2寄存器
// SELECT_SECKET3_13 = 13, //socket3寄存器
// SELECT_SECKET4_17 = 17, //socket4寄存器
// SELECT_SECKET5_21 = 21, //socket5寄存器
// SELECT_SECKET6_25 = 25, //socket6寄存器
// SELECT_SECKET7_29 = 29, //socket7寄存器
// SELECT_SECKET0_TXREG_02 = 2, //socket0发送缓冲区
// SELECT_SECKET1_TXREG_06 = 6, //socket0发送缓冲区
// SELECT_SECKET2_TXREG_10 = 10, //socket0发送缓冲区
// SELECT_SECKET3_TXREG_14 = 14, //socket0发送缓冲区
// SELECT_SECKET4_TXREG_18 = 18, //socket0发送缓冲区
// SELECT_SECKET5_TXREG_22 = 22, //socket0发送缓冲区
// SELECT_SECKET6_TXREG_26 = 26, //socket0发送缓冲区
// SELECT_SECKET7_TXREG_30 = 30, //socket0发送缓冲区
// SELECT_SECKET0_RXREG_03 = 3, //socket0接收缓冲区
// SELECT_SECKET1_RXREG_07 = 7, //socket0接收缓冲区
// SELECT_SECKET2_RXREG_11 = 11, //socket0接收缓冲区
// SELECT_SECKET3_RXREG_15 = 15, //socket0接收缓冲区
// SELECT_SECKET4_RXREG_19 = 19, //socket0接收缓冲区
// SELECT_SECKET5_RXREG_23 = 23, //socket0接收缓冲区
// SELECT_SECKET6_RXREG_27 = 27, //socket0接收缓冲区
// SELECT_SECKET7_RXREG_31 = 31, //socket0接收缓冲区
//}W5500_BLOCK_SELECT;
//寄存器选择定义
typedef enum
{
SELECT_GREG_00 = 0, //通用寄存器
SELECT_SECKET0_01 = 1, //socket0寄存器
SELECT_SECKET1_05 = 5, //socket1寄存器
SELECT_SECKET2_09 = 9, //socket2寄存器
SELECT_SECKET3_13 = 13, //socket3寄存器
SELECT_SECKET4_17 = 17, //socket4寄存器
SELECT_SECKET5_21 = 21, //socket5寄存器
SELECT_SECKET6_25 = 25, //socket6寄存器
SELECT_SECKET7_29 = 29, //socket7寄存器
SELECT_SECKET0_TXREG_02 = 2, //socket0发送缓冲区
SELECT_SECKET1_TXREG_06 = 6, //socket0发送缓冲区
SELECT_SECKET2_TXREG_10 = 10, //socket0发送缓冲区
SELECT_SECKET3_TXREG_14 = 14, //socket0发送缓冲区
SELECT_SECKET4_TXREG_18 = 18, //socket0发送缓冲区
SELECT_SECKET5_TXREG_22 = 22, //socket0发送缓冲区
SELECT_SECKET6_TXREG_26 = 26, //socket0发送缓冲区
SELECT_SECKET7_TXREG_30 = 30, //socket0发送缓冲区
SELECT_SECKET0_RXREG_03 = 3, //socket0接收缓冲区
SELECT_SECKET1_RXREG_07 = 7, //socket0接收缓冲区
SELECT_SECKET2_RXREG_11 = 11, //socket0接收缓冲区
SELECT_SECKET3_RXREG_15 = 15, //socket0接收缓冲区
SELECT_SECKET4_RXREG_19 = 19, //socket0接收缓冲区
SELECT_SECKET5_RXREG_23 = 23, //socket0接收缓冲区
SELECT_SECKET6_RXREG_27 = 27, //socket0接收缓冲区
SELECT_SECKET7_RXREG_31 = 31, //socket0接收缓冲区
}W5500_BLOCK_SELECT;
////通用寄存器地址定义
//typedef enum
//{
// W5500_MODE_REG_0x00 = 0x0000, //模式寄存器
// W5500_GAR0_REG_0x01 = 0x0001, //网关地址字节1
// W5500_GAR1_REG_0x02 = 0x0002, //网关地址字节2
// W5500_GAR2_REG_0x03 = 0x0003, //网关地址字节3
// W5500_GAR3_REG_0x04 = 0x0004, //网关地址字节4
// W5500_SUBR0_REG_0x05 = 0x0005, //子网掩码字节1
// W5500_SUBR1_REG_0x06 = 0x0006, //子网掩码字节2
// W5500_SUBR2_REG_0x07 = 0x0007, //子网掩码字节3
// W5500_SUBR3_REG_0x08 = 0x0008, //子网掩码字节4
// W5500_SHAR0_REG_0x09 = 0x0009, //MAC硬件地址字节1
// W5500_SHAR1_REG_0x0A = 0x000A, //MAC硬件地址字节2
// W5500_SHAR2_REG_0x0B = 0x000B, //MAC硬件地址字节3
// W5500_SHAR3_REG_0x0C = 0x000C, //MAC硬件地址字节4
// W5500_SHAR4_REG_0x0D = 0x000D, //MAC硬件地址字节5
// W5500_SHAR5_REG_0x0E = 0x000E, //MAC硬件地址字节6
// W5500_SIPR0_REG_0x0F = 0x000F, //本地IP字节1
// W5500_SIPR1_REG_0x10 = 0x0010, //本地IP字节2
// W5500_SIPR2_REG_0x11 = 0x0011, //本地IP字节3
// W5500_SIPR3_REG_0x12 = 0x0012, //本地IP字节4
// W5500_INTLEVEL0_REG_0x13 = 0x0013, //低电平中断定时器寄存器-高字节
// W5500_INTLEVEL1_REG_0x14 = 0x0014, //低电平中断定时器寄存器-低字节
// W5500_IR_REG_0x15 = 0x0015, //中断寄存器
// W5500_IMR_REG_0x16 = 0x0016, //中断 屏蔽 寄存器
// W5500_SIR_REG_0x17 = 0x0017, //Socket 中断寄存器
// W5500_SIMR_REG_0x18 = 0x0018, //Socket 中断屏蔽寄存器
// W5500_RTR0_REG_0x19 = 0x0019, //重试时间值寄存器-高字节
// W5500_RTR1_REG_0x1A = 0x001A, //重试时间值寄存器-低字节
// W5500_RCR_REG_0x1B = 0x001B, //重试计数器
// W5500_PTIMER_REG_0x1C = 0x001C, //PPP连接控制协议请求定时寄存器
// W5500_PMAGIC_REG_0x1D = 0x001D, //PPP连接控制协议幻数寄存器
// W5500_PHAR0_REG_0x1E = 0x001E, //PPPoE 模式下目标 MAC 寄存器
// W5500_PHAR1_REG_0x1F = 0x001F, //PPPoE 模式下目标 MAC 寄存器
// W5500_PHAR2_REG_0x20 = 0x0020, //PPPoE 模式下目标 MAC 寄存器
// W5500_PHAR3_REG_0x21 = 0x0021, //PPPoE 模式下目标 MAC 寄存器
// W5500_PHAR4_REG_0x22 = 0x0022, //PPPoE 模式下目标 MAC 寄存器
// W5500_PHAR5_REG_0x23 = 0x0023, //PPPoE 模式下目标 MAC 寄存器
// W5500_PSID0_REG_0x24 = 0x0024, //PPPoE 模式下会话 ID 寄存器
// W5500_PSID1_REG_0x25 = 0x0025, //PPPoE 模式下会话 ID 寄存器
// W5500_PMRU0_REG_0x26 = 0x0026, //PPPoE模式下最大接收单元
// W5500_PMRU1_REG_0x27 = 0x0027, //PPPoE模式下最大接收单元
// W5500_UIPR0_REG_0x28 = 0x0028, //无法抵达 IP 地址寄存器
// W5500_UIPR1_REG_0x28 = 0x0029, //无法抵达 IP 地址寄存器
// W5500_UIPR2_REG_0x2A = 0x002A, //无法抵达 IP 地址寄存器
// W5500_UIPR3_REG_0x2B = 0x002B, //无法抵达 IP 地址寄存器
// W5500_UPORTR0_REG_0x2C = 0x002C, //无法抵达 端口 地址寄存器
// W5500_UPORTR1_REG_0x2D = 0x002D, //无法抵达 端口 地址寄存器
// W5500_PHYCFGR_REG_0x2E = 0x002E, //W5500 PHY 配置寄 存器
// W5500_VERSIONR_REG_0x39 = 0x0039, //芯片版本信息默认为0x04
//}W5500_REG_ADDR;
//通用寄存器地址定义
typedef enum
{
W5500_MODE_REG_0x00 = 0x0000, //模式寄存器
W5500_GAR0_REG_0x01 = 0x0001, //网关地址字节1
W5500_GAR1_REG_0x02 = 0x0002, //网关地址字节2
W5500_GAR2_REG_0x03 = 0x0003, //网关地址字节3
W5500_GAR3_REG_0x04 = 0x0004, //网关地址字节4
W5500_SUBR0_REG_0x05 = 0x0005, //子网掩码字节1
W5500_SUBR1_REG_0x06 = 0x0006, //子网掩码字节2
W5500_SUBR2_REG_0x07 = 0x0007, //子网掩码字节3
W5500_SUBR3_REG_0x08 = 0x0008, //子网掩码字节4
W5500_SHAR0_REG_0x09 = 0x0009, //MAC硬件地址字节1
W5500_SHAR1_REG_0x0A = 0x000A, //MAC硬件地址字节2
W5500_SHAR2_REG_0x0B = 0x000B, //MAC硬件地址字节3
W5500_SHAR3_REG_0x0C = 0x000C, //MAC硬件地址字节4
W5500_SHAR4_REG_0x0D = 0x000D, //MAC硬件地址字节5
W5500_SHAR5_REG_0x0E = 0x000E, //MAC硬件地址字节6
W5500_SIPR0_REG_0x0F = 0x000F, //本地IP字节1
W5500_SIPR1_REG_0x10 = 0x0010, //本地IP字节2
W5500_SIPR2_REG_0x11 = 0x0011, //本地IP字节3
W5500_SIPR3_REG_0x12 = 0x0012, //本地IP字节4
W5500_INTLEVEL0_REG_0x13 = 0x0013, //低电平中断定时器寄存器-高字节
W5500_INTLEVEL1_REG_0x14 = 0x0014, //低电平中断定时器寄存器-低字节
W5500_IR_REG_0x15 = 0x0015, //中断寄存器
W5500_IMR_REG_0x16 = 0x0016, //中断 屏蔽 寄存器
W5500_SIR_REG_0x17 = 0x0017, //Socket 中断寄存器
W5500_SIMR_REG_0x18 = 0x0018, //Socket 中断屏蔽寄存器
W5500_RTR0_REG_0x19 = 0x0019, //重试时间值寄存器-高字节
W5500_RTR1_REG_0x1A = 0x001A, //重试时间值寄存器-低字节
W5500_RCR_REG_0x1B = 0x001B, //重试计数器
W5500_PTIMER_REG_0x1C = 0x001C, //PPP连接控制协议请求定时寄存器
W5500_PMAGIC_REG_0x1D = 0x001D, //PPP连接控制协议幻数寄存器
W5500_PHAR0_REG_0x1E = 0x001E, //PPPoE 模式下目标 MAC 寄存器
W5500_PHAR1_REG_0x1F = 0x001F, //PPPoE 模式下目标 MAC 寄存器
W5500_PHAR2_REG_0x20 = 0x0020, //PPPoE 模式下目标 MAC 寄存器
W5500_PHAR3_REG_0x21 = 0x0021, //PPPoE 模式下目标 MAC 寄存器
W5500_PHAR4_REG_0x22 = 0x0022, //PPPoE 模式下目标 MAC 寄存器
W5500_PHAR5_REG_0x23 = 0x0023, //PPPoE 模式下目标 MAC 寄存器
W5500_PSID0_REG_0x24 = 0x0024, //PPPoE 模式下会话 ID 寄存器
W5500_PSID1_REG_0x25 = 0x0025, //PPPoE 模式下会话 ID 寄存器
W5500_PMRU0_REG_0x26 = 0x0026, //PPPoE模式下最大接收单元
W5500_PMRU1_REG_0x27 = 0x0027, //PPPoE模式下最大接收单元
W5500_UIPR0_REG_0x28 = 0x0028, //无法抵达 IP 地址寄存器
W5500_UIPR1_REG_0x28 = 0x0029, //无法抵达 IP 地址寄存器
W5500_UIPR2_REG_0x2A = 0x002A, //无法抵达 IP 地址寄存器
W5500_UIPR3_REG_0x2B = 0x002B, //无法抵达 IP 地址寄存器
W5500_UPORTR0_REG_0x2C = 0x002C, //无法抵达 端口 地址寄存器
W5500_UPORTR1_REG_0x2D = 0x002D, //无法抵达 端口 地址寄存器
W5500_PHYCFGR_REG_0x2E = 0x002E, //W5500 PHY 配置寄 存器
W5500_VERSIONR_REG_0x39 = 0x0039, //芯片版本信息默认为0x04
}W5500_REG_ADDR;
////socket n寄存器
//typedef enum
//{
// Sn_MR_0x00 = 0x0000, //模式寄存器
// Sn_CR_0x01 = 0x0001, //配置寄存器
// Sn_IR_0x02 = 0X0002, //中断寄存器
// Sn_SR_0x03 = 0X0003, //状态寄存器
// Sn_PORT_0x04 = 0X0004, //源端口寄存器
// Sn_DHAR_0x06 = 0X0006, //目的MAC地址寄存器
// Sn_DIPR_0x0C = 0X000C, //目标IP地址寄存器
// Sn_DPORT_0x10 = 0X0010, //目标端口寄存器
// Sn_MSSR_0x12 = 0X0012, //最大分段寄存器
// Sn_TOS_0x15 = 0X0015, //服务类型寄存器
// Sn_TTL_0x16 = 0X0016, //生存时间寄存器
// Sn_RXBUFF_SIZE_0x1E = 0X001E, //接收缓冲区大小寄存器
// Sn_TXBUFF_SIZE_0x1F = 0X001F, //发送缓冲区大小寄存器
// Sn_TX_FSR_0x20 = 0X0020, //空闲发送缓存寄存器
// Sn_TX_RD_0x22 = 0X0022, //发送读指针寄存器
// Sn_TX_WR_0x24 = 0X0024, //发送写指针寄存器
// Sn_RX_RSR_0x26 = 0X0026, //空闲接收缓存寄存器
// Sn_RX_RD_0x28 = 0X0028, //接收读指针寄存器
// Sn_RX_WR_0x2A = 0X002A, //接收写指针寄存器
// Sn_IMR_0x2C = 0X002C, //中断屏蔽寄存器
// Sn_FRAG_0x2D = 0X002D, //分段寄存器
// Sn_KPALVTR_0x2F = 0X002F, //在线时间寄存器
//}W5500_SOCKET_REG;
//socket n寄存器
typedef enum
{
Sn_MR_0x00 = 0x0000, //模式寄存器
Sn_CR_0x01 = 0x0001, //配置寄存器
Sn_IR_0x02 = 0X0002, //中断寄存器
Sn_SR_0x03 = 0X0003, //状态寄存器
Sn_PORT_0x04 = 0X0004, //源端口寄存器
Sn_DHAR_0x06 = 0X0006, //目的MAC地址寄存器
Sn_DIPR_0x0C = 0X000C, //目标IP地址寄存器
Sn_DPORT_0x10 = 0X0010, //目标端口寄存器
Sn_MSSR_0x12 = 0X0012, //最大分段寄存器
Sn_TOS_0x15 = 0X0015, //服务类型寄存器
Sn_TTL_0x16 = 0X0016, //生存时间寄存器
Sn_RXBUFF_SIZE_0x1E = 0X001E, //接收缓冲区大小寄存器
Sn_TXBUFF_SIZE_0x1F = 0X001F, //发送缓冲区大小寄存器
Sn_TX_FSR_0x20 = 0X0020, //空闲发送缓存寄存器
Sn_TX_RD_0x22 = 0X0022, //发送读指针寄存器
Sn_TX_WR_0x24 = 0X0024, //发送写指针寄存器
Sn_RX_RSR_0x26 = 0X0026, //空闲接收缓存寄存器
Sn_RX_RD_0x28 = 0X0028, //接收读指针寄存器
Sn_RX_WR_0x2A = 0X002A, //接收写指针寄存器
Sn_IMR_0x2C = 0X002C, //中断屏蔽寄存器
Sn_FRAG_0x2D = 0X002D, //分段寄存器
Sn_KPALVTR_0x2F = 0X002F, //在线时间寄存器
}W5500_SOCKET_REG;
////SOCKET状态
//typedef enum
//{
// SOCK_CLOSED = 0x00, //关闭状态
// SOCK_INIT = 0x13, //初始化
// SOCK_LISTEN = 0x14, //监听
// SOCK_ESTABLISHED= 0x17, //TCP客户端连接成功
// SOCK_CLOSE_WAIT = 0x1C, //接收到断开指令
// SOCK_UDP = 0x22, //UDP模式下,open
// SOCK_MACRAW = 0x42, //MACRAW模式
// SOCK_SYNSENT = 0x15, //已经发送连接请求
// SOCK_SYNRECV = 0x16, //接收到连接成功指令
// SOCK_FIN_WAIT = 0x18, //正在关闭socket
// SOCK_CLOSING = 0x1A, //正在关闭socket
// SOCK_TIME_WAIT = 0x1B, //超时关闭socket
// SOCK_LAST_ACK = 0x1D, //socket处于关闭状态
//}W5500_SOCKET_STATUS;
//SOCKET状态
typedef enum
{
SOCK_CLOSED = 0x00, //关闭状态
SOCK_INIT = 0x13, //初始化
SOCK_LISTEN = 0x14, //监听
SOCK_ESTABLISHED= 0x17, //TCP客户端连接成功
SOCK_CLOSE_WAIT = 0x1C, //接收到断开指令
SOCK_UDP = 0x22, //UDP模式下,open
SOCK_MACRAW = 0x42, //MACRAW模式
SOCK_SYNSENT = 0x15, //已经发送连接请求
SOCK_SYNRECV = 0x16, //接收到连接成功指令
SOCK_FIN_WAIT = 0x18, //正在关闭socket
SOCK_CLOSING = 0x1A, //正在关闭socket
SOCK_TIME_WAIT = 0x1B, //超时关闭socket
SOCK_LAST_ACK = 0x1D, //socket处于关闭状态
}W5500_SOCKET_STATUS;
////socket命令
//typedef enum
//{
// SOCKET_CMD_OPEN = 0x01, //open
// SOCKET_CMD_LISTEN = 0x02, //LISTEN
// SOCKET_CMD_CONHECT = 0x04,
// SOCKET_CMD_DISCON = 0x08,
// SOCKET_CMD_CLOSE = 0x10,
// SOCKET_CMD_SEND = 0x20,
// SOCKET_CMD_SEND_MAC = 0x21,
// SOCKET_CMD_SEND_KEEP= 0x22,
// SOCKET_CMD_RECV = 0x40,
//}W5500_SOCKET_CMD;
//socket命令
typedef enum
{
SOCKET_CMD_OPEN = 0x01, //open
SOCKET_CMD_LISTEN = 0x02, //LISTEN
SOCKET_CMD_CONHECT = 0x04,
SOCKET_CMD_DISCON = 0x08,
SOCKET_CMD_CLOSE = 0x10,
SOCKET_CMD_SEND = 0x20,
SOCKET_CMD_SEND_MAC = 0x21,
SOCKET_CMD_SEND_KEEP= 0x22,
SOCKET_CMD_RECV = 0x40,
}W5500_SOCKET_CMD;
//typedef enum
//{
// SOCKET_CLOSED = 0,
// SOCKET_TCP = 1,
// SOCKET_UDP = 2,
// SOCKET_MACRAW = 3,
//}W5500_PROTOCOL;
typedef enum
{
SOCKET_CLOSED = 0,
SOCKET_TCP = 1,
SOCKET_UDP = 2,
SOCKET_MACRAW = 3,
}W5500_PROTOCOL;
//typedef void (*W5500RcvCall)(uint8_t socket, uint8_t *buf, uint16_t len);
//typedef void (*W5500CloseCall)(uint8_t socket);
typedef void (*W5500RcvCall)(uint8_t socket, uint8_t *buf, uint16_t len);
typedef void (*W5500CloseCall)(uint8_t socket);
//typedef struct
//{
// uint8_t cs;
// SpiDev spi;
// W5500RcvCall rcv_call;
// uint16_t *server_port;
// W5500CloseCall close_call;
// uint8_t close_cnt[W5500_MAX_SOCKET_NUM];
// uint8_t read_buf[W5500_MAX_READ_BUF_SIZE];
//}W5500Item;
typedef struct
{
uint8_t cs;
SpiDev spi;
W5500RcvCall rcv_call;
uint16_t *server_port;
W5500CloseCall close_call;
uint8_t close_cnt[W5500_MAX_SOCKET_NUM];
uint8_t read_buf[W5500_MAX_READ_BUF_SIZE];
}W5500Item;
//#define W5500_STATIC_INIT(_name, _spi, _cs, _rcv_call) \
// W5500Item _name = \
// { \
// (_cs), \
// (_spi), \
// (_rcv_call), \
// }
#define W5500_STATIC_INIT(_name, _spi, _cs, _rcv_call) \
W5500Item _name = \
{ \
(_cs), \
(_spi), \
(_rcv_call), \
}
//void drv_w5500_init(W5500Item *item, uint32_t ip, uint16_t *port_array, uint32_t gateway_ip, uint32_t net_mask, uint8_t *mac, uint16_t timeout);
//void drv_w5500_poll(W5500Item *item);
//bool drv_w5500_creat_tcp_server(W5500Item *item, uint8_t socket, uint16_t local_port);
//
//bool drv_w5500_read_comm_reg(W5500Item *item, uint16_t reg, uint8_t *value, uint16_t len);
//bool drv_w5500_write_comm_reg(W5500Item *item, uint8_t reg, uint8_t *value, uint16_t len);
//bool drv_w5500_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
//bool drv_w5500_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
//bool drv_w5500_dma_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
//bool drv_w5500_dma_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
//
//uint8_t drv_w5500_get_socket_status(W5500Item *item, uint8_t socket);
//bool drv_w5500_close_socket(W5500Item *item, uint8_t socket);
//void drv_w5500_set_close_call(W5500Item *item, W5500CloseCall call);
void drv_w5500_init(W5500Item *item, uint32_t ip, uint16_t *port_array, uint32_t gateway_ip, uint32_t net_mask, uint8_t *mac, uint16_t timeout);
void drv_w5500_poll(W5500Item *item);
bool drv_w5500_creat_tcp_server(W5500Item *item, uint8_t socket, uint16_t local_port);
bool drv_w5500_read_comm_reg(W5500Item *item, uint16_t reg, uint8_t *value, uint16_t len);
bool drv_w5500_write_comm_reg(W5500Item *item, uint8_t reg, uint8_t *value, uint16_t len);
bool drv_w5500_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
bool drv_w5500_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
bool drv_w5500_dma_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
bool drv_w5500_dma_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len);
uint8_t drv_w5500_get_socket_status(W5500Item *item, uint8_t socket);
bool drv_w5500_close_socket(W5500Item *item, uint8_t socket);
void drv_w5500_set_close_call(W5500Item *item, W5500CloseCall call);
//#endif
#endif