|
@@ -13,11 +13,14 @@ uint8_t g_spiRxBuff1[DATA_SIZE] = {0};
|
|
|
|
|
|
static float angle_offset = 0.0;
|
|
|
static float angle_raw = 0.0;
|
|
|
+static float enc_angle = 0.0;
|
|
|
|
|
|
/*************<prototype>**************/
|
|
|
-void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara);
|
|
|
-ERROR_Type SPI_TransmitReceivePoll_V2(SPI_Type *SPIx, uint8_t *rxBuffer, const uint8_t *txBuffer, uint32_t length, uint32_t timeout);
|
|
|
-uint8_t SPI_CRC8(uint8_t *message, uint8_t Bytelength );
|
|
|
+static void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara);
|
|
|
+static uint8_t SPI_CRC8(uint8_t *message, uint8_t Bytelength );
|
|
|
+static float Parse_EncAngle(void);
|
|
|
+
|
|
|
+extern void Process_MotorControl(float angle);
|
|
|
|
|
|
void AngleSensor_Init(void)
|
|
|
{
|
|
@@ -33,7 +36,7 @@ void AngleSensor_Init(void)
|
|
|
/*清零配置结构体变量.*/
|
|
|
memset(&spiConfig, 0x00, sizeof(spiConfig));
|
|
|
|
|
|
- /*初始化SPI参数,波特率 = 0.8Mbps = (F_BCLK / (SCK_LOW+1 + SCK_HIGH+1)).*/
|
|
|
+ /*初始化SPI参数,波特率 = 2Mbps = (F_BCLK / (SCK_LOW+1 + SCK_HIGH+1)).*/
|
|
|
spiConfig.csSetup = 4;/*片选建立时间 = (CS_SETUP + 1) * CLK_PERIOD.*/
|
|
|
spiConfig.csHold = 4;/*片选保持时间 = (CS_HOLD + 1) * CLK_PERIOD.*/
|
|
|
spiConfig.sckHigh = 5;/*SCK高电平时间 = (SCK_HIGH + 1) * CLK_PERIOD.*/
|
|
@@ -45,8 +48,8 @@ void AngleSensor_Init(void)
|
|
|
spiConfig.frmSize = SPI_FRAME_SIZE_16BITS;
|
|
|
spiConfig.rxMsbFirstEn = ENABLE;//选择从最高位开始接收
|
|
|
spiConfig.txMsbFirstEn = ENABLE;//选择从最高位开始发送
|
|
|
- spiConfig.csOutputEn = ENABLE;//CS有SPI硬件控制
|
|
|
- spiConfig.continuousCSEn= ENABLE;//片选连续模式
|
|
|
+ spiConfig.csOutputEn = DISABLE;//CS有SPI硬件控制
|
|
|
+ spiConfig.continuousCSEn= DISABLE;//片选连续模式
|
|
|
spiConfig.dmaRxEn = DISABLE;//禁止使用DMA接收数据
|
|
|
spiConfig.dmaTxEn = DISABLE;//禁止使用DMA发送数据
|
|
|
spiConfig.modeFaultEn = DISABLE;//模式故障禁止
|
|
@@ -59,9 +62,9 @@ void AngleSensor_Init(void)
|
|
|
spiConfig.modeFaultInterruptEn = DISABLE;//模式故障中断
|
|
|
SPI_Init(SPI0, &spiConfig);
|
|
|
|
|
|
-// NVIC_SetPriority(SPI0_IRQn, 1);
|
|
|
-// NVIC_ClearPendingIRQ(SPI0_IRQn);
|
|
|
-// NVIC_EnableIRQ(SPI0_IRQn);
|
|
|
+ NVIC_SetPriority(SPI0_IRQn, 1);
|
|
|
+ NVIC_ClearPendingIRQ(SPI0_IRQn);
|
|
|
+ NVIC_EnableIRQ(SPI0_IRQn);
|
|
|
|
|
|
|
|
|
}
|
|
@@ -71,11 +74,9 @@ void AngleSensor_Setoffset(float offset)
|
|
|
angle_offset = offset;
|
|
|
}
|
|
|
|
|
|
-float AngleSensor_GetAngleInt(void)
|
|
|
-{
|
|
|
- uint16_t angle_value;
|
|
|
- float angle = 0.0;
|
|
|
-
|
|
|
+
|
|
|
+void AngleSensor_GetAngleInt(void)
|
|
|
+{
|
|
|
g_spiTxBuff1[0] = 0x21;
|
|
|
g_spiTxBuff1[1] = 0x80;
|
|
|
g_spiTxBuff1[2] = 0xFF;
|
|
@@ -83,43 +84,21 @@ float AngleSensor_GetAngleInt(void)
|
|
|
g_spiTxBuff1[4] = 0xFF;
|
|
|
g_spiTxBuff1[5] = 0xFF;
|
|
|
|
|
|
- SPI_TransmitReceiveInt(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
|
|
|
- while(!(SPI_GetTransmitReceiveStatus(SPI0) & SPI_STATUS_RX_FINISH_MASK))//等待读取完毕
|
|
|
- {
|
|
|
-
|
|
|
- };
|
|
|
- SPI_MasterReleaseCS(SPI0);
|
|
|
-
|
|
|
- printf("g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", g_spiRxBuff1[0], g_spiRxBuff1[1]);
|
|
|
- printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
|
|
|
- printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
|
|
|
-//
|
|
|
- angle_value = g_spiRxBuff1[3]&0x7F;
|
|
|
- angle_value = (angle_value<<8)|g_spiRxBuff1[2];
|
|
|
- angle = (360.0*angle_value)/32768;
|
|
|
-
|
|
|
- if((g_spiRxBuff1[5]&0x30) != 0x30){
|
|
|
- angle = -180.0;
|
|
|
- printf("angle_raw 111 : %f \r\n", angle);
|
|
|
- }else{
|
|
|
- angle_raw = angle;
|
|
|
- printf("angle_raw 222 : %f \r\n", angle);
|
|
|
-
|
|
|
- angle += angle_offset;
|
|
|
- if(angle > 360.0){
|
|
|
- angle -= 360.0;
|
|
|
- }
|
|
|
-
|
|
|
- if(angle < 0.0){
|
|
|
- angle += 360.0;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+ memset(g_spiRxBuff1, 0x00, 6);
|
|
|
|
|
|
- return angle;
|
|
|
+ ENC_CS_L;
|
|
|
+ SPI_TransmitReceiveInt(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
|
|
|
+// while(!(SPI_GetTransmitReceiveStatus(SPI0) & SPI_STATUS_RX_FINISH_MASK));//等待读取完毕
|
|
|
+// SPI_MasterReleaseCS(SPI0);
|
|
|
+// ENC_CS_H;
|
|
|
|
|
|
+// printf("22g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", g_spiRxBuff1[0], g_spiRxBuff1[1]);
|
|
|
+// printf("22g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
|
|
|
+// printf("22g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
float AngleSensor_GetAnglePolling(void)
|
|
|
{
|
|
|
uint16_t angle_value;
|
|
@@ -137,8 +116,7 @@ float AngleSensor_GetAnglePolling(void)
|
|
|
|
|
|
memset(g_spiRxBuff1, 0x00, 6);
|
|
|
|
|
|
- ret = SPI_TransmitReceivePoll_V2(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6, 2000);
|
|
|
- //ret = SPI_TransmitReceivePoll(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
|
|
|
+ ret = SPI_TransmitReceivePoll(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
|
|
|
|
|
|
if(SUCCESS == ret){
|
|
|
|
|
@@ -151,9 +129,9 @@ float AngleSensor_GetAnglePolling(void)
|
|
|
crc = SPI_CRC8(g_spiTxBuff1, 4);
|
|
|
if(g_spiRxBuff1[4] == crc){
|
|
|
|
|
|
-// printf("crc22 %x: g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", crc, g_spiRxBuff1[0], g_spiRxBuff1[1]);
|
|
|
-// printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
|
|
|
-// printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
|
|
|
+ printf("crc22 %x: g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", crc, g_spiRxBuff1[0], g_spiRxBuff1[1]);
|
|
|
+ printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
|
|
|
+ printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
|
|
|
//
|
|
|
if((g_spiRxBuff1[5]&0x30) != 0x30){
|
|
|
// printf("angle_raw 111 : %f \r\n", angle);
|
|
@@ -177,7 +155,9 @@ float AngleSensor_GetAnglePolling(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ }else{
|
|
|
+ angle = -180.0;
|
|
|
+ }
|
|
|
|
|
|
}else{
|
|
|
angle = -180.0;
|
|
@@ -186,10 +166,25 @@ float AngleSensor_GetAnglePolling(void)
|
|
|
return angle;
|
|
|
}
|
|
|
|
|
|
+void AngleSensor_Read(void)
|
|
|
+{
|
|
|
+ g_spiTxBuff1[0] = 0x21;
|
|
|
+ g_spiTxBuff1[1] = 0x80;
|
|
|
+ g_spiTxBuff1[2] = 0xFF;
|
|
|
+ g_spiTxBuff1[3] = 0xFF;
|
|
|
+ g_spiTxBuff1[4] = 0xFF;
|
|
|
+ g_spiTxBuff1[5] = 0xFF;
|
|
|
+
|
|
|
+ memset(g_spiRxBuff1, 0x00, 6);
|
|
|
+
|
|
|
+ ENC_CS_L;
|
|
|
+ SPI_TransmitReceiveInt(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
float AngleSensor_GetAngle(void)
|
|
|
{
|
|
|
- //return AngleSensor_GetAngleInt();
|
|
|
- return AngleSensor_GetAnglePolling();
|
|
|
+ return enc_angle;
|
|
|
}
|
|
|
|
|
|
float AngleSensor_GetAngleRaw(void)
|
|
@@ -199,7 +194,7 @@ float AngleSensor_GetAngleRaw(void)
|
|
|
|
|
|
void AngleSensor_PrintInfo(void)
|
|
|
{
|
|
|
- printf("AngleSensor angle:%f \r\n", AngleSensor_GetAnglePolling());
|
|
|
+ printf("AngleSensor angle:%f \r\n", AngleSensor_GetAngle());
|
|
|
|
|
|
}
|
|
|
|
|
@@ -208,6 +203,67 @@ void AngleSensor_DeInit(void)
|
|
|
SPI_DeInit(SPI0);
|
|
|
}
|
|
|
|
|
|
+void Angle_Correct(float angle)
|
|
|
+{
|
|
|
+ if(angle < 0){
|
|
|
+ angle_raw = angle;
|
|
|
+ enc_angle = angle;
|
|
|
+
|
|
|
+ }else{
|
|
|
+
|
|
|
+ angle_raw = angle;
|
|
|
+ enc_angle = angle + angle_offset;
|
|
|
+ if(enc_angle > 360.0){
|
|
|
+ enc_angle -= 360.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(enc_angle < 0.0){
|
|
|
+ enc_angle += 360.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+float Parse_EncAngle(void)
|
|
|
+{
|
|
|
+ uint16_t angle_value;
|
|
|
+ uint8_t crc;
|
|
|
+ float angle = 0.0;
|
|
|
+
|
|
|
+ //复用txbuff
|
|
|
+ g_spiTxBuff1[0] = 0x80;
|
|
|
+ g_spiTxBuff1[1] = 0x21;
|
|
|
+ g_spiTxBuff1[2] = g_spiRxBuff1[3];
|
|
|
+ g_spiTxBuff1[3] = g_spiRxBuff1[2];
|
|
|
+
|
|
|
+ crc = SPI_CRC8(g_spiTxBuff1, 4);
|
|
|
+
|
|
|
+// printf("crc %x: g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", crc, g_spiRxBuff1[0], g_spiRxBuff1[1]);
|
|
|
+// printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
|
|
|
+// printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
|
|
|
+
|
|
|
+ if(g_spiRxBuff1[4] == crc){
|
|
|
+
|
|
|
+ if((g_spiRxBuff1[5]&0x30) != 0x30){ //safeword
|
|
|
+ angle = -180.0;
|
|
|
+ }else{
|
|
|
+
|
|
|
+ angle_value = g_spiRxBuff1[3]&0x7F;
|
|
|
+ angle_value = (angle_value<<8)|g_spiRxBuff1[2];
|
|
|
+ angle = (360.0*angle_value)/32768;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }else{
|
|
|
+ angle = -180.0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return angle;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @prototype SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
|
|
|
*
|
|
@@ -218,6 +274,8 @@ void AngleSensor_DeInit(void)
|
|
|
*/
|
|
|
void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
|
|
|
{
|
|
|
+ //printf("SPI0_Callback wpara=0x%x, lpara=0x%x \r\n", wpara, lpara);
|
|
|
+
|
|
|
if (wpara & SPI_STATUS_TXUF_Msk)
|
|
|
{
|
|
|
//TX下溢处理
|
|
@@ -227,150 +285,25 @@ void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
|
|
|
//RX溢出处理
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+ if(SPI_GetTransmitReceiveStatus(SPI0) & SPI_STATUS_RX_FINISH_MASK) //等待读取完毕
|
|
|
+ {
|
|
|
+ //printf("SPI0_Callback SPI_STATUS_RX_FINISH_MASK \r\n");
|
|
|
|
|
|
-/*!
|
|
|
-* @brief Clear SPI Tx under flow and Rx over flow status
|
|
|
-*
|
|
|
-* @param[in] SPIx: SPI type pointer,x can be 0 to 1
|
|
|
-* @return Function status
|
|
|
-* 0: ERROR, occour Tx under flow or Rx over flow flag
|
|
|
-* 1: SUCCESS, no Tx under flow and Rx over flow flag
|
|
|
-*/
|
|
|
-static ERROR_Type MY_SPI_ClearTxUFRxOF(SPI_Type *SPIx)
|
|
|
-{
|
|
|
- ERROR_Type ret = SUCCESS;
|
|
|
-
|
|
|
- /* Clear Tx under flow flag */
|
|
|
- if (SPI_IsTxUF(SPIx))
|
|
|
- {
|
|
|
- SPI_ClearTxUF(SPIx);
|
|
|
- ret = ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /* Do nothing */
|
|
|
- }
|
|
|
-
|
|
|
- /* Clear Rx over flow flag */
|
|
|
- if (SPI_IsRxOF(SPIx))
|
|
|
- {
|
|
|
- SPI_ClearRxOF(SPIx);
|
|
|
- ret = ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /* Do nothing */
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
+ ENC_CS_H;
|
|
|
+ Angle_Correct(Parse_EncAngle());
|
|
|
+
|
|
|
+ Process_MotorControl(enc_angle);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
-/*!
|
|
|
-* @brief SPI transmission,reception by polling
|
|
|
-*
|
|
|
-* @param[in] SPIx: SPI type pointer,x can be 0 to 1
|
|
|
-* @param[in] rxBuffer: point to the receive data
|
|
|
-* @param[in] txBuffer: point to the send data
|
|
|
-* @param[in] length: transfer data length
|
|
|
-* @param[in] timeout: timeout us
|
|
|
-* @return Function status
|
|
|
-* 0: ERROR, length is 0 or rdbuff is NULL or txBuffer is NULL
|
|
|
-* 1: SUCCESS
|
|
|
-*/
|
|
|
-ERROR_Type SPI_TransmitReceivePoll_V2(SPI_Type *SPIx, uint8_t *rxBuffer, const uint8_t *txBuffer, uint32_t length, uint32_t timeout)
|
|
|
-{
|
|
|
- uint32_t i = 0;
|
|
|
- uint32_t _time_us = 0;
|
|
|
- ERROR_Type ret = SUCCESS;
|
|
|
-
|
|
|
- DEVICE_ASSERT(IS_SPI_PERIPH(SPIx));
|
|
|
-
|
|
|
- if ((length == 0) || (rxBuffer == NULL) || (txBuffer == NULL))
|
|
|
- {
|
|
|
- ret = ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /* Disable Tx/Rx only mode */
|
|
|
- SPI_SetTxOnly(SPIx, DISABLE);
|
|
|
- SPI_SetRxOnly(SPIx, DISABLE);
|
|
|
-
|
|
|
- if ((SPI_FrameSizeType)SPI_GetFRMSize(SPIx) > SPI_FRAME_SIZE_8BITS) /* FrameSize is 9 bits ~ 16 bits */
|
|
|
- {
|
|
|
- if (((uint32_t)txBuffer & 0x01) || ((uint32_t)rxBuffer & 0x01)) /* txBuffer or rxBufer is not half-word alignment */
|
|
|
- {
|
|
|
- ret = ERROR;
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- length = length >> 0x01u;
|
|
|
- /* transmit and receive data */
|
|
|
- for (i = 0; i < length; i++)
|
|
|
- {
|
|
|
- while (!SPI_IsTxEF(SPIx) &&(_time_us < timeout))
|
|
|
- {
|
|
|
- udelay(1);
|
|
|
- _time_us++;
|
|
|
- }
|
|
|
- SPI_WriteDataReg(SPIx, ((uint16_t *)txBuffer)[i]);
|
|
|
- while (!SPI_IsRxFF(SPIx) &&(_time_us < timeout))
|
|
|
- {
|
|
|
- udelay(1);
|
|
|
- _time_us++;
|
|
|
- }
|
|
|
- ((uint16_t *)rxBuffer)[i] = SPI_ReadDataReg(SPIx);
|
|
|
- }
|
|
|
- }
|
|
|
- else /* FrameSize is 4 bits ~ 8 bits */
|
|
|
- {
|
|
|
- /* transmit and receive data */
|
|
|
- for (i = 0; i < length; i++)
|
|
|
- {
|
|
|
- while (!SPI_IsTxEF(SPIx) &&(_time_us < timeout))
|
|
|
- {
|
|
|
- udelay(1);
|
|
|
- _time_us++;
|
|
|
- }
|
|
|
- SPI_WriteDataReg(SPIx, txBuffer[i]);
|
|
|
- while (!SPI_IsRxFF(SPIx) &&(_time_us < timeout))
|
|
|
- {
|
|
|
- udelay(1);
|
|
|
- _time_us++;
|
|
|
- }
|
|
|
- rxBuffer[i] = (uint8_t)SPI_ReadDataReg(SPIx);
|
|
|
- }
|
|
|
- }
|
|
|
- while ((SPI_IsBusy(SPIx)));
|
|
|
- SPI_CSRelease(SPIx);
|
|
|
- }
|
|
|
-
|
|
|
- /* Check and Clear Tx under flow/ Rx over flow flag */
|
|
|
- if (MY_SPI_ClearTxUFRxOF(SPIx) == ERROR)
|
|
|
- {
|
|
|
- ret = ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((_time_us >= timeout)){
|
|
|
- ret = ERROR;
|
|
|
- }
|
|
|
- /* Do nothing */
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
|
|
|
//CRC对照表
|
|
|
const uint8_t SPI_TableCRC[256] =
|
|
|
{
|
|
|
- //The ?°crc?± of the position [1] (result from operation [crc ^*(message+Byteidx)])
|
|
|
- //is 0x00 -> 0x00 XOR 0x11D = 0x00 (1 byte).
|
|
|
0x00,
|
|
|
- //The ?°crc?± of the position [2] is 0x1D -> 0x01 XOR 0x11D = 0x1D (1 byte).
|
|
|
0x1D,
|
|
|
- //The ?°crc?± of the position [3] is 0x3A -> 0x02 XOR 0x11D = 0x3A (1 byte).
|
|
|
0x3A,
|
|
|
//For all the rest of the cases.
|
|
|
0x27, 0x74, 0x69, 0x4E, 0x53, 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, 0xCD,
|
|
@@ -400,26 +333,17 @@ const uint8_t SPI_TableCRC[256] =
|
|
|
//配置
|
|
|
uint8_t SPI_CRC8(uint8_t *message, uint8_t Bytelength )
|
|
|
{
|
|
|
- //?°crc?± defined as the 8-bits that will be generated through the message till the
|
|
|
- //final crc is generated. In the example above this are the blue lines out of the
|
|
|
- //XOR operation.
|
|
|
+
|
|
|
uint8_t crc;
|
|
|
- //?°Byteidx?± is a counter to compare the bytes used for the CRC calculation and
|
|
|
- //?°Bytelength?±.
|
|
|
uint8_t Byteidx;
|
|
|
//Initially the CRC remainder has to be set with the original seed (0xFF for the TLE5012B).
|
|
|
crc = 0xFF;
|
|
|
//For all the bytes of the message.
|
|
|
for(Byteidx=0; Byteidx<Bytelength; Byteidx++)
|
|
|
{
|
|
|
- //?°crc?± is the value in the look-up table TableCRC[x] at the position ?°x?±.
|
|
|
- //The position ?°x?± is determined as the XOR operation between the previous ?°crc?± and
|
|
|
- //the next byte of the ?°message?±.
|
|
|
- //?°^?± is the XOR operator.
|
|
|
crc = SPI_TableCRC[crc ^ *(message+Byteidx)];
|
|
|
}
|
|
|
- //Return the inverted ?°crc?± remainder(?°~?± is the invertion operator). An alternative
|
|
|
- //to the ?°~?± operator would be a XOR operation between ?°crc?± and a 0xFF polynomial.
|
|
|
+
|
|
|
return(~crc);
|
|
|
}
|
|
|
|