CRC-15-CAN을 계산하는 프로그램을 작성했습니다.
소개
직장에서 CAN 통신 프로그램을 쓰고 있지만 CRC 오류 표시가 나온다.
디버깅을 위해 CRC 변환 프로그램이 필요했습니다.
CAN의 CRC는 CRC-15라는 특수한 형식으로 인터넷에 자료가 적다.
소스나 조사한 것을 정리해 두기로 했다.
구현 예
언어는 c를 사용.
(추기) 코멘트에서 int_to_binstr()의 종단 처리등의 기술이 빠져 있었다고 하는 지적이 있어, 수정했다.
#include <stdio.h>
#include <stdint.h>
// int to bin
char* int_to_binstr(char buff[], int bin, int len)
{
int i;
for (i = 0; i < len; i++) {
if (bin & (1UL << (len - i - 1))) {
buff[i] = '1';
}
else {
buff[i] = '0';
}
}
buff[len] = '\0';
return buff;
}
uint16_t can_crc_next(uint16_t crc, uint8_t data)
{
uint8_t i;
crc ^= (uint16_t)data << 7;
for (i = 0; i < 8; i++) {
crc <<= 1;
if (crc & 0x8000) {
crc ^= 0xc599;
}
}
return crc & 0x7fff;
}
void cal_crc15(unsigned char* buff, int len) {
uint16_t crc;
crc = 0;
printf("crc15 0x");
for (int i = 0; i < len; i++) {
printf("%02X ", buff[i]);
}
printf("\n-> ");
for (int i = 0; i < len; i++) {
crc = can_crc_next(crc, buff[i]);
}
char binstr[16];
printf("0x%04X(%s)\n", crc, int_to_binstr(binstr, (int)crc, 15));
}
int main()
{
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
cal_crc15(data, 11);
}
CRC 원본 데이터 정보
CRC의 원래 데이터는 SOF에서 데이터까지. 직원 조금은 제외한다.
바이너리는 HEX로 만든다.
SOF측이 반단인 비트가 되도록 한다.
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
프로그램 동작
CRC의 초기값은 0.
crc = 0;
데이터를 HEX마다 꺼내고 7비트 왼쪽 시프트하여 CRC와 배타적 논리합을 취한다.
crc ^= (uint16_t)data << 7;
CRC를 1비트 왼쪽 시프트
crc <<= 1;
CRC의 최상위 비트가 1이면 CRC15 생성 다항식 x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1(=0xc599)과의 배타적 논리합을 취한다.
if (crc & 0x8000) {
crc ^= 0xc599;
}
15비트이므로 16비트의 최상위 비트를 생략한다.
return crc & 0x7fff;
주의
CAN 컨트롤러(MCP2515)의 토출된 값과 일치하는 것은 확인되지만, CAN15의 사양과 정확히 일치하는지는 확인할 수 없다.
아마 괜찮다고 생각하지만.
참고 URL
ht tp // // 흠 m. 에아시ぇぇct로 cs. 루/ゔぃ에 w와 피 c. php? f=49&t=34508
htps : // 이 m /에 Q 죄 / ms / 5bf1d8d9 음 16d83951
htps : // m / da rb / ms / 669 2 2 5 57 f1 90
htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 5 % B7 % 1 % 5 % 9B % 9 % 5 % 86 % 97 % 9 % 95 % B7 % 6 % 4 % 9C % 6 % 9F % b
htps : // / ゔょ g. 그렇게 r세후레. 이오/crc-타타구에/1-15. htm#crc. 또는 tbi ts. 15
Reference
이 문제에 관하여(CRC-15-CAN을 계산하는 프로그램을 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bigben/items/88c0afb77135d686f73a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
언어는 c를 사용.
(추기) 코멘트에서 int_to_binstr()의 종단 처리등의 기술이 빠져 있었다고 하는 지적이 있어, 수정했다.
#include <stdio.h>
#include <stdint.h>
// int to bin
char* int_to_binstr(char buff[], int bin, int len)
{
int i;
for (i = 0; i < len; i++) {
if (bin & (1UL << (len - i - 1))) {
buff[i] = '1';
}
else {
buff[i] = '0';
}
}
buff[len] = '\0';
return buff;
}
uint16_t can_crc_next(uint16_t crc, uint8_t data)
{
uint8_t i;
crc ^= (uint16_t)data << 7;
for (i = 0; i < 8; i++) {
crc <<= 1;
if (crc & 0x8000) {
crc ^= 0xc599;
}
}
return crc & 0x7fff;
}
void cal_crc15(unsigned char* buff, int len) {
uint16_t crc;
crc = 0;
printf("crc15 0x");
for (int i = 0; i < len; i++) {
printf("%02X ", buff[i]);
}
printf("\n-> ");
for (int i = 0; i < len; i++) {
crc = can_crc_next(crc, buff[i]);
}
char binstr[16];
printf("0x%04X(%s)\n", crc, int_to_binstr(binstr, (int)crc, 15));
}
int main()
{
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
cal_crc15(data, 11);
}
CRC 원본 데이터 정보
CRC의 원래 데이터는 SOF에서 데이터까지. 직원 조금은 제외한다.
바이너리는 HEX로 만든다.
SOF측이 반단인 비트가 되도록 한다.
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
프로그램 동작
CRC의 초기값은 0.
crc = 0;
데이터를 HEX마다 꺼내고 7비트 왼쪽 시프트하여 CRC와 배타적 논리합을 취한다.
crc ^= (uint16_t)data << 7;
CRC를 1비트 왼쪽 시프트
crc <<= 1;
CRC의 최상위 비트가 1이면 CRC15 생성 다항식 x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1(=0xc599)과의 배타적 논리합을 취한다.
if (crc & 0x8000) {
crc ^= 0xc599;
}
15비트이므로 16비트의 최상위 비트를 생략한다.
return crc & 0x7fff;
주의
CAN 컨트롤러(MCP2515)의 토출된 값과 일치하는 것은 확인되지만, CAN15의 사양과 정확히 일치하는지는 확인할 수 없다.
아마 괜찮다고 생각하지만.
참고 URL
ht tp // // 흠 m. 에아시ぇぇct로 cs. 루/ゔぃ에 w와 피 c. php? f=49&t=34508
htps : // 이 m /에 Q 죄 / ms / 5bf1d8d9 음 16d83951
htps : // m / da rb / ms / 669 2 2 5 57 f1 90
htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 5 % B7 % 1 % 5 % 9B % 9 % 5 % 86 % 97 % 9 % 95 % B7 % 6 % 4 % 9C % 6 % 9F % b
htps : // / ゔょ g. 그렇게 r세후레. 이오/crc-타타구에/1-15. htm#crc. 또는 tbi ts. 15
Reference
이 문제에 관하여(CRC-15-CAN을 계산하는 프로그램을 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bigben/items/88c0afb77135d686f73a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
CRC의 초기값은 0.
crc = 0;
데이터를 HEX마다 꺼내고 7비트 왼쪽 시프트하여 CRC와 배타적 논리합을 취한다.
crc ^= (uint16_t)data << 7;
CRC를 1비트 왼쪽 시프트
crc <<= 1;
CRC의 최상위 비트가 1이면 CRC15 생성 다항식 x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1(=0xc599)과의 배타적 논리합을 취한다.
if (crc & 0x8000) {
crc ^= 0xc599;
}
15비트이므로 16비트의 최상위 비트를 생략한다.
return crc & 0x7fff;
주의
CAN 컨트롤러(MCP2515)의 토출된 값과 일치하는 것은 확인되지만, CAN15의 사양과 정확히 일치하는지는 확인할 수 없다.
아마 괜찮다고 생각하지만.
참고 URL
ht tp // // 흠 m. 에아시ぇぇct로 cs. 루/ゔぃ에 w와 피 c. php? f=49&t=34508
htps : // 이 m /에 Q 죄 / ms / 5bf1d8d9 음 16d83951
htps : // m / da rb / ms / 669 2 2 5 57 f1 90
htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 5 % B7 % 1 % 5 % 9B % 9 % 5 % 86 % 97 % 9 % 95 % B7 % 6 % 4 % 9C % 6 % 9F % b
htps : // / ゔょ g. 그렇게 r세후레. 이오/crc-타타구에/1-15. htm#crc. 또는 tbi ts. 15
Reference
이 문제에 관하여(CRC-15-CAN을 계산하는 프로그램을 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bigben/items/88c0afb77135d686f73a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ht tp // // 흠 m. 에아시ぇぇct로 cs. 루/ゔぃ에 w와 피 c. php? f=49&t=34508
htps : // 이 m /에 Q 죄 / ms / 5bf1d8d9 음 16d83951
htps : // m / da rb / ms / 669 2 2 5 57 f1 90
htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 5 % B7 % 1 % 5 % 9B % 9 % 5 % 86 % 97 % 9 % 95 % B7 % 6 % 4 % 9C % 6 % 9F % b
htps : // / ゔょ g. 그렇게 r세후레. 이오/crc-타타구에/1-15. htm#crc. 또는 tbi ts. 15
Reference
이 문제에 관하여(CRC-15-CAN을 계산하는 프로그램을 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bigben/items/88c0afb77135d686f73a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)