diff --git a/app/uart.c b/app/uart.c index 7ca3caa..3e0aa69 100644 --- a/app/uart.c +++ b/app/uart.c @@ -512,8 +512,13 @@ bool UART_IsCommandAvailable(void) CRC = UART_Command.Buffer[Size] | (UART_Command.Buffer[Size + 1] << 8); // char b[2]="3K"; - UART_Send(UART_Command.Buffer, Size); - return (CRC_Calculate(UART_Command.Buffer, Size) != CRC) ? false : true; +// uint8_t tmp[Size]; +// for (int i = 0; i < Size; i++) { +// tmp[i]=UART_Command.Buffer[i]; +// } + + + return (CRC_Calculate(UART_Command.Buffer, Size)!= CRC) ? false : true; } void UART_HandleCommand(void) diff --git a/driver/crc.c b/driver/crc.c index e839d55..dea6fbe 100644 --- a/driver/crc.c +++ b/driver/crc.c @@ -16,6 +16,7 @@ #include "bsp/dp32g030/crc.h" #include "driver/crc.h" +#include "driver/uart.h" void CRC_Init(void) { @@ -47,20 +48,40 @@ void CRC_InitReverse(void) CRC_IV = 0; } #endif -uint16_t CRC_Calculate(const void *pBuffer, uint16_t Size) -{ - const uint8_t *pData = (const uint8_t *)pBuffer; - uint16_t i, Crc; +// uint16_t CRC_Calculate(const void *pBuffer, uint16_t Size) +//{ +// const uint8_t *pData = (const uint8_t *)pBuffer; +// uint16_t i, Crc; +// UART_Send(pData, Size); +// +// CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_ENABLE; +// UART_Send(pData, Size); +// +// for (i = 0; i < Size; i++) { +// CRC_DATAIN = pData[i]; +// } +// Crc = (uint16_t)CRC_DATAOUT; +// +// CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_DISABLE; +// +// return Crc; +//} +#define CRC16_XMODEM_POLY 0x1021 - CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_ENABLE; +uint16_t CRC_Calculate(const void *pBuffer, uint16_t Size) { + const uint8_t *pData = (const uint8_t *)pBuffer; + uint16_t crc = 0; // 初始CRC值为0 - for (i = 0; i < Size; i++) { - CRC_DATAIN = pData[i]; - } - Crc = (uint16_t)CRC_DATAOUT; + while (Size--) { + crc ^= (*pData++) << 8; // 将数据字节的最高位与CRC异或 + for (uint8_t i = 0; i < 8; i++) { + if (crc & 0x8000) { // 检查最高位是否为1 + crc = (crc << 1) ^ CRC16_XMODEM_POLY; // 如果最高位为1,执行CRC多项式计算 + } else { + crc = crc << 1; // 如果最高位为0,继续左移 + } + } + } - CRC_CR = (CRC_CR & ~CRC_CR_CRC_EN_MASK) | CRC_CR_CRC_EN_BITS_DISABLE; - - return Crc; + return crc; } - diff --git a/driver/crc.h b/driver/crc.h index cf192ee..2cda491 100644 --- a/driver/crc.h +++ b/driver/crc.h @@ -20,7 +20,7 @@ #include void CRC_Init(void); -uint16_t CRC_Calculate(const void *pBuffer, uint16_t Size); + uint16_t CRC_Calculate(const void *pBuffer, uint16_t Size); void CRC_InitReverse(void); #endif