From 830ba4d3eb64790b9a7861c45af4d4854d0baf89 Mon Sep 17 00:00:00 2001 From: wmano Date: Mon, 18 Aug 2025 21:47:05 +0800 Subject: [PATCH] using usart2 --- .gitignore | 7 +- apps/chrg/.config | 10 + apps/chrg/applications/usart2.c | 49 +++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 169 +++---- apps/chrg/board/Kconfig | 141 +++++- apps/chrg/board/board.c | 9 - apps/chrg/board/board.h | 9 - apps/chrg/board/linker_scripts/link.icf | 6 +- apps/chrg/board/linker_scripts/link.lds | 2 +- apps/chrg/board/linker_scripts/link.sct | 15 + apps/chrg/project.uvprojx | 413 +++++++++--------- apps/chrg/rtconfig.h | 3 + docs/PD31双向电源协议_V6.15.xlsx | Bin 0 -> 51732 bytes docs/pins.xlsx | Bin 0 -> 10230 bytes docs/变电压协议设置格式(sink)_V1.1.txt | 94 ++++ docs/变电压协议设置格式(source)_V1.0.txt | 84 ++++ keilkill.bat | 1 - lib/freemodbus/samples/sample_mb_master.c | 2 +- 18 files changed, 685 insertions(+), 329 deletions(-) create mode 100644 apps/chrg/applications/usart2.c create mode 100644 apps/chrg/board/linker_scripts/link.sct create mode 100644 docs/PD31双向电源协议_V6.15.xlsx create mode 100644 docs/pins.xlsx create mode 100644 docs/变电压协议设置格式(sink)_V1.1.txt create mode 100644 docs/变电压协议设置格式(source)_V1.0.txt diff --git a/.gitignore b/.gitignore index a9c3110..51b3184 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,9 @@ vdso.lds __pychache__ _rt_thread ~* -si4 \ No newline at end of file +si4 +.picasa.ini +DebugConfig +Objects +*.uvguix.* +*.uvoptx diff --git a/apps/chrg/.config b/apps/chrg/.config index 4bdd53c..cda33ed 100644 --- a/apps/chrg/.config +++ b/apps/chrg/.config @@ -1497,6 +1497,16 @@ CONFIG_BSP_USING_UART1=y CONFIG_BSP_USING_UART2=y # CONFIG_BSP_UART2_RX_USING_DMA is not set # CONFIG_BSP_UART2_TX_USING_DMA is not set +CONFIG_BSP_USING_UART3=y +# CONFIG_BSP_UART3_RX_USING_DMA is not set +# CONFIG_BSP_UART3_TX_USING_DMA is not set +CONFIG_BSP_USING_UART4=y +# CONFIG_BSP_UART4_RX_USING_DMA is not set +# CONFIG_BSP_UART4_TX_USING_DMA is not set +# CONFIG_BSP_USING_UART5 is not set +CONFIG_BSP_USING_UART6=y +# CONFIG_BSP_UART6_RX_USING_DMA is not set +# CONFIG_BSP_UART6_TX_USING_DMA is not set # CONFIG_BSP_USING_RNG is not set # CONFIG_BSP_USING_UDID is not set # end of On-chip Peripheral Drivers diff --git a/apps/chrg/applications/usart2.c b/apps/chrg/applications/usart2.c new file mode 100644 index 0000000..0eaf993 --- /dev/null +++ b/apps/chrg/applications/usart2.c @@ -0,0 +1,49 @@ +#include +#include + +static rt_device_t serial_usart2; + +rt_err_t usart2_rx_irq(rt_device_t dev, rt_size_t size) +{ + rt_kprintf("rx_irq\r\n"); + + return RT_EOK; +} + +rt_err_t usart2_open(void) +{ + rt_err_t ret; + + serial_usart2 = rt_device_find("uart2"); + if (RT_NULL == serial_usart2) { + rt_kprintf("can't find usart2.\r\n"); + return RT_ERROR; + } + + ret = rt_device_open(serial_usart2, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX); + if (RT_EOK != ret) { + rt_kprintf("open usart2 failed.\r\n"); + return RT_ERROR; + } + + struct serial_configure uart2_set_parg={ \ + BAUD_RATE_115200, /* 115200 bits/s */ \ + DATA_BITS_8, /* 8 databits */ \ + STOP_BITS_1, /* 1 stopbit */ \ + PARITY_NONE, /* No parity */ \ + BIT_ORDER_LSB, /* LSB first sent */ \ + NRZ_NORMAL, /* Normal mode */ \ + RT_SERIAL_RB_BUFSZ, /* Buffer size */ \ + 0 \ + }; + + rt_device_control(serial_usart2, RT_DEVICE_CTRL_CONFIG, &uart2_set_parg); + + rt_device_set_rx_indicate(serial_usart2, usart2_rx_irq); + + return RT_EOK; +} + +INIT_APP_EXPORT(usart2_open); + + diff --git a/apps/chrg/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/apps/chrg/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c index e1b2d70..1c68c34 100644 --- a/apps/chrg/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c +++ b/apps/chrg/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -1,81 +1,8 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : stm32f4xx_hal_msp.c - * Description : This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - ** This notice applies to any and all portions of this file - * that are not between comment pairs USER CODE BEGIN and - * USER CODE END. Other portions of this file, whether - * inserted by the user or by software development tools - * are owned by their respective copyright owners. - * - * COPYRIGHT(c) 2018 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ #include "main.h" -/* USER CODE BEGIN Includes */ + #include -/* USER CODE END Includes */ -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** @@ -108,9 +35,6 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitTypeDef GPIO_InitStruct = {0}; if(huart->Instance==USART1) { - /* USER CODE BEGIN USART1_MspInit 0 */ - - /* USER CODE END USART1_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); @@ -125,14 +49,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN USART1_MspInit 1 */ - - /* USER CODE END USART1_MspInit 1 */ } else if(huart->Instance==USART2) { - /* USER CODE BEGIN USART2_MspInit 0 */ - - /* USER CODE END USART2_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); @@ -147,10 +64,52 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + } else if(huart->Instance==USART3) { + /* Peripheral clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); - /* USER CODE BEGIN USART2_MspInit 1 */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } else if(huart->Instance==UART4) { + /* Peripheral clock enable */ + __HAL_RCC_UART4_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**UART2 GPIO Configuration + PC10 ------> UART4_TX + PC11 ------> UART4_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + } else if(huart->Instance==USART6) { + /* Peripheral clock enable */ + __HAL_RCC_USART6_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**USART6 GPIO Configuration + PC6 ------> USART6_TX + PC7 ------> USART6_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_USART6; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE END USART2_MspInit 1 */ } } @@ -166,9 +125,6 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) { if(huart->Instance==USART1) { - /* USER CODE BEGIN USART1_MspDeInit 0 */ - - /* USER CODE END USART1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART1_CLK_DISABLE(); @@ -177,14 +133,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) PA3 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); - - /* USER CODE BEGIN USART1_MspDeInit 1 */ - - /* USER CODE END USART1_MspDeInit 1 */ } else if(huart->Instance==USART2) { - /* USER CODE BEGIN USART2_MspDeInit 0 */ - - /* USER CODE END USART2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART2_CLK_DISABLE(); @@ -193,10 +142,34 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) PA3 ------> USART2_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + } else if(huart->Instance==USART3) { + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); - /* USER CODE BEGIN USART2_MspDeInit 1 */ + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11); + } else if(huart->Instance==UART4) { + /* Peripheral clock disable */ + __HAL_RCC_UART4_CLK_DISABLE(); + + /**UART4 GPIO Configuration + PC10 ------> UART4_TX + PC11 ------> UART4_RX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); + } else if(huart->Instance==USART6) { + /* Peripheral clock disable */ + __HAL_RCC_USART6_CLK_DISABLE(); + + /**USART6 GPIO Configuration + PC6 ------> USART6_TX + PC7 ------> USART6_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6|GPIO_PIN_7); - /* USER CODE END USART2_MspDeInit 1 */ } } diff --git a/apps/chrg/board/Kconfig b/apps/chrg/board/Kconfig index 86bd9ca..c190ab3 100644 --- a/apps/chrg/board/Kconfig +++ b/apps/chrg/board/Kconfig @@ -52,7 +52,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_DMA_PING_BUFSIZE int "Set UART1 RX DMA ping-pong buffer size" range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA + depends on BSP_UART4_RX_USING_DMA && RT_USING_SERIAL_V2 default 32 config BSP_USING_UART2 @@ -86,8 +86,145 @@ menu "On-chip Peripheral Drivers" config BSP_UART2_DMA_PING_BUFSIZE int "Set UART2 RX DMA ping-pong buffer size" range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA + depends on BSP_UART4_RX_USING_DMA && RT_USING_SERIAL_V2 default 32 + + config BSP_USING_UART3 + bool "Enable UART3" + default y + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_RX_BUFSIZE + int "Set UART3 RX buffer size" + range 64 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART3_TX_BUFSIZE + int "Set UART3 TX buffer size" + range 0 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART3_DMA_PING_BUFSIZE + int "Set UART3 RX DMA ping-pong buffer size" + range 32 65535 + depends on BSP_UART4_RX_USING_DMA && RT_USING_SERIAL_V2 + default 32 + + config BSP_USING_UART4 + bool "Enable UART4" + default y + + config BSP_UART4_RX_USING_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_TX_USING_DMA + bool "Enable UART4 TX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_RX_BUFSIZE + int "Set UART4 RX buffer size" + range 64 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART4_TX_BUFSIZE + int "Set UART4 TX buffer size" + range 0 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART4_DMA_PING_BUFSIZE + int "Set UART4 RX DMA ping-pong buffer size" + range 32 65535 + depends on BSP_UART4_RX_USING_DMA && RT_USING_SERIAL_V2 + default 32 + + config BSP_USING_UART5 + bool "Enable UART5" + default y + + config BSP_UART5_RX_USING_DMA + bool "Enable UART5 RX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_TX_USING_DMA + bool "Enable UART5 TX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_RX_BUFSIZE + int "Set UART5 RX buffer size" + range 64 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART5_TX_BUFSIZE + int "Set UART5 TX buffer size" + range 0 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART5_DMA_PING_BUFSIZE + int "Set UART5 RX DMA ping-pong buffer size" + range 32 65535 + depends on BSP_UART5_RX_USING_DMA && RT_USING_SERIAL_V2 + default 32 + + config BSP_USING_UART6 + bool "Enable UART6" + default y + + config BSP_UART6_RX_USING_DMA + bool "Enable UART6 RX DMA" + depends on BSP_USING_UART6 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART6_TX_USING_DMA + bool "Enable UART6 TX DMA" + depends on BSP_USING_UART6 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART6_RX_BUFSIZE + int "Set UART6 RX buffer size" + range 64 65535 + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART6_TX_BUFSIZE + int "Set UART6 TX buffer size" + range 0 65535 + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART6_DMA_PING_BUFSIZE + int "Set UART6 RX DMA ping-pong buffer size" + range 32 65535 + depends on BSP_UART6_RX_USING_DMA && RT_USING_SERIAL_V2 + default 32 + endif source "$(RTT_DIR)/bsp/stm32/libraries/HAL_Drivers/drivers/Kconfig" diff --git a/apps/chrg/board/board.c b/apps/chrg/board/board.c index 306fc43..b7d9010 100644 --- a/apps/chrg/board/board.c +++ b/apps/chrg/board/board.c @@ -1,12 +1,3 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2018-11-06 SummerGift first version - */ #include #include diff --git a/apps/chrg/board/board.h b/apps/chrg/board/board.h index 6ef645f..58f3c06 100644 --- a/apps/chrg/board/board.h +++ b/apps/chrg/board/board.h @@ -1,12 +1,3 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2018-11-5 SummerGift first version - */ #ifndef __BOARD_H__ #define __BOARD_H__ diff --git a/apps/chrg/board/linker_scripts/link.icf b/apps/chrg/board/linker_scripts/link.icf index 269874c..03968b9 100644 --- a/apps/chrg/board/linker_scripts/link.icf +++ b/apps/chrg/board/linker_scripts/link.icf @@ -2,10 +2,10 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; +define symbol __ICFEDIT_intvec_start__ = 0x08010000; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_ROM_start__ = 0x08010000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF; define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM1_end__ = 0x2001FFFF; define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000; diff --git a/apps/chrg/board/linker_scripts/link.lds b/apps/chrg/board/linker_scripts/link.lds index 3c53046..201271d 100644 --- a/apps/chrg/board/linker_scripts/link.lds +++ b/apps/chrg/board/linker_scripts/link.lds @@ -7,7 +7,7 @@ /* Program Entry, set to mark it as "used" and avoid gc */ MEMORY { - CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + CODE (rx) : ORIGIN = 0x08010000, LENGTH = 256k /* 256KB flash */ RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 64K sram */ } diff --git a/apps/chrg/board/linker_scripts/link.sct b/apps/chrg/board/linker_scripts/link.sct new file mode 100644 index 0000000..a0309ab --- /dev/null +++ b/apps/chrg/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08010000 0x00040000 { ; load region size_region + ER_IROM1 0x08010000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/apps/chrg/project.uvprojx b/apps/chrg/project.uvprojx index 69219f8..3a1fb00 100644 --- a/apps/chrg/project.uvprojx +++ b/apps/chrg/project.uvprojx @@ -275,8 +275,8 @@ 1 - 0x8000000 - 0x100000 + 0x8010000 + 0x40000 1 @@ -337,9 +337,9 @@ 0 - RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_ARMLIBC, USE_HAL_DRIVER, __RTTHREAD__, STM32F405xx, __STDC_LIMIT_MACROS + USE_HAL_DRIVER, STM32F405xx, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, __STDC_LIMIT_MACROS, RT_USING_LIBC, RT_USING_ARMLIBC - ..\..\lib\freemodbus\modbus\include;..\..\rt-thread\components\drivers\phy;..\..\lib\stm32f4\STM32F4_HAL\Inc;..\..\lib\freemodbus\modbus\rtu;..\..\rt-thread\components\drivers\include;..\..\lib\freemodbus\port;.;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers;..\..\rt-thread\components\net\netdev\include;..\..\rt-thread\components\drivers\smp_call;..\..\rt-thread\components\net\sal\include\socket;..\..\lib\cmsis-core\Include;..\..\lib\stm32f4\STM32F4_CMSIS\Include;..\..\rt-thread\libcpu\arm\cortex-m4;board\CubeMX_Config\Inc;..\..\rt-thread\components\libc\compilers\common\extension\fcntl\octal;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\config;..\..\rt-thread\libcpu\arm\common;..\..\rt-thread\include;..\..\rt-thread\components\libc\posix\io\epoll;..\..\lib\stm32f4\STM32F4_HAL\Inc\Legacy;..\..\rt-thread\components\libc\posix\ipc;..\..\rt-thread\components\libc\posix\io\poll;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\compilers\common\extension;..\..\rt-thread\components\libc\compilers\common\include;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers;..\..\lib\freemodbus\modbus\ascii;board;..\..\rt-thread\components\drivers\include;applications;..\..\lib\freemodbus\modbus\tcp;..\..\rt-thread\components\finsh;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\net\sal\include\socket\sys_socket;..\..\rt-thread\components\net\sal\include;..\..\rt-thread\components\libc\posix\io\eventfd;..\..\rt-thread\components\drivers\include + ..\..\rt-thread\components\drivers\include;..\..\lib\cmsis-core\Include;board;..\..\rt-thread\components\finsh;..\..\rt-thread\components\net\netdev\include;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers;..\..\rt-thread\components\drivers\phy;..\..\rt-thread\libcpu\arm\common;..\..\rt-thread\components\libc\compilers\common\extension\fcntl\octal;..\..\rt-thread\include;applications;..\..\rt-thread\components\libc\posix\io\poll;..\..\rt-thread\components\net\sal\include\socket\sys_socket;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\posix\ipc;..\..\lib\stm32f4\STM32F4_CMSIS\Include;..\..\lib\stm32f4\STM32F4_HAL\Inc\Legacy;..\..\lib\freemodbus\modbus\ascii;..\..\lib\freemodbus\modbus\rtu;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\compilers\common\include;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\config;..\..\rt-thread\components\drivers\smp_call;..\..\lib\freemodbus\port;..\..\lib\freemodbus\modbus\tcp;..\..\rt-thread\components\drivers\include;.;..\..\rt-thread\components\libc\posix\io\epoll;..\..\rt-thread\components\libc\posix\io\eventfd;..\..\rt-thread\components\net\sal\include;..\..\rt-thread\components\net\sal\include\socket;..\..\lib\freemodbus\modbus\include;..\..\rt-thread\libcpu\arm\cortex-m4;..\..\lib\stm32f4\STM32F4_HAL\Inc;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\compilers\common\extension;board\CubeMX_Config\Inc @@ -388,6 +388,11 @@ 1 applications\main.c + + usart2.c + 1 + applications\usart2.c + @@ -1145,6 +1150,16 @@ Finsh + + shell.c + 1 + ..\..\rt-thread\components\finsh\shell.c + + + msh.c + 1 + ..\..\rt-thread\components\finsh\msh.c + cmd.c 1 @@ -1155,26 +1170,136 @@ 1 ..\..\rt-thread\components\finsh\msh_parse.c - - msh.c - 1 - ..\..\rt-thread\components\finsh\msh.c - - - shell.c - 1 - ..\..\rt-thread\components\finsh\shell.c - FreeModbus + + mbfuncholding.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncholding.c + + + mb_m.c + 1 + ..\..\lib\freemodbus\modbus\mb_m.c + + + sample_mb_master.c + 1 + ..\..\lib\freemodbus\samples\sample_mb_master.c + user_mb_app_m.c 1 ..\..\lib\freemodbus\port\user_mb_app_m.c + + mbrtu.c + 1 + ..\..\lib\freemodbus\modbus\rtu\mbrtu.c + + + mbfuncinput_m.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncinput_m.c + + + mbfunccoils.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfunccoils.c + + + mbutils.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbutils.c + + + mbcrc.c + 1 + ..\..\lib\freemodbus\modbus\rtu\mbcrc.c + + + mbrtu_m.c + 1 + ..\..\lib\freemodbus\modbus\rtu\mbrtu_m.c + + + sample_mb_slave.c + 1 + ..\..\lib\freemodbus\samples\sample_mb_slave.c + + + porttcp.c + 1 + ..\..\lib\freemodbus\port\porttcp.c + + + portserial_m.c + 1 + ..\..\lib\freemodbus\port\portserial_m.c + + + porttimer.c + 1 + ..\..\lib\freemodbus\port\porttimer.c + + + portserial.c + 1 + ..\..\lib\freemodbus\port\portserial.c + + + mb.c + 1 + ..\..\lib\freemodbus\modbus\mb.c + + + porttimer_m.c + 1 + ..\..\lib\freemodbus\port\porttimer_m.c + + + mbfuncinput.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncinput.c + + + mbfuncholding_m.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncholding_m.c + + + mbfuncother.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncother.c + + + port.c + 1 + ..\..\lib\freemodbus\port\port.c + + + mbfuncdisc_m.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncdisc_m.c + + + user_mb_app.c + 1 + ..\..\lib\freemodbus\port\user_mb_app.c + + + mbfuncdiag.c + 1 + ..\..\lib\freemodbus\modbus\functions\mbfuncdiag.c + + + portevent_m.c + 1 + ..\..\lib\freemodbus\port\portevent_m.c + mbfuncdisc.c 1 @@ -1190,126 +1315,6 @@ 1 ..\..\lib\freemodbus\port\portevent.c - - mb_m.c - 1 - ..\..\lib\freemodbus\modbus\mb_m.c - - - mb.c - 1 - ..\..\lib\freemodbus\modbus\mb.c - - - mbfuncinput_m.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncinput_m.c - - - port.c - 1 - ..\..\lib\freemodbus\port\port.c - - - portserial.c - 1 - ..\..\lib\freemodbus\port\portserial.c - - - porttimer_m.c - 1 - ..\..\lib\freemodbus\port\porttimer_m.c - - - mbutils.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbutils.c - - - sample_mb_slave.c - 1 - ..\..\lib\freemodbus\samples\sample_mb_slave.c - - - portevent_m.c - 1 - ..\..\lib\freemodbus\port\portevent_m.c - - - mbfuncdiag.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncdiag.c - - - mbfuncholding.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncholding.c - - - portserial_m.c - 1 - ..\..\lib\freemodbus\port\portserial_m.c - - - mbrtu.c - 1 - ..\..\lib\freemodbus\modbus\rtu\mbrtu.c - - - mbfuncdisc_m.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncdisc_m.c - - - porttcp.c - 1 - ..\..\lib\freemodbus\port\porttcp.c - - - user_mb_app.c - 1 - ..\..\lib\freemodbus\port\user_mb_app.c - - - mbfunccoils.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfunccoils.c - - - mbfuncinput.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncinput.c - - - mbfuncholding_m.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncholding_m.c - - - porttimer.c - 1 - ..\..\lib\freemodbus\port\porttimer.c - - - mbcrc.c - 1 - ..\..\lib\freemodbus\modbus\rtu\mbcrc.c - - - mbfuncother.c - 1 - ..\..\lib\freemodbus\modbus\functions\mbfuncother.c - - - sample_mb_master.c - 1 - ..\..\lib\freemodbus\samples\sample_mb_master.c - - - mbrtu_m.c - 1 - ..\..\lib\freemodbus\modbus\rtu\mbrtu_m.c - @@ -2161,30 +2166,30 @@ klibc - kerrno.c + rt_vsscanf.c 1 - ..\..\rt-thread\src\klibc\kerrno.c - - - rt_vsnprintf_tiny.c - 1 - ..\..\rt-thread\src\klibc\rt_vsnprintf_tiny.c + ..\..\rt-thread\src\klibc\rt_vsscanf.c kstdio.c 1 ..\..\rt-thread\src\klibc\kstdio.c - - rt_vsscanf.c - 1 - ..\..\rt-thread\src\klibc\rt_vsscanf.c - kstring.c 1 ..\..\rt-thread\src\klibc\kstring.c + + rt_vsnprintf_tiny.c + 1 + ..\..\rt-thread\src\klibc\rt_vsnprintf_tiny.c + + + kerrno.c + 1 + ..\..\rt-thread\src\klibc\kerrno.c + @@ -2245,55 +2250,25 @@ STM32F4-CMSIS - - startup_stm32f405xx.s - 2 - ..\..\lib\stm32f4\STM32F4_CMSIS\Source\Templates\arm\startup_stm32f405xx.s - system_stm32f4xx.c 1 ..\..\lib\stm32f4\STM32F4_CMSIS\Source\Templates\system_stm32f4xx.c + + startup_stm32f405xx.s + 2 + ..\..\lib\stm32f4\STM32F4_CMSIS\Source\Templates\arm\startup_stm32f405xx.s + STM32F4-HAL - stm32f4xx_hal.c + stm32f4xx_hal_pwr.c 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal.c - - - stm32f4xx_hal_rcc_ex.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc_ex.c - - - stm32f4xx_hal_pwr_ex.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr_ex.c - - - stm32f4xx_hal_uart.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_uart.c - - - stm32f4xx_hal_cryp.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cryp.c - - - stm32f4xx_hal_gpio.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_gpio.c - - - stm32f4xx_hal_dma_ex.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_dma_ex.c + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr.c stm32f4xx_hal_crc.c @@ -2301,44 +2276,74 @@ ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_crc.c - stm32f4xx_hal_usart.c + stm32f4xx_hal_rcc_ex.c 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_usart.c + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc_ex.c - stm32f4xx_hal_rng.c + stm32f4xx_hal_dma_ex.c 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rng.c - - - stm32f4xx_hal_rcc.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc.c - - - stm32f4xx_hal_cortex.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cortex.c + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_dma_ex.c stm32f4xx_hal_cryp_ex.c 1 ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cryp_ex.c - - stm32f4xx_hal_cec.c - 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cec.c - stm32f4xx_hal_dma.c 1 ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_dma.c - stm32f4xx_hal_pwr.c + stm32f4xx_hal_rng.c 1 - ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr.c + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_gpio.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_cryp.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_cec.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_usart.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_usart.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_rcc.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_uart.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_cortex.c + 1 + ..\..\lib\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cortex.c diff --git a/apps/chrg/rtconfig.h b/apps/chrg/rtconfig.h index e6b8133..d00ca61 100644 --- a/apps/chrg/rtconfig.h +++ b/apps/chrg/rtconfig.h @@ -474,6 +474,9 @@ #define BSP_STM32_UART_V1_TX_TIMEOUT 2000 #define BSP_USING_UART1 #define BSP_USING_UART2 +#define BSP_USING_UART3 +#define BSP_USING_UART4 +#define BSP_USING_UART6 /* end of On-chip Peripheral Drivers */ /* Board extended module Drivers */ diff --git a/docs/PD31双向电源协议_V6.15.xlsx b/docs/PD31双向电源协议_V6.15.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..09bfebc8b1b127532b271419caedfdc89bee5747 GIT binary patch literal 51732 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 ZMo48j81U)>0EpmE09e7_QT_4l{{XX;<6!^* literal 0 HcmV?d00001 diff --git a/docs/变电压协议设置格式(sink)_V1.1.txt b/docs/变电压协议设置格式(sink)_V1.1.txt new file mode 100644 index 0000000..e74ef61 --- /dev/null +++ b/docs/变电压协议设置格式(sink)_V1.1.txt @@ -0,0 +1,94 @@ +冠达快充板(SINK)通讯协议 + +2025.8.13 + +SINK的ID为1,波特率200K,TTL + +1.读取变电压板电压 +(要实时比较设置的快充指令和读回来的快充指令,若有不一样,则重设) +(注意vooc模式下数据返回会很慢) + +发送: +0B 00 01 20 loadvh loadvl loadch loadcl nc nc CRC8 //长度+nc+id+指令+负载电压(2字节,0.01V)+负载电流(2字节,mA)+2个预留字节+CRC8校验 +回复: +15 00 01 20 VH VL qc_data1 qc_data2 qc_data3 qc_data4 qc_data5 qc_data6 ver_h ver_l nc nc nc nc nc nc CRC8 +//长度+nc+ID+指令+2字节电压(0.01V)+6字节快充指令+2字节版本号+6字节预留+CRC8校验 + + +2.读取源端的PD协议数据(当前为PDO,PPS,PD3.1,AVS协议时有效) +发送:05 00 01 13 2A +回复: +XX 00 01 13 //长度(根据实际计算)+NC+ID+指令 +00 00 VMINH VMINL VMAXH VMAXL CURH/PORH CURL/PORL NC NC NC NC NC NC +//源类型(1字节,00为PDO,03为APDO) + PPS类型(1字节,源类型为3时有效,00为SPR PPS,01为EPR AVS,02为SPR AVS) + 最小电压(2字节,mV) + 最大电压(2字节,mV) + 最大电流/功率(2字节,mA/W) + 预留(6字节,当PPS类型为02时有效,意义与前6字节一致) +00 00 VMINH VMINL VMAXH VMAXL CURH/PORH CURL/PORL NC NC NC NC NC NC +...... +CRC8 + + + +3.设置CC线 +发送: +06 00 01 17 00 2A //长度+nc+id+指令+CC(0为都选通,1为选择CC1,2为CC2,3为全断开)+CRC8校验 +回复: +05 00 01 17 2A //长度+nc+id+指令+CRC8校验 + + +4.设置CC线电平 +发送: +06 00 01 16 00 2A //长度+nc+id+指令+电平等级(0-10,默认7)+CRC8校验 +回复: +05 00 01 16 2A //长度+nc+id+指令+CRC8校验 + + +5.设置快充协议(VOOC,UFCS模式下切换其他模式时,需要先把V+,V-,D+,D-,CC等和变电压有关的继电器切至悬空,至少等待1s后,等能读到数据且快充指令正确,再把继电器切回) +格式: +长度+NC+ID+6字节快充数据+CRC8 +发送: +1、QC2.0,电压5V/9V/12V/20V, 命令:0A 00 01 F8 5A 00 00 00 00 2A //第5个字节为电压(0.1V) +2、QC3.0,电压3.3-20V, 命令:0A 00 01 F6 5A 00 00 00 00 2A //第5个字节为电压(0.1V) +3、FCP,电压5V/9V/12V, 命令:0A 00 01 F2 78 00 00 00 00 2A //第5个字节为电压(0.1V) +4、AFC,命令:0A 00 01 F9 46 00 00 00 00 2A //第5个字节为变电压数据,详细参考AFC文档 +5、SCP,命令:0A 00 01 F3 27 10 0F A0 00 2A //5,6字节为电压(mv),7、8字节为电流(mA) +6、VIVO , 命令:0A 00 01 FD 27 10 00 00 00 2A //5,6字节为电压(mv),7、8字节为电流(mA) +7、传音/TFC,命令:0A 00 01 F7 2E E0 00 00 00/01 2A //5,6字节为电压(mv),7、8字节为电流(mA),9字节为RFC/TFC选择 +8、PDO手动,需要设定组号,电压和产品相关,命令:0A 00 01 FB 05 00 00 00 00 2A //5字节为组号 +9、PDO自动,组号设为0,自动变到指定电压,命令:0A 00 01 FB 00 2E E0 00 00 2A //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) +10、PPS手动,需要设定组号、电压、电流,电流0最大, 命令: 0A 00 01 FC 06 4E 20 00 00 2A //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) +11、PPS自动,组号设为0,设定电压、电流,电流0最大, 命令:0A 00 01 FC 00 4E 20 00 00 2A //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) +12、PD3.1, 命令:0A 00 01 E1 00 2328 07d0 2A (组号设置和电压设置都支持) //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) +13、UFCS,命令:0A 00 01 E0 00 2328 07d0 2A (组号设置和电压设置都支持) //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) +14、VOOC,电压10/11V, 命令:0A 00 01 E2 00 0000 0000 2A // +15、AVS,命令:0A 00 01 E3 00 4e20 07d0 2A (组号设置和电压设置都支持) //5字节为组号,6,7字节为电压(mv),8、9字节为电流(mA) + +回复: +回复最基本的5个字节: +长度+NC+ID+指令+CRC8 + + + + + + +CRC8校验算法如下: + +u8 get_crc(u8 *dat,u8 k) +{ + u8 i,res; + res=0x55; + for(i=0;i>=1;res|=0x80;}// + else{res>>=1;} + dat>>=1; + } + return res; +} \ No newline at end of file diff --git a/docs/变电压协议设置格式(source)_V1.0.txt b/docs/变电压协议设置格式(source)_V1.0.txt new file mode 100644 index 0000000..43a10e8 --- /dev/null +++ b/docs/变电压协议设置格式(source)_V1.0.txt @@ -0,0 +1,84 @@ +冠达快充板(SOURCE)通讯协议 + +2025.8.2 + +SOURCE的ID为2,波特率200K + +1.读取数据 +发送: +0B 00 02 20 volh voll curh curl nc nc CRC8 +//长度+nc+id+指令+2字节当前电源电压(mV)+2字节当前电源电流(mA)+2个预留字节+CRC8校验 +回复: +15 00 02 20 VH VL setvh setvl setch setcl NC NC verh verl NC NC NC NC NC NC CRC8 +//长度+nc+ID+指令+2字节读取的电压(0.01V)+2字节source设置电压(mV)+2字节source设置电流(mA)+2字节预留+2字节版本号+6字节预留+CRC8校验 + + +2.读取source的PD协议数据(当前为PDO,PPS,PD3.1,AVS协议时有效) +发送:05 00 02 13 2A +回复: +XX 00 02 13 //长度(根据实际计算)+NC+ID+指令 +00 00 VMAXH VMAXL VMINH VMINL CURH/PORH CURL/PORL NC NC NC NC NC NC +//源类型(1字节,00为PDO,03为APDO) + PPS类型(1字节,源类型为3时有效,00为SPR PPS,01为EPR AVS,02为SPR AVS) + 最大电压(2字节,mV) + 最小电压(2字节,mA) + 最大电流/功率(2字节,mA/W) + 预留(6字节,当协议类型为02时有效,意义与前6字节一致) +00 00 VMAXH VMAXL VMINH VMINL CURH/PORH CURL/PORL NC NC NC NC NC NC +...... +CRC8 + + +3.设置CC线电平 +发送: +06 00 02 16 00 2A //长度+nc+id+指令+电平等级(0xff为根据当前电流自动设置,否则为手动设定,设置方法待定)+CRC8校验 +回复: +05 00 02 16 2A //长度+nc+id+指令+CRC8校验 + + +4.设置支持的快充协议 +发送: +XX 00 02 D0 //长度(根据实际计算)+NC+ID+指令 +00 00 00 VMAXH VMAXL VMINH VMINL CURH/PORH CURL/PORL NC NC NC NC NC NC +//协议(1字节) + 源类型(1字节,PD协议有效,00为PDO,03为APDO) + PPS类型(1字节,PD协议有效,源类型为3时有效,00为SPR PPS,01为EPR AVS,02为SPR AVS) + 最大电压(2字节,mV) + 最小电压(2字节,mA) + 最大电流/功率(2字节,mA/W) + 预留(6字节,当协议类型为02时有效,意义与前6字节一致) +00 00 00 VMAXH VMAXL VMINH VMINL CURH/PORH CURL/PORL NC NC NC NC NC NC +...... +CRC8 +回复: +05 00 02 D0 CRC8 + +协议字节含义如下: +00 无快充 +01 VIFC(暂不支持) +02 FCP +03 SCP +04 预留 +05 预留 +06 RFC(暂不支持) +07 QC3.0 +08 QC2.0 +09 AFC +0A PDO/PPS +0B 预留 +0C UFCS +0D PD3.1/AVS +0E VOOC(暂不支持) + + +CRC8校验算法如下: + +u8 get_crc(u8 *dat,u8 k) +{ + u8 i,res; + res=0x55; + for(i=0;i>=1;res|=0x80;}// + else{res>>=1;} + dat>>=1; + } + return res; +} \ No newline at end of file diff --git a/keilkill.bat b/keilkill.bat index cdca8ee..4fba9c2 100644 --- a/keilkill.bat +++ b/keilkill.bat @@ -22,7 +22,6 @@ del JLinkLog.txt /s del *.iex /s del *.htm /s -del *.sct /s del *.map /s del *.dbgconf /s diff --git a/lib/freemodbus/samples/sample_mb_master.c b/lib/freemodbus/samples/sample_mb_master.c index 8c7c9a4..3da075c 100644 --- a/lib/freemodbus/samples/sample_mb_master.c +++ b/lib/freemodbus/samples/sample_mb_master.c @@ -60,7 +60,7 @@ static void send_thread_entry(void *parameter) static void mb_master_poll(void *parameter) { - eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY); + eMBMasterInit(MB_RTU, 6, PORT_BAUDRATE, PORT_PARITY); eMBMasterEnable(); while (1)