V2.13 使用新的can帧回复数据
解决ew自检模式 8导致小板死机的bug,自检返回值除以400,单位0.1ms
This commit is contained in:
@@ -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;
|
||||
|
@@ -4,6 +4,8 @@
|
||||
//#include "define.h"
|
||||
#include "stm32f10x_can.h"
|
||||
|
||||
|
||||
|
||||
typedef struct{
|
||||
uint32_t Reserve1 :3;
|
||||
uint32_t srcMACID :5;
|
||||
@@ -14,11 +16,26 @@ typedef struct{
|
||||
uint32_t SegFlag :2;
|
||||
uint32_t SegNum :8;
|
||||
|
||||
}YeCanID_st_old;
|
||||
|
||||
|
||||
|
||||
typedef struct{
|
||||
uint32_t SegNum :8;
|
||||
uint32_t Reserve0 :2;
|
||||
uint32_t ACK :1;
|
||||
uint32_t FunClass :6;
|
||||
uint32_t SegFlag :2;
|
||||
uint32_t destMACID :5;
|
||||
uint32_t srcMACID :5;
|
||||
uint32_t Reserve1 :3;
|
||||
|
||||
}YeCanID_st;
|
||||
|
||||
typedef union{
|
||||
uint32_t Exide;
|
||||
YeCanID_st yecanid;
|
||||
YeCanID_st_old yecanid_old;
|
||||
}YeCanID_un;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user