From 0fcd2db86a36af6dae5cb555ae43ddf2b111bbaa Mon Sep 17 00:00:00 2001 From: sunbeam Date: Wed, 25 Jun 2025 08:43:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E9=80=8F=E4=BC=A0OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 + .vscode/settings.json | 4 +- ASW/CherryRB | 1 + ASW/UartDiagApp/Uart2CanDiag/CanDrv.c | 96 +++++++++++-- ASW/UartDiagApp/Uart2CanDiag/CanDrv.h | 4 + .../Uart2CanDiag/Uart2CanDiagApp.c | 136 +++++++++++++++++- .../Uart2CanDiag/Uart2CanDiagApp.h | 5 +- ASW/UartDiagApp/ud_66.c | 7 +- ASW/uartapp.c | 6 +- ASW/uartapp.h | 3 + CMakeLists.txt | 1 + 11 files changed, 240 insertions(+), 26 deletions(-) create mode 100644 .gitmodules create mode 160000 ASW/CherryRB diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..26b2c79 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ASW/CherryRB"] + path = ASW/CherryRB + url = https://github.com/cherry-embedded/CherryRB.git diff --git a/.vscode/settings.json b/.vscode/settings.json index b6d67c0..234151d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,8 @@ "files.associations": { "candrv.h": "c", "stm32l4xx_hal.h": "c", - "uart2candiagapp.h": "c" + "uart2candiagapp.h": "c", + "chry_ringbuffer.h": "c", + "stdio.h": "c" } } \ No newline at end of file diff --git a/ASW/CherryRB b/ASW/CherryRB new file mode 160000 index 0000000..19ea7c6 --- /dev/null +++ b/ASW/CherryRB @@ -0,0 +1 @@ +Subproject commit 19ea7c6efcf19dc9e805a0a662212533ee5b1edb diff --git a/ASW/UartDiagApp/Uart2CanDiag/CanDrv.c b/ASW/UartDiagApp/Uart2CanDiag/CanDrv.c index 4ec5db8..65488ba 100644 --- a/ASW/UartDiagApp/Uart2CanDiag/CanDrv.c +++ b/ASW/UartDiagApp/Uart2CanDiag/CanDrv.c @@ -3,6 +3,9 @@ ******************************************************************************/ #include "CanDrv.h" #include +#include "Uart2CanDiagApp.h" +#include +#include "CherryRB/chry_ringbuffer.h" /******************************************************************************* * the defines @@ -21,6 +24,11 @@ extern CAN_HandleTypeDef hcan1; static CAN_TxHeaderTypeDef txhead; static uint32_t TxMailbox = CAN_TX_MAILBOX0; +static uint16_t respID = 0,phyID = 0; + +static chry_ringbuffer_t rb; +static uint8_t mempool[64]; +static uint8_t FlagRbErr,FlagGetFC; /******************************************************************************* * the const ******************************************************************************/ @@ -30,6 +38,9 @@ static uint32_t TxMailbox = CAN_TX_MAILBOX0; /******************************************************************************* * the functions ******************************************************************************/ + + + uint8_t CanDrv_Init(void) { txhead.StdId = TEST_ID; @@ -38,19 +49,13 @@ uint8_t CanDrv_Init(void) txhead.TransmitGlobalTime = DISABLE; txhead.DLC = 8; HAL_CAN_Start(&hcan1); - CAN_FilterTypeDef filter; - filter.FilterMode = CAN_FILTERMODE_IDMASK; - filter.FilterIdHigh = 0x7B2 << 5; // 注意:标准 ID 要左移 5 位 - filter.FilterMaskIdHigh = 0x7FF << 5; - filter.FilterFIFOAssignment = CAN_RX_FIFO0; - filter.FilterBank = 0; - - filter.FilterScale = CAN_FILTERSCALE_32BIT; - filter.FilterActivation = CAN_FILTER_ENABLE; - - - HAL_CAN_ConfigFilter(&hcan1,&filter); + CanDrv_SetFilter(0x777,0);//for test HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING); + + if(0 != chry_ringbuffer_init(&rb, mempool, 64)) + { + printf("err:can rb init\n"); + } return 0; } @@ -78,6 +83,7 @@ uint8_t CanDrv_GetCANTxEmpty(void) return 0; } +//中断函数 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef rxmsg; @@ -85,8 +91,72 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&rxmsg,data); if (rxmsg.StdId >= 0x600) { - printf("get id:0x%03x",rxmsg.StdId); + //printf("get id:0x%03x",rxmsg.StdId); + if (respID == rxmsg.StdId) + { + uint32_t len = chry_ringbuffer_write(&rb, data, 8); + if (len != 8) + { + FlagRbErr = 1; + printf("err:ring buf write\n"); + } + + } + } +} + +uint8_t CanDrv_SetFilter(uint16_t id,uint8_t bank) +{ + CAN_FilterTypeDef filter; + filter.FilterMode = CAN_FILTERMODE_IDMASK; + filter.FilterIdHigh = id << 5; // 注意:标准 ID 要左移 5 位 + filter.FilterMaskIdHigh = 0x7FF << 5; + filter.FilterFIFOAssignment = CAN_RX_FIFO0; + filter.FilterBank = bank; + + filter.FilterScale = CAN_FILTERSCALE_32BIT; + filter.FilterActivation = CAN_FILTER_ENABLE; + + + HAL_CAN_ConfigFilter(&hcan1,&filter); + return 0; +} + +void CanDrv_SetDiagID(uint16_t pid,uint16_t rid) +{ + CanDrv_SetFilter(rid,1); + respID = rid; + phyID = pid; +} + + + +uint8_t CanDrv_isGetFC(void) +{ + uint8_t ret = 0; + ret = FlagGetFC; + FlagGetFC = 0; + return ret; +} + +void CanDrv_MsgRecvTask(void) +{ + uint8_t data[8]; + uint32_t len = chry_ringbuffer_read(&rb, data, 8); + if (len) + { + if (len == 8) + { + //缓冲区中有数据 + U2CD_PackDiagMsg(data); + } + else + { + FlagRbErr = 1; + } + } + } \ No newline at end of file diff --git a/ASW/UartDiagApp/Uart2CanDiag/CanDrv.h b/ASW/UartDiagApp/Uart2CanDiag/CanDrv.h index 102cfe3..8d25904 100644 --- a/ASW/UartDiagApp/Uart2CanDiag/CanDrv.h +++ b/ASW/UartDiagApp/Uart2CanDiag/CanDrv.h @@ -32,6 +32,10 @@ uint8_t CanDrv_Init(void); uint8_t CanDrv_Txmsg(uint16_t id,uint8_t * data); void CanDrv_Test(void); uint8_t CanDrv_GetCANTxEmpty(void); +uint8_t CanDrv_SetFilter(uint16_t id,uint8_t bank); +void CanDrv_SetDiagID(uint16_t pid,uint16_t rid); +void CanDrv_MsgRecvTask(void); +uint8_t CanDrv_isGetFC(void); #endif diff --git a/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.c b/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.c index 5970db4..5aa6340 100644 --- a/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.c +++ b/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.c @@ -5,13 +5,16 @@ #include #include #include "CanDrv.h" +#include "uartapp.h" /******************************************************************************* * the defines ******************************************************************************/ -#define TX_BUF_SIZE 2050 +#define U2CD_TX_BUF_SIZE 2050 +#define U2CD_RX_BUF_SIZE 128 #define N_Bs 150 #define N_As 70 -#define P2_SERVER 50 +#define P2_SERVER 150 + /******************************************************************************* * the typedefs ******************************************************************************/ @@ -35,13 +38,15 @@ static uint8_t U2CD_fill; static uint8_t U2CD_cfgFlag; static uint8_t U2CD_TTFlag; static uint16_t U2CD_TTLen; -static uint8_t U2CD_Txbuf[TX_BUF_SIZE]; +static uint8_t U2CD_Txbuf[U2CD_TX_BUF_SIZE]; static uint16_t U2CD_TxCnt;//发送数据指针 static uint8_t U2CD_TxSN; static uint8_t U2CD_TxTimeCounter; - +static uint8_t U2CD_WaitRespFlag = 0; static uint8_t U2CD_FCFlag = 0; static uint8_t U2CD_Framebuf[8]; + +static uint8_t U2CD_Rxbuf[U2CD_RX_BUF_SIZE]; static U2CD_TASK_STATE task_state; /******************************************************************************* * the const @@ -55,6 +60,8 @@ static U2CD_TASK_STATE task_state; static void U2CD_TxSF(uint16_t id,uint8_t* data,uint16_t len); static void U2CD_TxFF(uint16_t id,uint8_t* data,uint16_t len); static void U2CD_TxCF(uint16_t id,uint8_t* data,uint16_t len); +static void U2CD_TxFC(uint16_t id); + void U2CD_Init(void) { @@ -73,6 +80,9 @@ void U2CD_cfg(uint16_t pid,uint16_t fid,uint16_t rid,uint8_t stmin,uint8_t fill) U2CD_stmin = stmin; U2CD_fill = fill; U2CD_cfgFlag = 1; + + CanDrv_SetDiagID(pid,rid); + printf("ok:config finished\n"); } else { @@ -87,25 +97,32 @@ void U2CD_TickTask(void) } void U2CD_Task(void) { + CanDrv_MsgRecvTask(); switch (task_state) { case U2CD_TASK_idle: if (U2CD_TTFlag == 1) { + if (U2CD_TTLen <= 7) { + //printf("debug:send SF\n"); U2CD_TxSF(U2CD_pid,U2CD_Txbuf,U2CD_TTLen); task_state = U2CD_TASK_WaitResp; U2CD_TxTimeCounter = 0; + U2CD_WaitRespFlag = 0; } else { + //printf("debug:send FF"); U2CD_TxFF(U2CD_pid,U2CD_Txbuf,U2CD_TTLen); task_state = U2CD_TASK_WaitFC; U2CD_TxTimeCounter = 0; U2CD_FCFlag = 0; } - + + U2CD_TTFlag = 0; + U2CD_TTLen = 0; } break; @@ -117,6 +134,7 @@ void U2CD_Task(void) } if (U2CD_FCFlag == 1) { + U2CD_FCFlag = 0; U2CD_TxTimeCounter = 0; task_state = U2CD_TASK_TxCF; } @@ -157,6 +175,13 @@ void U2CD_Task(void) printf("err:P2_SERVER timeout\n"); task_state = U2CD_TASK_idle; } + if (U2CD_WaitRespFlag == 1) + { + //printf("ok:get resp\n"); + U2CD_WaitRespFlag = 0; + task_state = U2CD_TASK_idle; + } + break; default: break; @@ -165,7 +190,7 @@ void U2CD_Task(void) void U2CD_TTreq(uint8_t* data,uint16_t len) { - if (len > TX_BUF_SIZE) + if (len > U2CD_TX_BUF_SIZE) { printf("err:len too long"); return; @@ -185,6 +210,90 @@ void U2CD_TTreq(uint8_t* data,uint16_t len) memcpy(U2CD_Txbuf,data,len); U2CD_TTLen = len; U2CD_TTFlag = 1; + +} + +void U2CD_DiagMsgProReq(uint8_t *data,uint16_t len) +{ + U2CD_WaitRespFlag = 1; + //printf("ok:get pdu\n"); + printf("data:"); + uartapp_TxHexData(data,len); + printf("\nend\n"); +} + +void U2CD_PackDiagMsg(uint8_t *data) +{ + //变量大小需要考虑PDU_BUF_SIZE大小 + static uint8_t pointer,maxlen,flag_getff,last_frame_sn; + + + uint8_t n_pci = data[0]>>4; + + switch (n_pci) + { + case 0://单帧 + maxlen = data[0]&0x0f; + memcpy(U2CD_Rxbuf,&data[1],maxlen); + U2CD_DiagMsgProReq(U2CD_Rxbuf,maxlen); + flag_getff = 0; + break; + case 1://首帧 + maxlen = ((data[0]&0x0f)<<8) + data[1]; + if (maxlen <= U2CD_RX_BUF_SIZE) + { + U2CD_TxFC(U2CD_pid); + memcpy(U2CD_Rxbuf,&data[2],6); + flag_getff = 1; + last_frame_sn = 0; + pointer = 6; + } + else + { + printf("err:data too long\n"); + } + + + break; + case 2://连续帧 + if (flag_getff != 1) + { + //未收到首帧 + printf("err:not get ff\n"); + break; + } + uint8_t frame_sn = data[0]&0x0f; + if (((last_frame_sn+1)&0x0f) == frame_sn) + {//sn 正确 + if (pointer+7 >= maxlen) + {//最后一帧 + memcpy(&U2CD_Rxbuf[pointer],&data[1],(maxlen-pointer)); + U2CD_DiagMsgProReq(U2CD_Rxbuf,maxlen); + flag_getff = 0; + //printf("debug:lcf\n"); + } + else + { + //printf("debug:cf\n"); + memcpy(&U2CD_Rxbuf[pointer],&data[1],7); + pointer+=7; + } + last_frame_sn = frame_sn; + + } + else + { + printf("err:sn err %d\n",frame_sn); + } + break; + case 3: + //printf("ok:get FC\n"); + U2CD_FCFlag = 1; + break; + default: + break; + } + } static void U2CD_TxSF(uint16_t id,uint8_t* data,uint16_t len) @@ -225,4 +334,17 @@ static void U2CD_TxCF(uint16_t id,uint8_t* data,uint16_t len) CanDrv_Txmsg(id,U2CD_Framebuf); U2CD_TxSN++; -} \ No newline at end of file +} + +static void U2CD_TxFC(uint16_t id) +{ + U2CD_Framebuf[0] = 0x30; + U2CD_Framebuf[1] = 8;//bs + U2CD_Framebuf[2] = 0;//stmin + + for (uint8_t i = 3; i < 8; i++) + { + U2CD_Framebuf[i] = U2CD_fill; + } + CanDrv_Txmsg(id,U2CD_Framebuf); +} diff --git a/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.h b/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.h index 6b3f550..85bea1d 100644 --- a/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.h +++ b/ASW/UartDiagApp/Uart2CanDiag/Uart2CanDiagApp.h @@ -31,8 +31,9 @@ void U2CD_Init(void); void U2CD_cfg(uint16_t pid,uint16_t fid,uint16_t rid,uint8_t stmin,uint8_t fill); void U2CD_Task(void); void U2CD_TickTask(void); - - +void U2CD_DiagMsgProReq(uint8_t *data,uint16_t len); +void U2CD_PackDiagMsg(uint8_t *data); +void U2CD_TTreq(uint8_t* data,uint16_t len); #endif diff --git a/ASW/UartDiagApp/ud_66.c b/ASW/UartDiagApp/ud_66.c index 33357c9..a3316d9 100644 --- a/ASW/UartDiagApp/ud_66.c +++ b/ASW/UartDiagApp/ud_66.c @@ -3,7 +3,7 @@ ******************************************************************************/ #include "ud_66.h" #include "Uart2CanDiagApp.h" - +#include /******************************************************************************* * the defines ******************************************************************************/ @@ -54,7 +54,9 @@ void uartapp_cmd66(uint8_t* data, uint16_t len) ud66_cfg(data+1,len-1); break; - + case CMD66_TTreq: + U2CD_TTreq(data+1,len-1); + break; default: break; } @@ -73,6 +75,7 @@ static void ud66_cfg(uint8_t* data, uint16_t len) uint8_t stmin = data[6]; uint8_t fill = data[7]; U2CD_cfg(pid,fid,rid,stmin,fill); + //printf("pid=%x\n",pid); } } diff --git a/ASW/uartapp.c b/ASW/uartapp.c index f4a4023..c3c7810 100644 --- a/ASW/uartapp.c +++ b/ASW/uartapp.c @@ -150,7 +150,7 @@ void uartapp_maintask(void) } else { - printf("err rxsize=%d\n", rxsize); + printf("err:format err\n"); } maintask_gotoidle(); @@ -191,3 +191,7 @@ static void uartapp_cmdpro(uint8_t* data, uint16_t len) } } +void uartapp_TxHexData(uint8_t* data, uint16_t len) +{ + HAL_UART_Transmit(&huart1, (uint8_t*)data, len, len*100); +} \ No newline at end of file diff --git a/ASW/uartapp.h b/ASW/uartapp.h index efaeed3..18f366d 100644 --- a/ASW/uartapp.h +++ b/ASW/uartapp.h @@ -59,6 +59,9 @@ void uartapp_init(void); void uartapp_maintask(void); uint32_t crc_calc(uint32_t addr,uint32_t len); +void uartapp_TxHexData(uint8_t* data, uint16_t len); + + #endif /*DEFINES_NAME*/ diff --git a/CMakeLists.txt b/CMakeLists.txt index b37357d..7eaf406 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,7 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/asw/ ${PROJECT_SOURCE_DIR}/asw/UartDiagApp/ ${PROJECT_SOURCE_DIR}/asw/UartDiagApp/Uart2CanDiag + ${PROJECT_SOURCE_DIR}/ASW/CherryRB ) # Add project symbols (macros)