forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/app/comm_manager.c

331 lines
11 KiB
C

#include "ucos_ii.h"
#include "drv_uart.h"
#include "bsp_can.h"
#include "bsp_task.h"
#include "bsp_queue.h"
#include "version_manager.h"
#include "gpio_manager.h"
#include "comm_manager.h"
#include "flash_manager.h"
#include "eeprom_manager.h"
#include "kit_data.h"
#include "kit_debug.h"
#include "bsp_hmi.h"
#include "drv_w5500.h"
#define APP_HMI_BUF_SIZE (1024 * 4)
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);
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;
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);
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;
}
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 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;
ip = 2831155300;//get_eeprom_data(kEEData_Eth1IPAddr2_1, kEepromDataType_Double);
net_mask = 4294967040;//get_eeprom_data(kEEData_Eth1Mask2_1, kEepromDataType_Double);
gateway_ip = 2831155201;//= 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));
QUEUE_STATIC_INIT_CCM(exter_can_queue, 150, sizeof(CanMsg));
static void can_ctrl_rx_int(uint8_t comm_dev, bool is_en)
{
drv_can_ctrl_interrupt((can_dev_e)comm_dev, kcan_interrupt_e_Rx, is_en);
}
static void inter_can_tx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_can_async_poll(INTER_CAN_PORT);
OS_TRACE_ISR_EXIT();
}
static void exter_can_tx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_can_async_poll(EXTER_CAN_PORT);
OS_TRACE_ISR_EXIT();
}
/************************************************UART接口***************************************************/
//const GpioType rs485_tx_en_map[3] = {kGpioType_RS485_Ch1_Tx_En, kGpioType_RS485_Ch2_Tx_En, kGpioType_Rs485_Ch2_TxEn2};
//const GpioType rs485_tx_en_map[3] = {kGpioType_RS485_Ch1_Tx_En, kGpioType_RS485_Ch2_Tx_En,kGpioType_RS485_Ch3_Tx_En};
const GpioType rs485_tx_en_map[4] = {kGpioType_RS485_Ch1_Tx_En,kGpioType_RS485_Ch2_Tx_En,kGpioType_RS485_Ch2_Tx_En,kGpioType_RS485_Ch3_Tx_En};
static void uart_ctrl_rx_int(uint8_t comm_dev, bool is_en)
{
drv_uart_ctrl_interrupt((UartDev)comm_dev, kUartInterrupt_Rx, is_en);
}
static bool uart_async_send(uint8_t comm_dev, uint8_t *buf, int32_t len)
{
bool res = false;
if((comm_dev < 4) && ((len < APP_HMI_BUF_SIZE)))
{
drv_gpio_set_pin_status(rs485_tx_en_map[comm_dev], kGpioStatus_High);
drv_uart_int_async_send((UartDev)comm_dev, buf, len);
}
return res;
}
/*********************************************MODBUS实例***************************************************/
QUEUE_STATIC_INIT_CCM(bmu_can_queue, 150, sizeof(CanMsg));
static void inter_can_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_queue_push_instance(&inter_can_queue, data);
OS_TRACE_ISR_EXIT();
}
static void exter_can_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_queue_push_instance(&exter_can_queue, data);
OS_TRACE_ISR_EXIT();
}
/*********************************************MODBUS实例***************************************************/
extern EEpromItem eeprom_item;
GATE_STATIC_INIT2_CCM(modbus_gate, 200, (kEep_GateDataEnd - kEep_GateDataStart));
//参数配置和设置中断条件
MODBUS_RTU_STATIC_INIT_CCM(inter_uart_modbus, 0x01, INTER_UART_PORT, uart_async_send, uart_ctrl_rx_int, &modbus_gate);
MODBUS_RTU_STATIC_INIT_CCM(exter_uart1_modbus, 0x01, EXTER_UART1_PORT, uart_async_send, uart_ctrl_rx_int, &modbus_gate);
MODBUS_RTU_STATIC_INIT_CCM(exter_uart2_modbus, 0x01, EXTER_UART2_PORT, uart_async_send, uart_ctrl_rx_int, &modbus_gate);
ModbusItem *modbus_rtu_array[kModbusIdx_End] = {&inter_uart_modbus, &exter_uart1_modbus,&exter_uart2_modbus};
uint16_t bms_get_gate_read_data_idx(void)
{
return modbus_gate.read_buf_idx;
}
uint16_t bms_get_gate_write_data_idx(void)
{
return modbus_gate.write_buf_idx;
}
uint16_t bms_get_gate_read_data(uint16_t addr)
{
return modbus_gate.read_buf[addr];
}
uint16_t bms_set_gate_write_data(uint16_t addr, uint16_t value)
{
uint32_t cnt;
if(bsp_gate_set_data(&modbus_gate, addr, value) == true)
{
cnt = 0;
while((bsp_gate_has_data_change(&modbus_gate, addr) == true) && (cnt++ < 300))
{
bsp_task_delay_ms(10);
}
}
value = bsp_gate_get_write_data(&modbus_gate, addr);
return value;
}
uint32_t bms_fill_gate_read_data(uint8_t *buf)
{
kit_copy_buf(buf, modbus_gate.read_buf, modbus_gate.read_buf_idx << 1);
return modbus_gate.read_buf_idx << 1;
}
uint32_t bms_fill_gate_write_data(uint8_t *buf)
{
kit_copy_buf(buf, modbus_gate.write_buf, modbus_gate.write_buf_idx << 1);
return modbus_gate.write_buf_idx << 1;
}
static uint8_t buff[8] = {0};
static uint8_t pos = 0;
//中断回调函数
static void inter_uart_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_modbus_push_data(&inter_uart_modbus, data, 1);
OS_TRACE_ISR_EXIT();
}
static void exter_uart1_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_modbus_push_data(&exter_uart1_modbus, data, 1);
OS_TRACE_ISR_EXIT();
}
static void exter_uart2_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
bsp_modbus_push_data(&exter_uart2_modbus, data, 1);
OS_TRACE_ISR_EXIT();
}
static void uart_tx_it_call(kit_ret_e res, void *data)
{
uint8_t dev = *(uint8_t *)data;
OS_TRACE_ISR_ENTER();
if(dev < 4)
{
drv_gpio_set_pin_status(rs485_tx_en_map[dev], kGpioStatus_Low);
}
OS_TRACE_ISR_EXIT();
}
typedef enum
{
kUartParity_None,
kUartParity_Odd,
kUartParity_Even,
kUartParity_End,
}UartParity;
const uint16_t uart_parity[kUartParity_End] = {0x0000, 0x0007, 0x0005};
const uint32_t uart_baudrate[kR485BaudRateEnd] = {4800, 9600, 19200, 38400, 115200};
void bms_init_comm(void)
{
uint32_t i, tmp, prop;
tmp = bms_get_tag_data(kTagData_DevAddr);
modbus_gate.is_write_check = true;
modbus_gate.write_buf = &eeprom_item.data_buf[kEep_GateDataStart];
bsp_eeprom_set_data(kEep_Inter485Parity_Baudrate,1,kEepromDataType_Low);
bsp_eeprom_set_data(kEep_Exter485_2Parity_Baudrate,1,kEepromDataType_Low);
for(i = 0; i < BMS_485_CHANNEL; i++)
{
tmp = get_eeprom_data(kEep_Inter485Parity_Baudrate + i, kEepromDataType_Low);
if(tmp >= kR485BaudRateEnd)
{
tmp = 0;
}
prop = get_eeprom_data(kEep_Inter485Parity_Baudrate + i, kEepromDataType_High);
prop = (prop < kUartParity_End) ? uart_parity[prop] : 0;
drv_uart_init((UartDev)modbus_rtu_array[i]->comm_dev, 115200, 0 | UART_CFG_STOP_BIT_1, kGpioType_Rs485_Ch1_Tx + (i << 1), kGpioType_Rs485_Ch1_Rx + (i << 1));
drv_uart_set_interrupt((UartDev)modbus_rtu_array[i]->comm_dev, kUartInterrupt_Tx, APP_CFG_INT_PRIO_UART2_RX, uart_tx_it_call);//设置中断回调
}
drv_uart_set_interrupt(INTER_UART_PORT, kUartInterrupt_Rx, APP_CFG_INT_PRIO_UART2_RX, inter_uart_rx_it_call);
drv_uart_set_interrupt(EXTER_UART1_PORT, kUartInterrupt_Rx, APP_CFG_INT_PRIO_UART2_RX, exter_uart1_rx_it_call);
drv_uart_set_interrupt(EXTER_UART2_PORT, kUartInterrupt_Rx, APP_CFG_INT_PRIO_UART2_RX, exter_uart2_rx_it_call);
drv_can_init(INTER_CAN_PORT, 250, kGpioType_Can_Ch1_Rx, kGpioType_Can_Ch1_Tx);
drv_can_set_interrupt(INTER_CAN_PORT, kcan_interrupt_e_Rx, APP_CFG_INT_PRIO_CAN1_RX, inter_can_rx_it_call);
drv_can_set_interrupt(INTER_CAN_PORT, kcan_interrupt_e_Tx, APP_CFG_INT_PRIO_CAN1_TX, inter_can_tx_it_call);
drv_can_init(EXTER_CAN_PORT, 250, kGpioType_Can_Ch2_Rx, kGpioType_Can_Ch2_Tx);
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);
//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);
}