diff --git a/.gitignore b/.gitignore
index d2fe1a1..226621e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,4 @@ quest_info.txt
bootcode.txt
*.uvoptx
build/
+doc/*.bin
diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx
index 78a5865..50dd3ff 100644
--- a/checher_slave.uvoptx
+++ b/checher_slave.uvoptx
@@ -377,7 +377,24 @@
-
+
+
+ 0
+ 0
+ 185
+ 1
+ 134234652
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ .\source\rt_thread\libcpu\arm\cortex-m3\context_rvds.S
+
+ \\checker_slave_app\source/rt_thread/libcpu/arm/cortex-m3/context_rvds.S\185
+
+
0
@@ -388,16 +405,16 @@
1
- 0
- 0x0803b800
+ 1
+ 0x20002CE0
0
2
- 1
- 0x200028C8
+ 8
+ 0x20007088
0
@@ -605,18 +622,18 @@
0
0
- 108
+ 185
1
- 134339522
+ 134234652
0
0
0
0
0
1
- D:\work\SVN\鍐夊窛\mcu_program\checker_slave\source\rt_thread\board.c
+ .\source\rt_thread\libcpu\arm\cortex-m3\context_rvds.S
- \\checker_slave_app\source/rt_thread/board.c\108
+ \\checker_slave_app\source/rt_thread/libcpu/arm/cortex-m3/context_rvds.S\185
diff --git a/doc/__csmzm_app.bin b/doc/__csmzm_app.bin
index ddb338f..201ce2f 100644
Binary files a/doc/__csmzm_app.bin and b/doc/__csmzm_app.bin differ
diff --git a/source/ReadMe.txt b/source/ReadMe.txt
index 4efa6b0..5616df9 100644
--- a/source/ReadMe.txt
+++ b/source/ReadMe.txt
@@ -326,3 +326,8 @@
V2.12 sn为0时如果未写流水号则报错
2024.01.05
收到广播命令时重新初始化定时器,can总线添加发送时长超时判断,超时后自动重发
+2024.1.8
+ V2.13 使用新的can帧回复数据
+ 解决ew自检模式 8导致小板死机的bug,自检返回值除以400,单位0.1ms
+
+
diff --git a/source/codec/codec.c b/source/codec/codec.c
index 2113327..4978ca9 100644
--- a/source/codec/codec.c
+++ b/source/codec/codec.c
@@ -265,8 +265,8 @@ array_def *protm_decode(protu_def *p,array_def *data)
int dst_addrs=arr_get(r,0)|(arr_get(r,1)<<8)|(arr_get(r,2)<<16);
if((dst_addrs&(1<<(self_addr-1)))!=0){
p->silent=1;
- // p->timer->write(p->timer,0);
- p->timer->init(p->timer);
+ p->timer->write(p->timer,0);
+ // p->timer->init(p->timer);
p->rank=calc_bit_num(dst_addrs,self_addr-1);
p->num=calc_bit_num(dst_addrs,32);
arr_remove(r,0,3);
diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c
index ef20de6..0bda2a5 100644
--- a/source/dev/dev_flash.c
+++ b/source/dev/dev_flash.c
@@ -304,6 +304,8 @@ int flash_write(uint8_t *addr,const uint8_t *data,int len)
{
DBG_WARN("addr=%08x write/read data not equate.",addr);
ret=3;
+ }else{
+ ret=0;
}
rt_mutex_release(s->mutex);
return ret;
diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c
index c6e7041..1b2d8a4 100644
--- a/source/elec_det/interface/EWChecker.c
+++ b/source/elec_det/interface/EWChecker.c
@@ -438,7 +438,7 @@ void EW_Test_VerifyThreedCode(void)
@brief 自检
@param 自检模式
@param1 自检时间ms
-@rtv 自检模式0x08的回读数据
+@rtv 自检模式0x08的回读数据(0.1ms)
*/
void EW_Test_CheckSelf()
{
@@ -447,8 +447,10 @@ void EW_Test_CheckSelf()
uint8_t uc_mode = checker_runcfg.params[0];
uc_rtv = EW_ChecSelf(checker_runcfg.netid,uc_mode,(uint8_t*)&ul_temp);
delay_ms(checker_runcfg.params[1]);
+ // 250ns 除以400 单位0.1ms
+ ul_temp/=400;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
- Checker_SetRtv((uint16_t*)ul_temp,checker_runcfg.rtv_count);
+ Checker_SetRtv((uint16_t*)&ul_temp,checker_runcfg.rtv_count);
}
/*
diff --git a/source/interface/if_can.c b/source/interface/if_can.c
index 853354e..3729c21 100644
--- a/source/interface/if_can.c
+++ b/source/interface/if_can.c
@@ -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(len8){
+ 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;
diff --git a/source/interface/if_can.h b/source/interface/if_can.h
index a5b7ebc..06023ca 100644
--- a/source/interface/if_can.h
+++ b/source/interface/if_can.h
@@ -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;
diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h
index 520f238..cc15846 100644
--- a/source/main/compiler_info.h
+++ b/source/main/compiler_info.h
@@ -6,8 +6,8 @@
-#define BUILD_DATE "2024-01-05 18:59:06"
-#define SOFT_VERSION "2.12"
+#define BUILD_DATE "2024-01-08 16:28:07"
+#define SOFT_VERSION "2.13"
diff --git a/source/prebuild.py b/source/prebuild.py
index 8ea4956..e474221 100644
--- a/source/prebuild.py
+++ b/source/prebuild.py
@@ -7,7 +7,7 @@ import mycopy
# 定义软件版本号
-SOFT_VERION = "2.12"
+SOFT_VERION = "2.13"
diff --git a/source/rt_thread/core_delay.c b/source/rt_thread/core_delay.c
index f981743..462afe7 100644
--- a/source/rt_thread/core_delay.c
+++ b/source/rt_thread/core_delay.c
@@ -46,7 +46,29 @@ static uint32_t delay_get_tick(void)
}
+// 获取当前微妙数
+uint32_t delay_get_us(void)
+{
+ return ((uint32_t)DWT_CYCCNT/(get_sys_clocks_freq()/1000000));
+}
+// 判断延时是否到,返回1已到,0未到
+int delay_check(uint32_t old,uint32_t wnd)
+{
+ uint32_t now=delay_get_us();
+ if(now>=old){
+ if((now-old)>=wnd){
+ return 1;
+ }
+ }else{
+ if((UINT32_MAX - old + now)>=wnd){
+ return 1;
+ }
+ }
+ return 0;
+}
+
+// 最长可以延时59s
// 低于1ms的精确延时
void delay_us(uint32_t us)
{
diff --git a/source/rt_thread/core_delay.h b/source/rt_thread/core_delay.h
index 7363b82..587f033 100644
--- a/source/rt_thread/core_delay.h
+++ b/source/rt_thread/core_delay.h
@@ -12,7 +12,9 @@ int delay_init(void);
void delay_us(uint32_t us);
+uint32_t delay_get_us(void);
+int delay_check(uint32_t old,uint32_t wnd);
diff --git a/source/soft/debug.c b/source/soft/debug.c
index bc761f5..295419d 100644
--- a/source/soft/debug.c
+++ b/source/soft/debug.c
@@ -28,7 +28,7 @@
#define DBG_DEV_WRITE(d,len)\
{\
if(g_data.uart){\
- g_data.uart->write(g_data.uart,d,len);\
+ g_data.uart->write(g_data.uart,d,len,1000);\
}\
}
diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c
index c7a0276..9a2f0fe 100644
--- a/source/task/prot_uc.c
+++ b/source/task/prot_uc.c
@@ -13,6 +13,7 @@
#include "dev_flash.h"
#include "mymisc.h"
#include "elec_det.h"
+#include "commend.h"
@@ -251,7 +252,7 @@ protu_def *protu_creat(uart_def *uart)
p->cmd=0xff;// 命令字不可能是0xff
protu_set_endecode_fun(p);
sprintf(name,"protu_t#%d",count);
- rt_thread_t rt_t=rt_thread_create(name,protu_run,p,1024,5,20);
+ rt_thread_t rt_t=rt_thread_create(name,protu_run,p,1024,6,20);
rt_thread_startup(rt_t);
int bsp=sys_param()->uartbsp;
if(bsp==9600)
@@ -287,8 +288,8 @@ array_def *t;
static void protu_send_later(void *ptr)
{
send_pkt_def *s=ptr;
- protu_send(s->p,s->t,50);
- arr_delete(s->t);
+ protu_send(s->p,s->t,1000);
+ // arr_delete(s->t);
}
static send_pkt_def g_send_pkt;
@@ -318,7 +319,7 @@ static int protu_send_ontime(protu_def *p,send_pkt_def *s)
//later_execute(protu_send_later,s,delay);
while(p->timer->read(p->timer)<(tick+delay));
// protu_send_later(s);
- return protu_send(s->p,s->t,wnd_tick-2);
+ return protu_send(s->p,s->t,wnd_tick-1);
}else{
// 单播命令直接发送
@@ -327,12 +328,29 @@ static int protu_send_ontime(protu_def *p,send_pkt_def *s)
}
}
-
-static int protu_send_ontime_loop(protu_def *p,send_pkt_def *s)
+static int g_send_failed_times;
+static int protu_send_ontime_loop(protu_def *p,send_pkt_def *s,int retry)
{
- while(protu_send_ontime(p,s)==0);
+ // g_send_failed_times=0;
+ for(int i=0;it);
return 0;
}
+static int send_failed(list_def *argv)
+{
+ cmd_print("send failed times=%d",g_send_failed_times);
+ return 0;
+}
+
+commend_export(send_failed,send_failed,"print send_failed times")
+
@@ -348,7 +366,7 @@ void protu_reply_call(protu_def *p,array_def *data)
if(t){
g_send_pkt.p=p;
g_send_pkt.t=t;
- protu_send_ontime_loop(p,&g_send_pkt);
+ protu_send_ontime_loop(p,&g_send_pkt,3);
}
}
@@ -371,7 +389,7 @@ void protu_send_call(protu_def *p,uint8_t cmd,array_def *data)
if(t){
g_send_pkt.p=p;
g_send_pkt.t=t;
- protu_send_ontime_loop(p,&g_send_pkt);
+ protu_send_ontime_loop(p,&g_send_pkt,3);
}
}
diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c
index 31cfc1b..e68faed 100644
--- a/source/task/tran_for_slave.c
+++ b/source/task/tran_for_slave.c
@@ -392,7 +392,7 @@ static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *er
addr=g_updata.flash_addr+offset;
ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
array_def *r=arr_creat();
- arr_append(r,(ret!=0));
+ arr_append(r,ret);
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}