Files
RCU_C1P_Module/MCU_Driver/blv_rs485_protocol.c
caocong d2d8800788 feat:新建项目文件
BLV主机C1P模块
2025-12-06 13:49:01 +08:00

1662 lines
70 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* blv_rs485_protocol.c
*
* Created on: Nov 10, 2025
* Author: cc
*/
#include "includes.h"
#include <string.h>
BLV_BUS_Manage_G BUS485_Info;
BLV_ACTIVE_Manage_G Act485_Info;
BLV_POLL_Manage_G Poll485_Info;
BLV_NORDEV_Manage_G NorDevInfoGlobal; /*普通设备全局变量*/
uint8_t rs485_temp_buff[612];
/*******************************************************************************
* Function Name : Add_BUS_Device_To_List
* Description : 添加BUS设备到链表
* Input :
dev_info : 添加的设备公共数据
dev_data : 设备的私有数据
data_len :设备私有数据长度
* Return : None
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Add_BUS_Device_To_List(
Device_Public_Information_G *dev_info,
uint8_t *dev_data,
uint16_t data_len)
{
/*向设备链表添加BUS485设备*/
dev_info->data_len = data_len + Dev_Privately; //设备私有数据长度加上公共数据
uint32_t list_addr = SRAM_Read_DW(SRAM_BUS_Device_List_Addr); //获取设备信息保存地址
if((list_addr < SRAM_Device_List_Start_Addr) || (list_addr > SRAM_Device_List_End_Addr)) list_addr = SRAM_Device_List_Start_Addr;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
memcpy(rs485_temp_buff,(uint8_t *)dev_info,Dev_Privately);
memcpy(&rs485_temp_buff[Dev_Privately],(uint8_t *)dev_data,data_len);
dev_info->check = 0x00;
dev_info->check = Data_CheckSum(rs485_temp_buff,dev_info->data_len);
SRAM_DMA_Write_Buff(rs485_temp_buff,dev_info->data_len,list_addr);
// /*添加公有数据*/
// SRAM_DMA_Write_Buff(rs485_temp_buff,Dev_Privately,list_addr);
//
// /*添加设备私有变量*/
// SRAM_DMA_Write_Buff(dev_data,data_len,list_addr+Dev_Privately);
//
// /*计算校验值*/
// check_val = Dev_CheckSum(list_addr,dev_info->data_len);
// SRAM_Write_Byte(check_val,list_addr+Dev_Check); //校验值重新写入
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"data_len :%d ,dev Buffer:" , write_len);
// for(uint16_t i = 0;i < write_len;i++)
// {
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%02X " , SRAM_Read_Byte(list_addr + i));
// }
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"\r\n");
/*设备添加完毕,设备链表地址偏移*/
list_addr += SRAM_Device_List_Size;
SRAM_Write_DW(list_addr,SRAM_BUS_Device_List_Addr);
}
/*******************************************************************************
* Function Name : Add_POLL_Device_To_List
* Description : 添加轮询设备到链表
* Input :
dev_info : 添加的设备公共数据
dev_data :设备的私有数据
addr : 设备私有数据长度
* Return : None
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Add_POLL_Device_To_List(
Device_Public_Information_G *dev_info,
uint8_t *dev_data,
uint16_t data_len)
{
/*向设备链表添加POLL485设备*/
dev_info->data_len = data_len + Dev_Privately; //设备私有数据长度加上公共数据
uint32_t list_addr = SRAM_Read_DW(SRAM_POLL_Device_List_Addr); //获取设备信息保存地址
uint32_t Start_addr = SRAM_Read_DW(SRAM_BUS_Device_List_Addr); //获取轮询设备信息起始地址
if((Start_addr < SRAM_Device_List_Start_Addr) || (Start_addr > SRAM_Device_List_End_Addr))
{
Start_addr = SRAM_Device_List_Start_Addr;
SRAM_Write_DW(Start_addr,SRAM_BUS_Device_List_Addr);
}
if( (list_addr < Start_addr) || (list_addr > SRAM_Device_List_End_Addr)) list_addr = Start_addr;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
memcpy(rs485_temp_buff,(uint8_t *)dev_info,Dev_Privately);
memcpy(&rs485_temp_buff[Dev_Privately],(uint8_t *)dev_data,data_len);
dev_info->check = 0x00;
dev_info->check = Data_CheckSum(rs485_temp_buff,dev_info->data_len);
SRAM_DMA_Write_Buff(rs485_temp_buff,dev_info->data_len,list_addr);
// /*清空数据*/
// for(uint16_t i = 0;i<SRAM_Device_List_Size;i++)
// {
// SRAM_Write_Byte(0x00,list_addr+i);
// }
//
// /*添加公有数据*/
// SRAM_DMA_Write_Buff((uint8_t *)dev_info,Dev_Privately,list_addr);
//
// /*添加485设备的回调函数*/
// SRAM_Write_DW(dev_info->polling_cf,list_addr+Dev_Polling_CF);
//
// SRAM_Write_DW(dev_info->processing_cf,list_addr+Dev_Processing_CF);
//
// /*添加设备私有变量*/
// SRAM_DMA_Write_Buff(dev_data,data_len,list_addr+Dev_Privately);
//
// /*计算校验值*/
// dev_info->check = Dev_CheckSum(list_addr,dev_info->data_len);
// SRAM_Write_Byte(dev_info->check,list_addr+Dev_Check); //校验值重新写入
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"data_len :%d ,dev Buffer:" , write_len);
// for(uint16_t i = 0;i < write_len;i++)
// {
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%02X " , SRAM_Read_Byte(list_addr + i));
// }
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"\r\n");
/*设备添加完毕,设备链表地址偏移*/
list_addr += SRAM_Device_List_Size;
SRAM_Write_DW(list_addr,SRAM_POLL_Device_List_Addr);
}
/*******************************************************************************
* Function Name : Add_ACT_Device_To_List2
* Description : 添加主动设备到链表
* Input :
dev_info : 添加的设备公共数据
dev_data :设备的私有数据
addr : 设备私有数据长度
* Return : None
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Add_ACT_Device_To_List(
Device_Public_Information_G *dev_info,
uint8_t *dev_data,
uint16_t data_len)
{
/*向设备链表添加POLL485设备*/
dev_info->check = 0x00;
dev_info->data_len = data_len + Dev_Privately; //设备私有数据长度加上公共数据
uint32_t list_addr = SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr); //获取设备信息保存地址
uint32_t Start_addr = SRAM_Read_DW(SRAM_POLL_Device_List_Addr); //获取轮询设备信息起始地址
if((Start_addr < SRAM_Device_List_Start_Addr) || (Start_addr > SRAM_Device_List_End_Addr))
{
Start_addr = SRAM_Device_List_Start_Addr;
SRAM_Write_DW(Start_addr,SRAM_POLL_Device_List_Addr);
}
if((list_addr < Start_addr) || (list_addr > SRAM_Device_List_End_Addr)) list_addr = Start_addr;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
memcpy(rs485_temp_buff,(uint8_t *)dev_info,Dev_Privately);
memcpy(&rs485_temp_buff[Dev_Privately],(uint8_t *)dev_data,data_len);
dev_info->check = 0x00;
dev_info->check = Data_CheckSum(rs485_temp_buff,dev_info->data_len);
SRAM_DMA_Write_Buff(rs485_temp_buff,dev_info->data_len,list_addr);
// /*清空数据*/
// for(uint16_t i = 0;i<SRAM_Device_List_Size;i++)
// {
// SRAM_Write_Byte(0x00,list_addr+i);
// }
// /*添加公有数据*/
// SRAM_DMA_Write_Buff((uint8_t *)dev_info,Dev_Privately,list_addr);
//
// /*添加485设备的回调函数*/
// SRAM_Write_DW(dev_info->polling_cf,list_addr+Dev_Polling_CF);
//
// SRAM_Write_DW(dev_info->processing_cf,list_addr+Dev_Processing_CF);
//
// /*添加设备私有变量*/
// SRAM_DMA_Write_Buff(dev_data,data_len,list_addr+Dev_Privately);
//
// /*计算校验值*/
// dev_info->check = Dev_CheckSum(list_addr,dev_info->data_len);
// SRAM_Write_Byte(dev_info->check,list_addr+Dev_Check); //校验值重新写入
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"data_len :%d ,dev Buffer:" , write_len);
// for(uint16_t i = 0;i < write_len;i++)
// {
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%02X " , SRAM_Read_Byte(list_addr + i));
// }
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"\r\n");
/*设备添加完毕,设备链表地址偏移*/
list_addr += SRAM_Device_List_Size;
SRAM_Write_DW(list_addr,SRAM_ACTIVE_Device_List_Addr);
}
/*******************************************************************************
* Function Name : Add_Nor_Device_To_List2
* Description : 添加普通设备到链表
* Input :
Device_Public_Information_G *dev_info : 添加的设备公共数据
dev_data :设备的私有数据
data_len : 设备私有数据长度
* Return : None
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Add_Nor_Device_To_List(
Device_Public_Information_G *dev_info,
uint8_t *dev_data,
uint16_t data_len)
{
/*向设备链表添加普通设备*/
dev_info->data_len = data_len + Dev_Privately; //设备私有数据长度加上公共数据的长度
uint32_t list_addr = SRAM_Read_DW(SRAM_NORMAL_Device_List_Addr); //获取设备信息保存地址
uint32_t Start_addr = SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr); //获取主动设备信息起始地址
if((Start_addr < SRAM_Device_List_Start_Addr) || (Start_addr > SRAM_Device_List_End_Addr))
{
Start_addr = SRAM_Device_List_Start_Addr;
SRAM_Write_DW(Start_addr,SRAM_ACTIVE_Device_List_Addr);
}
if((list_addr < Start_addr) || (list_addr > SRAM_Device_List_End_Addr)) list_addr = Start_addr;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
memcpy(rs485_temp_buff,(uint8_t *)dev_info,Dev_Privately);
memcpy(&rs485_temp_buff[Dev_Privately],(uint8_t *)dev_data,data_len);
dev_info->check = 0x00;
dev_info->check = Data_CheckSum(rs485_temp_buff,dev_info->data_len);
SRAM_DMA_Write_Buff(rs485_temp_buff,dev_info->data_len,list_addr);
// /*清空数据*/
// for(uint16_t i = 0;i<SRAM_Device_List_Size;i++)
// {
// SRAM_Write_Byte(0x00,list_addr+i);
// }
//
// /*添加公有数据*/
// SRAM_DMA_Write_Buff((uint8_t *)dev_info,Dev_Privately,list_addr);
//
// /*添加设备私有变量*/
// SRAM_DMA_Write_Buff(dev_data,data_len,list_addr+Dev_Privately);
//
// /*计算校验值*/
// dev_info->check = Dev_CheckSum(list_addr,dev_info->data_len);
// SRAM_Write_Byte(dev_info->check,list_addr+Dev_Check); //校验值重新写入
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"data_len :%d ,dev Buffer:" , write_len);
// for(uint16_t i = 0;i < write_len;i++)
// {
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%02X " , SRAM_Read_Byte(list_addr + i));
// }
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"\r\n");
/*设备添加完毕,设备链表地址偏移*/
list_addr += SRAM_Device_List_Size;
SRAM_Write_DW(list_addr,SRAM_NORMAL_Device_List_Addr);
}
/*******************************************************************************
* Function Name : BLV_Device_Info_Write_To_SRAM
* Description : 设备数据写入到SRAM中
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t BLV_Device_Info_Write_To_SRAM(
uint32_t dev_addr,
Device_Public_Information_G *dev_info,
uint8_t *dev_data,
uint16_t data_len)
{
if(dev_info == NULL) return 1;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
memcpy(rs485_temp_buff,(uint8_t *)dev_info,Dev_Privately);
memcpy(&rs485_temp_buff[Dev_Privately],(uint8_t *)dev_data,data_len);
dev_info->check = 0x00;
dev_info->check = Data_CheckSum(rs485_temp_buff,dev_info->data_len);
SRAM_DMA_Write_Buff(rs485_temp_buff,dev_info->data_len,dev_addr);
return 0x00;
}
/*******************************************************************************
* Function Name : Device_Data_Check
* Description : 设备链表数据校验
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Device_Data_Check(uint32_t sram_addr)
{
uint16_t data_len = SRAM_Read_Word(sram_addr + Dev_DataLen);
uint8_t data_sum = 0;
if(data_len > SRAM_Device_List_Size) return 1;
memset(rs485_temp_buff,0,sizeof(rs485_temp_buff));
SRAM_DMA_Read_Buff(rs485_temp_buff,data_len,sram_addr);
for(uint16_t i = 0;i<data_len;i++)
{
data_sum += rs485_temp_buff[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : BLV_BUS_Polling_Task
* Description : BUS轮询任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_BUS_Polling_Task(void)
{
static uint32_t BLV_BUS_Wait = 0;
uint16_t data_len = 0;
uint8_t rev = 0;
if(BUS485_Info.device_num == 0x00) return ;
switch(BUS485_Info.BUS_Start)
{
case B_IDLE:
BUS485_Info.BUS_Start = B_Polling;
break;
case B_Polling:
if(SRAM_Read_Byte(BUS485_Info.Last_list_addr + Dev_port) == Bus_port)
{
/*校验数据*/
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS Data_Check");
if(Device_Data_Check(BUS485_Info.Last_list_addr) == 0)
{
BUS485_Info.n_list_read_addr = BUS485_Info.Last_list_addr;
/*读取设备信息*/
Device_Public_Information_G dev_info;
SRAM_DMA_Read_Buff((uint8_t *)&dev_info,sizeof(Device_Public_Information_G),BUS485_Info.n_list_read_addr);
BUS485_Info.n_dev_type = dev_info.type;
BUS485_Info.n_dev_addr = dev_info.addr;
BUS485_Info.n_dev_datalen = dev_info.data_len;
BUS485_Info.n_polling_cf = dev_info.polling_cf;
BUS485_Info.n_processing_cf = dev_info.processing_cf;
BUS485_Info.n_dev_waittime = dev_info.wait_time;
BUS485_Info.n_retry_num = dev_info.retry_num;
BUS485_Info.Retry_Flag = 0x01;
/*调用设备轮询发送函数*/
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS_dev Polling");
if(BUS485_Info.baud != dev_info.baud) //设备波特率与当前通讯波特率不符
{
/*切换波特率*/
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS_Port Baud:%ld,Change Baud:%ld\r\n",BUS485_Info.baud,dev_info.baud);
BUS485_Info.baud = dev_info.baud;
if(BUS485_Info.BaudRateCfg != NULL) BUS485_Info.BaudRateCfg(BUS485_Info.baud);
BUS485_Info.BUS_Start = Baud_Wait;
BUS485_Info.change_tick = SysTick_1ms;
}else{ //波特率不必切换
if((BUS485_Info.n_polling_cf!=0x00000000) && (BUS485_Info.n_polling_cf!=0xFFFFFFFF)) {
rev = ((fun4_prt)BUS485_Info.n_polling_cf)(BUS485_Info.n_list_read_addr);
}
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
BUS485_Info.BUS_Start = Change_Dev;
/*BUS485总线上有不需要发送轮询数据的设备需要跳过等待回复阶段直接切换设备因此重发标志位不需要置位 - 2022-05-04*/
BUS485_Info.Retry_Flag = 0x00;
BUS485_Info.n_retry_num = 0x00;
}else { //数据发送成功,等待回复
BLV_BUS_Wait = SysTick_1ms;
BUS485_Info.BUS_Start = Wait_Reply;
}
}
}else {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"[BLV_BUS_Polling_Task2]BLV_BUS_dev Check Fail:%08X",BUS485_Info.Last_list_addr);
BUS485_Info.BUS_Start = Change_Dev;
}
}else {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS_dev Type Fail");
BUS485_Info.BUS_Start = Change_Dev;
}
break;
case Change_Dev:
BUS485_Info.Last_list_addr += SRAM_Device_List_Size; //下一个设备
if(BUS485_Info.Last_list_addr >= SRAM_Read_DW(SRAM_BUS_Device_List_Addr)) BUS485_Info.Last_list_addr = SRAM_Device_List_Start_Addr;
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS Change_Dev");
BUS485_Info.BUS_Start = B_Polling;
break;
case B_Retry:
if((BUS485_Info.Retry_Flag == 0x01) && (BUS485_Info.n_retry_num != 0x00)) //重发标志未清零,表示没发送成功
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS Retransmitting Data:%d-%d-%08X...",BUS485_Info.n_dev_type,BUS485_Info.n_dev_addr,BUS485_Info.n_list_read_addr);
//修改时间:2022-07-12
if((BUS485_Info.n_polling_cf!=0x00000000) && (BUS485_Info.n_polling_cf!=0xFFFFFFFF)) rev = ((fun4_prt)BUS485_Info.n_polling_cf)(BUS485_Info.n_list_read_addr); //继续调用设备发送函数
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
BUS485_Info.BUS_Start = Change_Dev;
/*BUS485总线上有不需要发送轮询数据的设备需要跳过等待回复阶段直接切换设备因此重发标志位不需要置位 - 2022-05-04*/
BUS485_Info.Retry_Flag = 0x00;
BUS485_Info.n_retry_num = 0x00;
}else { //数据发送成功,等待回复
BLV_BUS_Wait = SysTick_1ms; //重新计时
BUS485_Info.n_retry_num--;
BUS485_Info.BUS_Start = Wait_Reply;
}
}else if((BUS485_Info.Retry_Flag == 0x01) && (BUS485_Info.n_retry_num == 0x00))
{
BUS485_Info.BUS_Start = Change_Dev; //发送失败,切换下个设备
}else { //2021-06-29 新增
BUS485_Info.BUS_Start = Change_Dev; //发送失败,切换下个设备
}
break;
case Wait_Reply:
/*接收处理*/
if(g_uart[UART_3].RX_Buffer_WriteAddr != g_uart[UART_3].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_3].RX_Buffer_ReadAddr);
if((BUS485_Info.n_processing_cf!=0x00000000) && (BUS485_Info.n_processing_cf!=0xFFFFFFFF)) {
BUS485_Info.Retry_Flag = ((fun2_prt)BUS485_Info.n_processing_cf)(BUS485_Info.n_list_read_addr,g_uart[UART_3].RX_Buffer_ReadAddr + 2,data_len);
}
if(BUS485_Info.Retry_Flag == 0x00) {
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Reply SUCC\r\n");
BUS485_Info.send_wait = SysTick_1ms;
BUS485_Info.BUS_Start = B_Wait; //回复成功,等待总线空闲,便切换为下一个设备
}
if(BUS485_Info.port_mode == Port_Monitoring_mode) //如果当前处于监控模式下,将数据发送至PC端
{
Udp_Internal_SeriaNet_Uploading(Bus_port,BUS485_Info.baud,g_uart[UART_3].RX_Buffer_ReadAddr); //上报
}
g_uart[UART_3].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].RX_Buffer_ReadAddr > SRAM_UART3_RecvBuffer_End_Addr) {
g_uart[UART_3].RX_Buffer_ReadAddr = SRAM_UART3_RecvBuffer_Start_Addr;
}
}
/*接收超时 - 进入重发*/
if(SysTick_1ms - BLV_BUS_Wait > BUS485_Info.n_dev_waittime) BUS485_Info.BUS_Start = B_Retry;
break;
case B_Wait:
if(SysTick_1ms - BUS485_Info.send_wait > BLV_BUS485_WaitLdle_Time) {
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS B_Wait");
BUS485_Info.BUS_Start = Change_Dev;
}
//BUS485_Info.BUS_Start = Change_Dev;
break;
/*2021-11-24 : 调整C5IO波特率不准发送数据前根据当前设备通讯波特率切换发送波特率切换完波特率后等待10ms在进行发送数据
2022-07-19 : 调整切换波特率时,先通讯一次,接收回来的数据不做处理直接丢弃
*/
case Baud_Wait: //切换波特率等待时间
if(SysTick_1ms - BUS485_Info.change_tick > BLV_BUS485_ChangeBaudWaitTime)
{
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- Baud_Wait");
if((BUS485_Info.n_polling_cf!=0x00000000) && (BUS485_Info.n_polling_cf!=0xFFFFFFFF)) rev = ((fun4_prt)BUS485_Info.n_polling_cf)(BUS485_Info.n_list_read_addr); //继续调用设备发送函数
BUS485_Info.change_tick = SysTick_1ms;
BUS485_Info.BUS_Start = Baud_Comm;
}
break;
case Baud_Comm:
/*接收处理*/
if(g_uart[UART_3].RX_Buffer_WriteAddr != g_uart[UART_3].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_3].RX_Buffer_ReadAddr);
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- Baud_Comm1");
if((BUS485_Info.n_processing_cf!=0x00000000) && (BUS485_Info.n_processing_cf!=0xFFFFFFFF)) {
BUS485_Info.Retry_Flag = ((fun2_prt)BUS485_Info.n_processing_cf)(BUS485_Info.n_list_read_addr,g_uart[UART_3].RX_Buffer_ReadAddr + 2,data_len);
}
if(BUS485_Info.Retry_Flag == 0x00) //回复成功,立即开始下一次通讯
{
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- Baud_Comm3");
BUS485_Info.BUS_Start = Baud_SendWait;
BUS485_Info.change_tick = SysTick_1ms;
}
if(BUS485_Info.port_mode == Port_Monitoring_mode) //如果当前处于监控模式下,将数据发送至PC端
{
Udp_Internal_SeriaNet_Uploading(Bus_port,BUS485_Info.baud,g_uart[UART_3].RX_Buffer_ReadAddr); //上报
}
g_uart[UART_3].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].RX_Buffer_ReadAddr > SRAM_UART3_RecvBuffer_End_Addr) {
g_uart[UART_3].RX_Buffer_ReadAddr = SRAM_UART3_RecvBuffer_Start_Addr;
}
}
/*接收等待超时*/
if(SysTick_1ms - BUS485_Info.change_tick > BUS485_Info.n_dev_waittime) {
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- Baud_Comm2");
BUS485_Info.change_tick = SysTick_1ms;
BUS485_Info.BUS_Start = Baud_SendWait;
}
break;
case Baud_SendWait:
if(SysTick_1ms - BUS485_Info.change_tick > BLV_BUS485_ChangeBaudSendWaitTime) {
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- Baud_Comm2");
BUS485_Info.change_tick = SysTick_1ms;
BUS485_Info.BUS_Start = B_Send;
}
break;
case B_Send: //发送函数
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_BUS State -- send");
//if((BUS485_Info.n_polling_cf!=0x00000000) && (BUS485_Info.n_polling_cf!=0xFFFFFFFF)) Convert_To_Fun_Prt(BUS485_Info.n_polling_cf,BUS485_Info.n_list_read_addr);
//修改时间:2022-07-12
if((BUS485_Info.n_polling_cf!=0x00000000) && (BUS485_Info.n_polling_cf!=0xFFFFFFFF)) rev = ((fun4_prt)BUS485_Info.n_polling_cf)(BUS485_Info.n_list_read_addr); //继续调用设备发送函数
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
BUS485_Info.BUS_Start = Change_Dev;
/*BUS485总线上有不需要发送轮询数据的设备需要跳过等待回复阶段直接切换设备因此重发标志位不需要置位 - 2022-05-04*/
BUS485_Info.Retry_Flag = 0x00;
BUS485_Info.n_retry_num = 0x00;
}else { //数据发送成功,等待回复
BLV_BUS_Wait = SysTick_1ms; //重新计时
BUS485_Info.BUS_Start = Wait_Reply;
}
break;
default:
BUS485_Info.BUS_Start = Change_Dev;
break;
}
/*当前不是处于正常模式下,超时回归正常模式*/
if(BUS485_Info.port_mode != Port_Normal_Mode)
{
if(SysTick_1s - BUS485_Info.mode_tick > BUS485_Info.mode_outtime)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Reply SUCC");
BUS485_Info.mode_tick = SysTick_1s;
BUS485_Info.port_mode = Port_Normal_Mode; //正常模式
}
}
}
/*******************************************************************************
* Function Name : BUS485Port_Passthrough_Task
* Description : BUSPort BUS端口透传任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BUS485Port_Passthrough_Task(void)
{
uint16_t data_len = 0;
switch(BUS485_Info.pass_state)
{
case B_IDLE: //空闲状态 - 判断是否有数据上报或下发
/*接收处理*/
if(g_uart[UART_3].RX_Buffer_WriteAddr != g_uart[UART_3].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_3].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d ,RX_Buffer:" , data_len);
Udp_Internal_SeriaNet_Uploading(Bus_port,BUS485_Info.baud,g_uart[UART_3].RX_Buffer_ReadAddr); //上报
g_uart[UART_3].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].RX_Buffer_ReadAddr > SRAM_UART3_RecvBuffer_End_Addr) g_uart[UART_3].RX_Buffer_ReadAddr = SRAM_UART3_RecvBuffer_Start_Addr;
}
if(g_uart[UART_3].TX_Buffer_WriteAddr != g_uart[UART_3].TX_Buffer_ReadAddr)
{
/*读取发送缓冲区 - 下发*/
data_len = SRAM_Read_Word(g_uart[UART_3].TX_Buffer_ReadAddr);
BUS485_Info.pass_outtime = SRAM_Read_Byte(g_uart[UART_3].TX_Buffer_ReadAddr + 2); //单位S
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max; //透传数据长度
BUS485_Info.pass_tick = SysTick_1s;
MCU485_SendSRAMData(Bus_port,g_uart[UART_3].TX_Buffer_ReadAddr + 3,data_len); //下发
BUS485_Info.pass_state = Wait_Reply;
g_uart[UART_3].TX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].TX_Buffer_ReadAddr > SRAM_UART3_SendBuffer_End_Addr) g_uart[UART_3].TX_Buffer_ReadAddr = SRAM_UART3_SendBuffer_Start_Addr;
}
if(SysTick_1s - BUS485_Info.mode_tick > BUS485_Info.mode_outtime)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS485_Info Port_Normal_Mode mode_outtime");
BUS485_Info.mode_tick = SysTick_1s;
BUS485_Info.port_mode = Port_Normal_Mode; //正常模式
BUS485_Info.baud = Bus_Baud;
}
break;
case Wait_Reply: //等待回复 - 回复超时的话 - 上报给主机错误
/*接收处理*/
if(g_uart[UART_3].RX_Buffer_WriteAddr != g_uart[UART_3].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_3].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d ,RX_Buffer:" , data_len);
Udp_Internal_SeriaNet_Uploading(Bus_port,BUS485_Info.baud,g_uart[UART_3].RX_Buffer_ReadAddr);
BUS485_Info.pass_state = B_IDLE; //进入空闲状态
g_uart[UART_3].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_3].RX_Buffer_ReadAddr > SRAM_UART3_RecvBuffer_End_Addr) g_uart[UART_3].RX_Buffer_ReadAddr = SRAM_UART3_RecvBuffer_Start_Addr;
}
if(SysTick_1s - BUS485_Info.pass_tick > BUS485_Info.pass_outtime)
{
//回复超时
Udp_Internal_SeriaNet_Response_Timeout();
BUS485_Info.pass_state = B_IDLE; //进入空闲状态
}
break;
default:
BUS485_Info.pass_state = B_IDLE; //进入空闲状态
break;
}
}
/*******************************************************************************
* Function Name : BLV_BUS485Port_ModeTask
* Description : BUS端口模式
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_BUS485Port_ModeTask(void)
{
switch(BUS485_Info.port_mode)
{
case Port_Passthrough_mode:
BUS485Port_Passthrough_Task(); //透传模式
break;
case Port_Normal_Mode:
case Port_Monitoring_mode:
BLV_BUS_Polling_Task(); //正常模式 以及正常模式下监控模式
break;
}
}
/*******************************************************************************
* Function Name : BLV_PollPort_Task
* Description : PollPort轮询任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_PollPort_Task(void)
{
static uint32_t BLV_POLL_Wait = 0;
uint16_t data_len = 0;
uint8_t rev = 0;
if(Poll485_Info.device_num == 0x00) return ;
switch(Poll485_Info.POLL_Start)
{
case B_IDLE:
Poll485_Info.POLL_Start = B_Polling;
break;
case B_Polling:
if(SRAM_Read_Byte(Poll485_Info.Last_list_addr + Dev_port) == Polling_Port)
{
/*校验数据*/
if(Device_Data_Check(Poll485_Info.Last_list_addr) == 0)
{
Poll485_Info.n_list_read_addr = Poll485_Info.Last_list_addr;
/*波特率切换*/
if(Poll485_Info.baud != SRAM_Read_DW(Poll485_Info.n_list_read_addr + Dev_baud))
{
Poll485_Info.baud = SRAM_Read_DW(Poll485_Info.n_list_read_addr + Dev_baud);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_POLL_dev change baud:%08X",Poll485_Info.baud);
Poll485_Info.BaudRateCfg( Poll485_Info.baud );
Poll485_Info.POLL_Start = Baud_Wait;
Poll485_Info.change_tick = SysTick_1ms;
}else {
/*读取设备信息*/
Device_Public_Information_G dev_info;
SRAM_DMA_Read_Buff((uint8_t *)&dev_info,sizeof(Device_Public_Information_G),Poll485_Info.n_list_read_addr);
Poll485_Info.n_dev_type = dev_info.type;
Poll485_Info.n_dev_addr = dev_info.addr;
Poll485_Info.n_dev_datalen = dev_info.data_len;
Poll485_Info.n_polling_cf = dev_info.polling_cf;
Poll485_Info.n_processing_cf = dev_info.processing_cf;
Poll485_Info.n_dev_waittime = dev_info.wait_time;
Poll485_Info.n_retry_num = dev_info.retry_num;
Poll485_Info.Retry_Flag = 0x01;
/*2021 09 17 修改增加发送函数返回值判断RS485OCCUPYNOTIME表示数据没有发送数据跳过该设备*/
if((Poll485_Info.n_polling_cf!=0x00000000) && (Poll485_Info.n_polling_cf!=0xFFFFFFFF)) rev = ((fun4_prt)Poll485_Info.n_polling_cf)(Poll485_Info.n_list_read_addr);
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
Poll485_Info.POLL_Start = Change_Dev;
}else { //数据发送成功,等待回复
BLV_POLL_Wait = SysTick_1ms;
Poll485_Info.POLL_Start = Wait_Reply;
}
}
}else {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_POLL_dev Check Fail:%08X",Poll485_Info.Last_list_addr);
Poll485_Info.POLL_Start = Change_Dev;
}
}else {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_POLL_dev Type Fail:%08X , %d",Poll485_Info.Last_list_addr,SRAM_Read_Byte(Poll485_Info.Last_list_addr + Dev_Type));
Poll485_Info.POLL_Start = Change_Dev;
}
break;
case Baud_Wait:
if(SysTick_1ms - Poll485_Info.change_tick > BLV_POLL485_ChangeBaudWaitTime)
{
/*读取设备信息*/
Device_Public_Information_G dev_info;
SRAM_DMA_Read_Buff((uint8_t *)&dev_info,sizeof(Device_Public_Information_G),Poll485_Info.n_list_read_addr);
Poll485_Info.n_dev_type = dev_info.type;
Poll485_Info.n_dev_addr = dev_info.addr;
Poll485_Info.n_dev_datalen = dev_info.data_len;
Poll485_Info.n_polling_cf = dev_info.polling_cf;
Poll485_Info.n_processing_cf = dev_info.processing_cf;
Poll485_Info.n_dev_waittime = dev_info.wait_time;
Poll485_Info.n_retry_num = dev_info.retry_num;
Poll485_Info.Retry_Flag = 0x01;
/*2021 09 17 修改增加发送函数返回值判断0xF0表示数据没有发送数据跳过该设备*/
if((Poll485_Info.n_polling_cf!=0x00000000) && (Poll485_Info.n_polling_cf!=0xFFFFFFFF)) rev = ((fun4_prt)Poll485_Info.n_polling_cf)(Poll485_Info.n_list_read_addr);
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
Poll485_Info.POLL_Start = Change_Dev;
}else { //数据发送成功,等待回复
BLV_POLL_Wait = SysTick_1ms;
Poll485_Info.POLL_Start = Wait_Reply;
}
}
break;
case Change_Dev:
Poll485_Info.Last_list_addr += SRAM_Device_List_Size; //下一个设备
if(Poll485_Info.Last_list_addr >= SRAM_Read_DW(SRAM_POLL_Device_List_Addr)) Poll485_Info.Last_list_addr = SRAM_Read_DW(SRAM_BUS_Device_List_Addr);
Poll485_Info.POLL_Start = B_Polling;
break;
case B_Retry:
if((Poll485_Info.Retry_Flag == 0x01) && (Poll485_Info.n_retry_num != 0x00)) //重发标志未清零,表示没发送成功
{
/*2021 09 17 修改增加发送函数返回值判断0xF0表示数据没有发送数据跳过该设备*/
if((Poll485_Info.n_polling_cf != 0x00000000) && (Poll485_Info.n_polling_cf != 0xFFFFFFFF)) rev = ((fun4_prt)Poll485_Info.n_polling_cf)(Poll485_Info.n_list_read_addr);
if(rev == RS485OCCUPYNOTIME) //切换到下一个设备
{
Poll485_Info.POLL_Start = Change_Dev;
}else { //数据发送成功,等待回复
BLV_POLL_Wait = SysTick_1ms; //重新计时
Poll485_Info.n_retry_num--;
Poll485_Info.POLL_Start = Wait_Reply;
}
}else if((Poll485_Info.Retry_Flag == 0x01) && (Poll485_Info.n_retry_num == 0x00))
{
Poll485_Info.POLL_Start = Change_Dev; //发送失败,切换下个设备
}else {
Poll485_Info.POLL_Start = Change_Dev;
}
break;
case Wait_Reply:
/*接收处理*/
if(g_uart[UART_0].RX_Buffer_WriteAddr != g_uart[UART_0].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_0].RX_Buffer_ReadAddr);
if((Poll485_Info.n_processing_cf!=0x00000000) && (Poll485_Info.n_processing_cf!=0xFFFFFFFF)) {
Poll485_Info.Retry_Flag = ((fun2_prt )Poll485_Info.n_processing_cf)(Poll485_Info.n_list_read_addr,g_uart[UART_0].RX_Buffer_ReadAddr + 2,data_len);
}
if(Poll485_Info.Retry_Flag == 0x00) {
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Reply SUCC\r\n");
Poll485_Info.send_wait = SysTick_1ms;
Poll485_Info.POLL_Start = B_Wait; //回复成功,等待总线空闲,便切换为下一个设备
}
if(Poll485_Info.port_mode == Port_Monitoring_mode) //如果当前处于监控模式下,将数据发送至PC端
{
Udp_Internal_SeriaNet_Uploading(Polling_Port,Poll485_Info.baud,g_uart[UART_0].RX_Buffer_ReadAddr); //上报
}
g_uart[UART_0].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].RX_Buffer_ReadAddr > SRAM_UART0_RecvBuffer_End_Addr) {
g_uart[UART_0].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr;
}
}
/*接收超时 - 进入重发*/
if(SysTick_1ms - BLV_POLL_Wait > Poll485_Info.n_dev_waittime) Poll485_Info.POLL_Start = B_Retry;
break;
case B_Wait: //发送成功等待时间
if(SysTick_1ms - BLV_POLL_Wait > Poll485_Info.n_dev_waittime) Poll485_Info.POLL_Start = Change_Dev;
break;
default:
Poll485_Info.POLL_Start = Change_Dev;
break;
}
/*当前不是处于正常模式下,超时回归正常模式*/
if(Poll485_Info.port_mode != Port_Normal_Mode)
{
if(SysTick_1s - Poll485_Info.mode_tick > Poll485_Info.mode_outtime)
{
Poll485_Info.mode_tick = SysTick_1s;
Poll485_Info.port_mode = Port_Normal_Mode; //正常模式
}
}
}
/*******************************************************************************
* Function Name : Poll485Port_Passthrough_Task
* Description : PollPort 轮询端口透传任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Poll485Port_Passthrough_Task(void)
{
uint16_t data_len = 0;
switch(Poll485_Info.pass_state)
{
case B_IDLE: //空闲状态 - 判断是否有数据上报或下发
/*接收处理*/
if(g_uart[UART_0].RX_Buffer_WriteAddr != g_uart[UART_0].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_0].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d ,RX_Buffer:" , data_len);
Udp_Internal_SeriaNet_Uploading(Polling_Port,Poll485_Info.baud,g_uart[UART_0].RX_Buffer_ReadAddr); //上报
g_uart[UART_0].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].RX_Buffer_ReadAddr > SRAM_UART0_RecvBuffer_End_Addr) g_uart[UART_0].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr;
}
if(g_uart[UART_0].TX_Buffer_WriteAddr != g_uart[UART_0].TX_Buffer_ReadAddr)
{
/*读取发送缓冲区 - 下发*/
data_len = SRAM_Read_Word(g_uart[UART_0].TX_Buffer_ReadAddr);
Poll485_Info.pass_outtime = SRAM_Read_Byte(g_uart[UART_0].TX_Buffer_ReadAddr + 2); //单位S
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max; //透传数据长度
Poll485_Info.pass_tick = SysTick_1s;
MCU485_SendSRAMData(Polling_Port,g_uart[UART_0].TX_Buffer_ReadAddr + 3,data_len); //下发
Poll485_Info.pass_state = Wait_Reply;
g_uart[UART_0].TX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].TX_Buffer_ReadAddr > SRAM_UART0_SendBuffer_End_Addr) g_uart[UART_0].TX_Buffer_ReadAddr = SRAM_UART0_SendBuffer_Start_Addr;
}
if(SysTick_1s - Poll485_Info.mode_tick > Poll485_Info.mode_outtime)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Poll485_Info Port_Normal_Mode mode_outtime");
Poll485_Info.mode_tick = SysTick_1s;
Poll485_Info.port_mode = Port_Normal_Mode; //正常模式
if(Poll485_Info.baud != Polling_Baud) //设置波特率
{
Poll485_Info.baud = Polling_Baud;
Poll485_Info.BaudRateCfg(Poll485_Info.baud);
}
}
break;
case Wait_Reply: //等待回复 - 回复超时的话 - 上报给主机错误
/*接收处理*/
if(g_uart[UART_0].RX_Buffer_WriteAddr != g_uart[UART_0].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_0].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d ,RX_Buffer:" , data_len);
Udp_Internal_SeriaNet_Uploading(Polling_Port,Act485_Info.baud,g_uart[UART_0].RX_Buffer_ReadAddr);
Poll485_Info.pass_state = B_IDLE; //进入空闲状态
g_uart[UART_0].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].RX_Buffer_ReadAddr > SRAM_UART0_RecvBuffer_End_Addr) g_uart[UART_0].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr;
}
if(g_uart[UART_0].TX_Buffer_WriteAddr != g_uart[UART_0].TX_Buffer_ReadAddr)
{
/*读取发送缓冲区 - 下发*/
data_len = SRAM_Read_Word(g_uart[UART_0].TX_Buffer_ReadAddr);
Poll485_Info.pass_outtime = SRAM_Read_Byte(g_uart[UART_0].TX_Buffer_ReadAddr + 2); //单位S
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max; //透传数据长度
Poll485_Info.pass_tick = SysTick_1s;
MCU485_SendSRAMData(Polling_Port,g_uart[UART_0].TX_Buffer_ReadAddr + 3,data_len); //下发
Poll485_Info.pass_state = Wait_Reply;
g_uart[UART_0].TX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].TX_Buffer_ReadAddr > SRAM_UART0_SendBuffer_End_Addr) g_uart[UART_0].TX_Buffer_ReadAddr = SRAM_UART0_SendBuffer_Start_Addr;
}
if(SysTick_1s - Poll485_Info.pass_tick > Poll485_Info.pass_outtime)
{
//回复超时
Udp_Internal_SeriaNet_Response_Timeout();
Poll485_Info.pass_state = B_IDLE; //进入空闲状态
}
break;
default:
Poll485_Info.pass_state = B_IDLE; //进入空闲状态
break;
}
}
/*******************************************************************************
* Function Name : BLV_PollPort_ModeTask
* Description : PollPort Poll端口模式
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_PollPort_ModeTask(void)
{
uint16_t data_len = 0,rev = 0;
if((g_pc_test.test_flag == 0x03) || (g_pc_test.test_flag == 0x13))
{
if(g_uart[UART_0].RX_Buffer_WriteAddr != g_uart[UART_0].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_0].RX_Buffer_ReadAddr);
rev = BLV_PC_TEST_TOUR_DATACheck(g_uart[UART_0].RX_Buffer_ReadAddr+2,data_len);
if(rev == 0x00) {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Poll Port 测试巡回数据\r\n");
g_pc_test.tour_succ++; //是巡回数据
}else {
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"不是巡回数据!\r\n");
}
g_uart[UART_0].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_0].RX_Buffer_ReadAddr > SRAM_UART0_RecvBuffer_End_Addr) g_uart[UART_0].RX_Buffer_ReadAddr = SRAM_UART0_RecvBuffer_Start_Addr;
}
return; //测试中,暂停任务处理
}
switch(Poll485_Info.port_mode)
{
case Port_Passthrough_mode:
Poll485Port_Passthrough_Task(); //透传模式
break;
case Port_Normal_Mode:
case Port_Monitoring_mode:
BLV_PollPort_Task(); //正常模式 以及正常模式下监控模式
break;
}
}
/*******************************************************************************
* Function Name : BLV_ActivePort_Task
* Description : ActivePort 主动端口任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_ActivePort_Task(void)
{
static uint32_t BLV_Act_Wait = 0;
uint16_t data_len_1 = 0;
switch(Act485_Info.Act_Start)
{
case B_IDLE: //空闲状态
/*接收处理*/
if(g_uart[UART_2].RX_Buffer_WriteAddr != g_uart[UART_2].RX_Buffer_ReadAddr)
{
data_len_1 = SRAM_Read_Word(g_uart[UART_2].RX_Buffer_ReadAddr);
if((Act485_Info.n_processing_cf!=0x00000000) && (Act485_Info.n_processing_cf!=0xFFFFFFFF)) {
Act485_Info.Retry_Flag = ((fun2_prt)Act485_Info.n_processing_cf)(Act485_Info.Last_list_addr,g_uart[UART_2].RX_Buffer_ReadAddr + 2,data_len_1);
}
if(Act485_Info.Retry_Flag == 0x00) {
if(Act485_Info.Last_list_addr == Act485_Info.n_list_read_addr)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"A Reply SUCC");
Act485_Info.Send_Flag = 0x00;
Act485_Info.Act_Start = B_Send; //回复成功,等待总线空闲,便切换为下一个设备
}else{
//当前数据不是回复数据 切换回发送数据设备信息
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Not Dev Data");
Act485_Info.Act_Start = Read_Dev;
}
Act485_Info.process_num = 0;
if(Act485_Info.port_mode == Port_Monitoring_mode) //如果当前处于监控模式下,将数据发送至PC端
{
Udp_Internal_SeriaNet_Uploading(Active_Port,Act485_Info.baud,g_uart[UART_2].RX_Buffer_ReadAddr); //上报
}
/*本包设备处理完毕,接收读取缓冲区地址偏移*/
g_uart[UART_2].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].RX_Buffer_ReadAddr > SRAM_UART2_RecvBuffer_End_Addr) {
g_uart[UART_2].RX_Buffer_ReadAddr = SRAM_UART2_RecvBuffer_Start_Addr;
}
}else {
Act485_Info.process_num ++;
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Data parsing failed :%d" , Act485_Info.process_num);
Act485_Info.Act_Start = Change_Dev;//不是当前设备的数据,换下一个处理
}
if(Act485_Info.process_num >= Act485_Info.device_num)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"wipe cache partition:%d",Act485_Info.device_num);
Act485_Info.Act_Start = B_IDLE;
Act485_Info.process_num = 0; //清楚处理计数
Act485_Info.Retry_Flag = 0; //清楚回复标志
if(Act485_Info.port_mode == Port_Monitoring_mode) //如果当前处于监控模式下,将数据发送至PC端
{
Udp_Internal_SeriaNet_Uploading(Active_Port,Act485_Info.baud,g_uart[UART_2].RX_Buffer_ReadAddr); //上报
}
g_uart[UART_2].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].RX_Buffer_ReadAddr > SRAM_UART2_RecvBuffer_End_Addr) {
g_uart[UART_2].RX_Buffer_ReadAddr = SRAM_UART2_RecvBuffer_Start_Addr;
}
}
}else{
if(SysTick_1ms - BLV_Act_Wait > Act485_Info.send_wait)
{
if((Act485_Info.Send_Flag == RS485OCCUPYTIME) && (Act485_Info.Last_list_addr == Act485_Info.n_list_read_addr))
{
Act485_Info.Send_Flag = RS485OCCUPYNOTIME; //本包数据发送完成
Act485_Info.Act_Start = B_Send; //继续回归发送状态,发送函数内部会判断是否还需要发送
}else {
/*
1、当前没数据发送 切换设备
2、当前是否
*/
Act485_Info.Act_Start = Change_Dev;
}
}
}
break;
case B_Send: //数据发送状态
Act485_Info.n_list_read_addr = Act485_Info.Last_list_addr;
/*调用设备发送函数*/
if((Act485_Info.n_polling_cf!=0x00000000) && (Act485_Info.n_polling_cf!=0xFFFFFFFF)) {
Act485_Info.Send_Flag = ((fun4_prt)Act485_Info.n_polling_cf)(Act485_Info.n_list_read_addr);
}
Act485_Info.Retry_Flag = 0x00;
BLV_Act_Wait = SysTick_1ms;
if(Act485_Info.Send_Flag == RS485OCCUPYTIME)
{
Act485_Info.send_wait = Act485_Info.n_dev_waittime;
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_ActivePort_Task - Send Data\r\n");
} else{
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_ActivePort_Task - Not Data\r\n");
Act485_Info.send_wait = 5; //切换设备时间
}
Act485_Info.Act_Start = B_IDLE;
break;
case Change_Dev: //切换设备
if(Act485_Info.list_read_addr != 0x00)
{
Act485_Info.Last_list_addr = Act485_Info.list_read_addr;
Act485_Info.list_read_addr = 0x00;
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_ActivePort_Task - list_read_addr:%08X\r\n",Act485_Info.Last_list_addr);
}else{
Act485_Info.Last_list_addr += SRAM_Device_List_Size;
}
if((Act485_Info.Last_list_addr >= SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr)) || (Act485_Info.Last_list_addr >= SRAM_Device_List_End_Addr)) Act485_Info.Last_list_addr = SRAM_Read_DW(SRAM_POLL_Device_List_Addr);
/*校验数据 并读取设备数据*/
if(Device_Data_Check(Act485_Info.Last_list_addr) == 0)
{
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_ActivePort_Task - Read_Dev SUCC\r\n");
/*读取设备信息*/
Device_Public_Information_G dev_info;
SRAM_DMA_Read_Buff((uint8_t *)&dev_info,sizeof(Device_Public_Information_G),Act485_Info.Last_list_addr);
Act485_Info.n_polling_cf = dev_info.polling_cf;
Act485_Info.n_processing_cf = dev_info.processing_cf;
Act485_Info.n_dev_waittime = dev_info.wait_time;
Act485_Info.n_retry_num = dev_info.retry_num;
if(Act485_Info.Retry_Flag == 0x00) Act485_Info.Act_Start = B_Send;
else Act485_Info.Act_Start = B_IDLE;
}else{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"%s - Read_Dev Fail: %08X",__func__,Act485_Info.Last_list_addr);
}
break;
case Read_Dev:
if(Device_Data_Check(Act485_Info.n_list_read_addr) == 0)
{
/*读取设备信息*/
Device_Public_Information_G dev_info;
SRAM_DMA_Read_Buff((uint8_t *)&dev_info,sizeof(Device_Public_Information_G),Act485_Info.n_list_read_addr);
Act485_Info.n_polling_cf = dev_info.polling_cf;
Act485_Info.n_processing_cf = dev_info.processing_cf;
Act485_Info.n_dev_waittime = dev_info.wait_time;
Act485_Info.n_retry_num = dev_info.retry_num;
Act485_Info.Last_list_addr = Act485_Info.n_list_read_addr; //下一个设备指针归位
Act485_Info.Act_Start = B_IDLE; //继续等待
}else {
Act485_Info.Act_Start = Change_Dev;
}
break;
default:
Act485_Info.Act_Start = B_IDLE;
break;
}
/*当前不是处于正常模式下,超时回归正常模式*/
if(Act485_Info.port_mode != Port_Normal_Mode)
{
if(SysTick_1s - Act485_Info.mode_tick > Act485_Info.mode_outtime)
{
Act485_Info.mode_tick = SysTick_1s;
Act485_Info.port_mode = Port_Normal_Mode; //正常模式
}
}
}
/*******************************************************************************
* Function Name : Act485Port_Passthrough_Task
* Description : ActivePort 主动端口透传任务
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Act485Port_Passthrough_Task(void)
{
uint16_t data_len = 0;
switch(Act485_Info.pass_state)
{
case B_IDLE: //空闲状态 - 判断是否有数据上报或下发
/*接收处理*/
if(g_uart[UART_2].RX_Buffer_WriteAddr != g_uart[UART_2].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_2].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d" , data_len);
Udp_Internal_SeriaNet_Uploading(Active_Port,Act485_Info.baud,g_uart[UART_2].RX_Buffer_ReadAddr); //上报
g_uart[UART_2].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].RX_Buffer_ReadAddr > SRAM_UART2_RecvBuffer_End_Addr) g_uart[UART_2].RX_Buffer_ReadAddr = SRAM_UART2_RecvBuffer_Start_Addr;
}
if(g_uart[UART_2].TX_Buffer_WriteAddr != g_uart[UART_2].TX_Buffer_ReadAddr)
{
/*读取发送缓冲区 - 下发*/
data_len = SRAM_Read_Word(g_uart[UART_2].TX_Buffer_ReadAddr);
Act485_Info.pass_outtime = SRAM_Read_Byte(g_uart[UART_2].TX_Buffer_ReadAddr + 2); //单位S
if(data_len > Passthrough_DataLen_Max) data_len = Passthrough_DataLen_Max; //透传数据长度
Act485_Info.pass_tick = SysTick_1s;
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d" , data_len);
MCU485_SendSRAMData(Active_Port,g_uart[UART_2].TX_Buffer_ReadAddr + 3,data_len); //下发
Act485_Info.pass_state = Wait_Reply;
g_uart[UART_2].TX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].TX_Buffer_ReadAddr > SRAM_UART2_SendBuffer_End_Addr) g_uart[UART_2].TX_Buffer_ReadAddr = SRAM_UART2_SendBuffer_Start_Addr;
}
if(SysTick_1s - Act485_Info.mode_tick > Act485_Info.mode_outtime)
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Act485_Info Port_Normal_Mode mode_outtime");
Act485_Info.mode_tick = SysTick_1s;
Act485_Info.port_mode = Port_Normal_Mode; //正常模式
if(Act485_Info.baud != Active_Baud) //设置波特率
{
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Act485_Info.baud:%d",Act485_Info.baud);
Act485_Info.baud = Active_Baud;
Act485_Info.BaudRateCfg(Act485_Info.baud);
}
}
break;
case Wait_Reply: //等待回复 - 回复超时的话 - 上报给主机错误
/*接收处理*/
if(g_uart[UART_2].RX_Buffer_WriteAddr != g_uart[UART_2].RX_Buffer_ReadAddr)
{
data_len = SRAM_Read_Word(g_uart[UART_2].RX_Buffer_ReadAddr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"UART2 data_len :%d ,RX_Buffer:" , data_len);
Udp_Internal_SeriaNet_Uploading(Active_Port,Act485_Info.baud,g_uart[UART_2].RX_Buffer_ReadAddr);
Act485_Info.pass_state = B_IDLE; //进入空闲状态
g_uart[UART_2].RX_Buffer_ReadAddr += SRAM_Uart_Buffer_Size;
if(g_uart[UART_2].RX_Buffer_ReadAddr > SRAM_UART2_RecvBuffer_End_Addr) g_uart[UART_2].RX_Buffer_ReadAddr = SRAM_UART2_RecvBuffer_Start_Addr;
}
if(SysTick_1s - Act485_Info.pass_tick > Act485_Info.pass_outtime)
{
//回复超时
Udp_Internal_SeriaNet_Response_Timeout();
Act485_Info.pass_state = B_IDLE; //进入空闲状态
}
break;
default:
Act485_Info.pass_state = B_IDLE; //进入空闲状态
break;
}
}
/*******************************************************************************
* Function Name : BLV_ActivePort_ModeTask
* Description : ActivePort Active端口模式
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_ActivePort_ModeTask(void)
{
switch(Act485_Info.port_mode)
{
case Port_Passthrough_mode:
Act485Port_Passthrough_Task(); //透传模式
break;
case Port_Normal_Mode:
case Port_Monitoring_mode:
BLV_ActivePort_Task(); //正常模式 以及正常模式下监控模式
break;
}
}
/*******************************************************************************
* Function Name : BLV_Active_Set_List_Addr
* Description : ActivePort 设置链表地址
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_Active_Set_List_Addr(uint32_t addr)
{
Act485_Info.list_read_addr = addr;
Act485_Info.Act_Start = Change_Dev;
}
/*******************************************************************************
* Function Name : Find_Device_List_Information
* Description : 查找设备
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint32_t Find_Device_List_Information(uint8_t dev_type,uint8_t addr)
{
uint32_t read_addr = SRAM_Device_List_Start_Addr;
uint32_t end_addr = SRAM_Read_DW(SRAM_NORMAL_Device_List_Addr);
//Dbg_Println(DBG_OPT_DEVICE_STATUS,"Find Device:%08x",end_addr);
if((end_addr < SRAM_Device_List_Start_Addr) || (end_addr > SRAM_Device_List_End_Addr)) end_addr = SRAM_Device_List_End_Addr;
for(uint32_t i=SRAM_Device_List_Start_Addr;i<end_addr;)
{
if((SRAM_Read_Byte(read_addr + Dev_Type) == dev_type) && (SRAM_Read_Byte(read_addr + Dev_Addr) == addr))
{
if(Device_Data_Check(read_addr) == 0)
{
return read_addr;
}
}
read_addr += SRAM_Device_List_Size;
i+= SRAM_Device_List_Size;
if(read_addr >= end_addr)
{
return 0x00;
}
}
return 0x00;
}
/*******************************************************************************
* Function Name : Find_AllDevice_List_Information
* Description : 查找所有设备,包括普通设备
* Input :
* dev_type - 查找设备的类型
* addr - 查找设备的地址
* Return : 返回设备地址
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint32_t Find_AllDevice_List_Information(uint8_t dev_type,uint8_t addr)
{
uint32_t read_addr = SRAM_Device_List_Start_Addr;
uint32_t end_addr = SRAM_Read_DW(SRAM_NORMAL_Device_List_Addr);
if((end_addr < SRAM_Device_List_Start_Addr) || (end_addr > SRAM_Device_List_End_Addr)) end_addr = SRAM_Device_List_End_Addr;
for(uint32_t i=SRAM_Device_List_Start_Addr;i<end_addr;)
{
if((SRAM_Read_Byte(read_addr + Dev_Type) == dev_type) && (SRAM_Read_Byte(read_addr + Dev_Addr) == addr))
{
if(Device_Data_Check(read_addr) == 0)
{
return read_addr;
}
}
read_addr += SRAM_Device_List_Size;
i+= SRAM_Device_List_Size;
if(read_addr >= end_addr)
{
return 0x00;
}
}
return 0x00;
}
/*******************************************************************************
* Function Name : Find_AllDevice_List_Information2
* Description : 查找所有设备,包括普通设备
* Input :
* Port - 查找设备的端口
* dev_type - 查找设备的类型
* addr - 查找设备的地址
* Return : 返回设备地址
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint32_t Find_AllDevice_List_Information2(uint8_t Port, uint8_t dev_type,uint8_t addr)
{
uint16_t i = 0;
uint32_t read_addr = 0x00;
switch(Port)
{
case Active_Port:
i = BUS485_Info.device_num + Poll485_Info.device_num;
break;
case Polling_Port:
i = BUS485_Info.device_num;
break;
case Bus_port:
i = 0;
break;
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"未添加完设备时,需要查找设备总数:%d下标:%d", (BUS485_Info.device_num+Poll485_Info.device_num+Act485_Info.device_num), i);
for(; i < (BUS485_Info.device_num+Poll485_Info.device_num+Act485_Info.device_num); i++)
{
read_addr = SRAM_Device_List_Start_Addr + i*SRAM_Device_List_Size;
if((SRAM_Read_Byte(read_addr + Dev_Type) == dev_type) && (SRAM_Read_Byte(read_addr + Dev_Addr) == addr))
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"找到当前设备");
// if(Device_Data_Check(read_addr) == 0)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前设备校验通过%04x", read_addr);
return read_addr;
}
}
}
return 0x00; //未找到设备,返回空指针
}
/*******************************************************************************
* Function Name : Find_The_Number_Of_Device_In_The_List
* Description : 查询设备总数
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Find_The_Number_Of_Device_In_The_List(void)
{
uint32_t read_addr = SRAM_Device_List_Start_Addr;
uint32_t end_addr = SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr); //设备链表结束地址
uint8_t temp_num = 0;
uint32_t temp_len = 0;
temp_len = end_addr - read_addr;
temp_num = (temp_len / SRAM_Device_List_Size) & 0xFF;
return temp_num;
}
/*获取设备全部在线状态*/
__attribute__((section(".non_0_wait"))) uint8_t Gets_the_state_of_all_devices(uint8_t *data_buff,uint8_t num)
{
uint8_t dev_type = 0,dev_addr = 0,dev_online = 0;
uint32_t read_addr = SRAM_Device_List_Start_Addr;
uint32_t end_addr = SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr);
if((end_addr < SRAM_Device_List_Start_Addr) || (end_addr > SRAM_Device_List_End_Addr)) end_addr = SRAM_Device_List_End_Addr;
for(uint8_t i=0;i<num;i++)
{
if(Device_Data_Check(read_addr) == 0)
{
dev_type = SRAM_Read_Byte(read_addr + Dev_Type);
dev_addr = SRAM_Read_Byte(read_addr + Dev_Addr);
/*返回在线状态*/
switch(dev_type)
{
case DEV_C5IO_Type:
dev_online = Get_BUS_C5IO_Online_Status(read_addr);
break;
case DEV_C5MUSIC_Type:
dev_online = Get_BUS_C5MUSIC_Online_Status(read_addr);
break;
case DEV_RS485_TEMP:
dev_online = Get_BLV485_TEMP_Online_Status(read_addr);
break;
case DEV_RS485_CARD:
dev_online = Get_BLV485_CARD_Online_Status(read_addr);
break;
case DEV_RS485_SWT:
dev_online = Get_Switch_Online_Status(read_addr);
break;
case Dev_Rs458_RotaryCtrl: //这个旋钮开关需要重新构建
//dev_online = Get_Rotary_Switch_Online_Status(read_addr);
break;
}
data_buff[i*3+0] = dev_type;
data_buff[i*3+1] = dev_addr;
data_buff[i*3+2] = dev_online;
}else {
return 0xF0; //读取失败
}
read_addr += SRAM_Device_List_Size;
if(read_addr >= end_addr)
{
return 0x00;
}
}
return 0x00;
}
/*******************************************************************************
* @brief 写设备故障状态到SRAM
* @param
* device_type 设备类型
* device_addr 设备地址
* fault_type 故障类型
* fault_state 故障状态
* @retval None
* @attention 一种故障 1个字节485设备类型 1个字节设备地址 2个字节设备回路低字节在前 1个字节故障类型 1个字节故障内容 组成
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Write_Device_Fault_State(
uint8_t device_type,
uint8_t device_addr,
uint8_t fault_type,
uint8_t fault_state)
{
uint8_t data[6]; //用于保存设备故障信
uint32_t write_addr = 0x00,read_addr = 0x00; //设备故障状态写入地址
uint8_t len = 0;
//读取设备故障 缓冲区读写地址
write_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
read_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
//如果读取地址任何一个出错,读写地址直接复位
if( (write_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (write_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) \
|| (read_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (read_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) )
{
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
read_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
SRAM_Write_DW(write_addr,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
SRAM_Write_DW(read_addr,SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
SRAM_Write_DW(read_addr,SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s SRAM addr:%08X",__func__, write_addr);
memset(data,0x00,6); //设备故障信息清0
data[0] = device_type; //设备类型
data[1] = device_addr; //设备地址
data[4] = fault_type; //故障类型
data[5] = fault_state; //故障状态
if( (write_addr + 0x06) > SRAM_DEVICE_ONLINE_STATE_END_ADDR )
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s overstep_1 %08X!!!",__func__,write_addr);
len = SRAM_DEVICE_ONLINE_STATE_END_ADDR - write_addr;
SRAM_DMA_Write_Buff(data,len,write_addr);
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
SRAM_DMA_Write_Buff(&data[len],(6-len),write_addr);
write_addr += (6-len);
}else {
SRAM_DMA_Write_Buff(data, 6, write_addr); //写入设备故障信息
write_addr += 0x06; //地址偏移
}
if(write_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s overstep:%08X",__func__,write_addr);
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
}
SRAM_Write_DW(write_addr,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR); //更新设备故障状态写入地址
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Write Fault Data:%02X %02X %02X %02X %02X %02X\r\n",data[0],data[1],data[2],data[3],data[4],data[5]);
}
/*******************************************************************************
* @brief 写设备回路故障状态到SRAM
* @param
* device_type 设备类型
* device_addr 设备地址
* fault_type 故障类型
* fault_state 故障状态
* @retval None
* @attention 一种故障 1个字节485设备类型 1个字节设备地址 2个字节设备回路低字节在前 1个字节故障类型 1个字节故障内容 组成
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Write_Device_Loop_Fault_State(
uint8_t device_type,
uint8_t device_addr,
uint8_t fault_type,
uint8_t fault_state,
uint16_t loop)
{
uint8_t data[6]; //用于保存设备故障信
uint32_t write_addr = 0x00,read_addr = 0x00; //设备故障状态写入地址
uint8_t len = 0;
//读取设备故障 缓冲区读写地址
write_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
read_addr = SRAM_Read_DW(SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
//如果读取地址任何一个出错,读写地址直接复位
if( (write_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (write_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) \
|| (read_addr < SRAM_DEVICE_ONLINE_STATE_START_ADDR) || (read_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR) )
{
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
read_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
SRAM_Write_DW(write_addr,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR);
SRAM_Write_DW(read_addr,SRAM_DEVICE_ONLINE_STATE_READ_ADDR);
SRAM_Write_DW(read_addr,SRAM_DEVICE_ONLINE_STATE_TEMP_ADDR);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s SRAM addr:%08X",__func__, write_addr);
memset(data,0x00,6); //设备故障信息清0
data[0] = device_type; //设备类型
data[1] = device_addr; //设备地址
data[2] = (loop & 0xFF);
data[3] = ((loop >> 8) & 0xFF);
data[4] = fault_type; //故障类型
data[5] = fault_state; //故障状态
if( (write_addr + 0x06) > SRAM_DEVICE_ONLINE_STATE_END_ADDR )
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"%s overstep_1 %08X!!!",__func__,write_addr);
len = SRAM_DEVICE_ONLINE_STATE_END_ADDR - write_addr;
SRAM_DMA_Write_Buff(data,len,write_addr);
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
SRAM_DMA_Write_Buff(&data[len],(6-len),write_addr);
write_addr += (6-len);
}else {
SRAM_DMA_Write_Buff(data, 6, write_addr); //写入设备故障信息
write_addr += 0x06; //地址偏移
}
if(write_addr > SRAM_DEVICE_ONLINE_STATE_END_ADDR)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s overstep:%08X",__func__,write_addr);
write_addr = SRAM_DEVICE_ONLINE_STATE_START_ADDR;
}
SRAM_Write_DW(write_addr,SRAM_DEVICE_ONLINE_STATE_WRITE_ADDR); //更新设备故障状态写入地址
}
/*******************************************************************************
* Function Name : BLV_Communication_Record
* Description : BUS通讯记录
* Input :
dev_record :通讯记录结构体
option :记录选项
0x01:记录通讯次数
0x02:记录通讯结果
state :
选项为记录通讯次数时,该参数无效
选项为记录通讯结果时该参数为0x00通讯失败0x01通讯成功
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_Communication_Record(
BLV_COMM_RECORD_G *dev_record,
uint8_t option,
uint8_t state)
{
switch(option)
{
case 0x01:
if(dev_record->num >= BLV_COMM_RecordNum*8)
{
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"通讯记录已满");
dev_record->full_flag = 0x01;
dev_record->num = 0;
}
dev_record->num++;
dev_record->continue_fail_num++;
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"通讯记录数:%d",dev_record->num);
dev_record->record[(dev_record->num-1)/8] &= ~((0x01 << ((dev_record->num-1)%8)));
//Dbg_Print_Buff(DBG_BIT_SYS_STATUS_bit,"通讯BUFF",dev_record->record,BLV_COMM_RecordNum);
break;
case 0x02:
if(state == 0x01)
{
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"通讯成功数:%d",dev_record->num);
dev_record->continue_fail_num = 0;
dev_record->record[(dev_record->num-1)/8] |= (0x01 << ((dev_record->num-1)%8));
}
break;
}
}
/*******************************************************************************
* Function Name : Get_BLV_Communication_Succ_Rate
* Description : 获取通讯失败数(当前已统计的通讯中的失败)
* Return :失败百分比
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint16_t Get_BLV_Communication_Fail_Rate(BLV_COMM_RECORD_G *dev_record)
{
uint8_t temp = 0;
uint16_t fail_num = 0,sum = 0,precent = 0;
if(dev_record->full_flag == 0x01) sum = BLV_COMM_RecordNum*8; //当前记录已满
else sum = dev_record->num; //当前没有记录未满
for(uint16_t i=0;i<sum;i++)
{
temp = (dev_record->record[i/8] >> (i%8)) & 0x01;
if(temp == 0x00) fail_num++; //失败次数加一
}
precent = (fail_num*100)/sum;
return precent;
}