V2.13 使用新的can帧回复数据

解决ew自检模式 8导致小板死机的bug,自检返回值除以400,单位0.1ms
This commit is contained in:
ranchuan
2024-01-08 18:04:05 +08:00
parent b9224f2293
commit bcbd02a72c
16 changed files with 203 additions and 127 deletions

View File

@@ -4,6 +4,8 @@
#include "rthw.h"
#include "elec_det.h"
#include "board.h"
#include "core_delay.h"
CanRxMsg receive_message;
static YeCanRxFrame_st canrx_st;
static uint8_t Can_Device_ID = 0;
@@ -61,18 +63,18 @@ void YeCanInit(void)
Can_Device_ID = elec_local_addr();
yeid_un.Exide = 0;
yeid_un.yecanid.ACK = 0;
yeid_un.yecanid.FunClass = 0;
yeid_un.yecanid.Reserve1 = 0;
yeid_un.yecanid.Reserve0 = 0;
yeid_un.yecanid.SegFlag = 0;
yeid_un.yecanid.SegNum = 0;
yeid_un.yecanid.srcMACID = 0x00;
yeid_un.yecanid_old.ACK = 0;
yeid_un.yecanid_old.FunClass = 0;
yeid_un.yecanid_old.Reserve1 = 0;
yeid_un.yecanid_old.Reserve0 = 0;
yeid_un.yecanid_old.SegFlag = 0;
yeid_un.yecanid_old.SegNum = 0;
yeid_un.yecanid_old.srcMACID = 0x00;
yeid_un.yecanid.destMACID = 0x1F;
yeid_un.yecanid_old.destMACID = 0x1F;
ul_mask = GetCanFilter(yeid_un);
ul_can_mask =ul_mask;
yeid_un.yecanid.destMACID = Can_Device_ID;
yeid_un.yecanid_old.destMACID = Can_Device_ID;
ul_filter = GetCanFilter(yeid_un);
CAN_FilterInitStructure.CAN_FilterNumber = 0;
@@ -86,14 +88,14 @@ void YeCanInit(void)
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
yeid_un.yecanid.destMACID = 0x1E;
ul_filter = GetCanFilter(yeid_un);
CAN_FilterInitStructure.CAN_FilterNumber = 1;
CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;;
CAN_FilterInitStructure.CAN_FilterIdLow = ul_filter & 0x0FFFF;;
CAN_FilterInit(&CAN_FilterInitStructure);
// yeid_un.yecanid_old.destMACID = 0x1E;
// ul_filter = GetCanFilter(yeid_un);
// CAN_FilterInitStructure.CAN_FilterNumber = 1;
// CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;;
// CAN_FilterInitStructure.CAN_FilterIdLow = ul_filter & 0x0FFFF;;
// CAN_FilterInit(&CAN_FilterInitStructure);
yeid_un.yecanid.destMACID = 0x1F;
yeid_un.yecanid_old.destMACID = 0x1F;
ul_filter = GetCanFilter(yeid_un);
CAN_FilterInitStructure.CAN_FilterNumber = 2;
CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;;
@@ -135,22 +137,18 @@ static uint32_t GetCanFilter(YeCanID_un yeid)
@param 发送数据长度
@rtv 0 成功 1 失败
*/
timer_def *timer=0;
uint8_t YeCan_SendFrame(uint8_t srcaddr,uint8_t dstaddr,const uint8_t* txdata, uint16_t len,int delay_ms)
{
CanTxMsg transmit_message;
uint8_t mailbox_number;
YeCanID_un yeid_un;
int time_out = delay_ms*1000;
uint32_t time_out = delay_ms*1000;
uint8_t uc_rtv = 0;
uint32_t tick_start=0;
if(timer==0){
timer=dev_get("timer");
}
tick_start=timer->read(timer);
uint8_t pack_len;
tick_start=delay_get_us();
//can_transmission_stop(CAN1,0);
/* initialize transmit message */
transmit_message.ExtId = 0x00;
transmit_message.StdId = 0x00;
transmit_message.RTR = CAN_RTR_DATA;
@@ -162,87 +160,66 @@ uint8_t YeCan_SendFrame(uint8_t srcaddr,uint8_t dstaddr,const uint8_t* txdata, u
yeid_un.yecanid.FunClass = 1;
yeid_un.yecanid.SegFlag = 0;
yeid_un.yecanid.SegNum = 0;
if(can_tx_mutex != RT_NULL)
{
if(RT_EOK != rt_mutex_take (can_tx_mutex,500))
{
return 1;
}
}
yeid_un.yecanid.Reserve0=1;// 使用新协议
if(len <= 8)
{
transmit_message.DLC = len;
transmit_message.ExtId = yeid_un.Exide;
memcpy(transmit_message.Data,txdata,8);
mailbox_number = CAN_Transmit(CAN1, &transmit_message);
while( CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0)
{
time_out -=20;
rt_hw_us_delay(20);
}
// if(time_out <= 0)
if((timer->read(timer)-tick_start)>=delay_ms)
{
uc_rtv = 1;
goto can0_tx_end;
}
goto can0_tx_end;
}
while(len > 8)
{
memcpy(transmit_message.Data,txdata,8);
len -= 8;
txdata += 8;
if(yeid_un.yecanid.SegNum == 0)
{
yeid_un.yecanid.SegFlag = 0x01;
}else
{
yeid_un.yecanid.SegFlag = 0x02;
}
transmit_message.ExtId = yeid_un.Exide;
transmit_message.DLC = 8;
mailbox_number = CAN_Transmit(CAN1, &transmit_message);
time_out = 5000;
while( CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0)
{
time_out -=20;
rt_hw_us_delay(20);
}
// if(time_out <= 0)
if((timer->read(timer)-tick_start)>=delay_ms)
{
uc_rtv = 1;
goto can0_tx_end;
}
yeid_un.yecanid.SegNum ++;
}
yeid_un.yecanid.SegFlag = 0x3;
memcpy(transmit_message.Data,txdata,len);
transmit_message.DLC = len;
transmit_message.ExtId = yeid_un.Exide;
mailbox_number = CAN_Transmit(CAN1, &transmit_message);
while(CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0)
{
time_out -=20;
rt_hw_us_delay(20);
}
// if(time_out <= 0)
if((timer->read(timer)-tick_start)>=delay_ms)
{
uc_rtv = 1;
}
}else{
while(len > 0)
{
pack_len=8;
if(len<pack_len){
pack_len=len;
}
memcpy(transmit_message.Data,txdata,pack_len);
if(yeid_un.yecanid.SegNum == 0){
yeid_un.yecanid.SegFlag = 0x01;
}else if(len>8){
yeid_un.yecanid.SegFlag = 0x02;
}else{
yeid_un.yecanid.SegFlag = 0x03;
}
len -= pack_len;
txdata += pack_len;
transmit_message.DLC = pack_len;
transmit_message.ExtId = yeid_un.Exide;
while(mailbox_number = CAN_Transmit(CAN1, &transmit_message),mailbox_number==CAN_TxStatus_NoMailBox)
//while( CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number))
{
rt_hw_us_delay(20);
if(delay_check(tick_start,time_out))
{
uc_rtv = 1;
goto can0_tx_end;
}
}
yeid_un.yecanid.SegNum ++;
}
}
can0_tx_end:
CAN0_TX_BUSY_Flag = 0;
rt_mutex_release(can_tx_mutex);
return uc_rtv;
}
typedef struct{
void (*end_irq)(void *t,uint32_t len);
void *t;
@@ -257,25 +234,38 @@ static self_def g_self;
static void save_data(void)
{
YeCanID_un yeid_un;
uint8_t seg,seg_num,dstaddr;
yeid_un.Exide = receive_message.ExtId;
ul_exid = yeid_un.Exide << 3;
ul_exid &= ul_can_mask;
if(yeid_un.yecanid.Reserve0==0){
seg=yeid_un.yecanid_old.SegFlag;
seg_num=yeid_un.yecanid_old.SegNum;
dstaddr=yeid_un.yecanid_old.destMACID;
}else{
seg=yeid_un.yecanid.SegFlag;
seg_num=yeid_un.yecanid.SegNum;
dstaddr=yeid_un.yecanid.destMACID;
}
if((dstaddr!=elec_local_addr())&&(dstaddr!=0x1f)){
return;
}
if(receive_message.DLC > 0)
{
yeid_un.Exide = receive_message.ExtId;
ul_exid = yeid_un.Exide << 3;
ul_exid &= ul_can_mask;
if(yeid_un.yecanid.SegFlag == 00)
if(seg == 00)
{
memcpy(canrx_st.rx_databuf,receive_message.Data,receive_message.DLC);
canrx_st.rx_index = receive_message.DLC;
g_self.end_irq(g_self.t,canrx_st.rx_index);
}
else if(yeid_un.yecanid.SegFlag == 0x01)
else if(seg == 0x01)
{
canrx_st.seg_num = 0;
memcpy(canrx_st.rx_databuf,receive_message.Data,receive_message.DLC);
canrx_st.rx_index = receive_message.DLC;
}else if(yeid_un.yecanid.SegFlag == 0x02)
}else if(seg == 0x02)
{
if((canrx_st.seg_num+1) == yeid_un.yecanid.SegNum )
if((canrx_st.seg_num+1) == seg_num )
{
canrx_st.seg_num++;
memcpy(canrx_st.rx_databuf+canrx_st.rx_index,receive_message.Data,receive_message.DLC);
@@ -284,7 +274,7 @@ static void save_data(void)
}else{
//error
}
}else if(yeid_un.yecanid.SegFlag == 0x03)
}else if(seg == 0x03)
{
memcpy(canrx_st.rx_databuf+canrx_st.rx_index,receive_message.Data,receive_message.DLC);
canrx_st.rx_index += receive_message.DLC;