소프트웨어에서 CAN 프로토콜 계층 구현


12

배경

겸손한 마이크로 컨트롤러 사양이 필요한 프로젝트를 개발 중입니다.

  • 12 비트, 10kHz ADC 8 개
  • RAM 1kB
  • 48-QFN 이하의 풋 프린트
  • 20kbps 데이지 체인 가능 잡음 방지 및 오류 수정 통신 프로토콜

신호 처리 요구 사항은 상당히 낮으며 대부분 시스템의 마스터 프로세서로 내보낼 수 있습니다. 처음 세 가지 사양은 쉽게 충족 할 수 있으며 수량이 $ 2 미만인 경우에도 가능합니다. 그러나 매우 전기적으로 시끄러운 환경에서 통신이 이루어 지므로 LIN 및 I2C와 같은 잡음이 취약한 네트워크가 작동하지 않습니다. LIN에 대한 또 다른 주장은 전체를 5V 또는 3.3V로 실행하고 LIN 트랜시버에 12V가 필요하므로 센서 보드 당 추가 조정기 또는 와이어가 필요하다는 것입니다. 처음에는이 작업에 CAN을 선택했습니다. 그러나 CAN 컨트롤러는 상당한 비용을 발생 시키며, 이것이 소프트웨어로 이루어질 수 있는지 궁금합니다.

CAN 물리 계층

CAN 사양은 OSI 네트워크 참조 모델의 데이터 링크 및 물리 계층을 정의합니다. 물리 계층을 구현하기 위해 NXP TJA1040 / 50 , Maxim MAX3058 / 59 , Microchip MCP2551TI SN65HVD1050 과 같은 저렴한 8 핀 IC가 많이 있습니다. D / A 컨버터 또는 연산 증폭기로 물리 계층을 구현하는 것은 불가능하지는 않지만 어려울 것이므로 이러한 IC의 가격은 1 달러 정도입니다.

CAN 데이터 링크 / 프로토콜 레이어

데이터 링크 계층의 경우 일부 마이크로 컨트롤러는 기본 UART, I2C 및 SPI 통신 계층에 CAN 프로토콜 모듈을 추가합니다. 그러나 이것들은 기본 칩보다 훨씬 비쌉니다.

CAN 프로토콜 모듈의 비용 조사

이 주장을 뒷받침하기 위해 다음은 CAN 및 비 CAN 버전에서 널리 사용되는 몇 가지 마이크로입니다.

  • ATmega16-ATMEGA16M1 (CAN 포함) : $ 3.87, ATMEGA168A (CAN 없음) : $ 3.23
  • dsPIC-DSPIC33FJ64MC802 (CAN 포함) : $ 6.14, DSPIC33FJ64GP202 (CAN 없음) : $ 5.48
  • PIC18-PIC18F2480 (CAN 포함) : $ 6.80, PIC18F24J10 (CAN 제외) : $ 2.10
  • Cortex-M3-STM32F103C4T6A (CAN 포함) : $ 6.50, STM32F100C4T6B (CAN 없음) : $ 2.73

공평하게, 나는 동등한 메모리 크기를 가진 마이크로 컨트롤러만을 비교했지만, 비 CAN 버전의 대부분은 더 작은 메모리 크기로 더 적은 크기로 제공됩니다. Microchip MCP2515 와 같은 외부 CAN 컨트롤러 는 거의 $ 2이므로 옵션이있는 경우 CAN을 마이크로 컨트롤러에 통합하는 것이 훨씬 비용 효율적입니다.

흥미롭게도, ATmega 부품은 Digikey의 재고에서 가장 저렴한 CAN 장착 부품입니다.

CAN 프로토콜 계층의 기능

dsPIC 마이크로 컨트롤러에있는 CAN 모듈은 다음을 수행합니다.

CAN 버스 모듈은 프로토콜 엔진과 메시지 버퍼링 / 제어로 구성됩니다. CAN 프로토콜 엔진은 CAN 버스에서 메시지를 송수신하기위한 모든 기능을 처리합니다. 먼저 적절한 데이터 레지스터를로드하여 메시지를 전송합니다. 적절한 레지스터를 읽으면 상태와 오류를 확인할 수 있습니다. CAN 버스에서 감지 된 메시지는 오류가 있는지 검사 한 다음 필터와 비교하여 수신 레지스터 중 하나에서 수신 및 저장해야하는지 확인합니다.

이것은 소프트웨어에서 상당히 가능해 보입니다.

질문

소프트웨어 프로토콜 계층을 사용하여 저렴한 UART가 장착 된 마이크로 컨트롤러와 CAN 트랜시버만으로 CAN 사양을 구현할 수 있습니까? 그렇다면 오픈 소스 구현이 있습니까?

또는 UART와 함께 트랜시버를 사용하여 맞춤형 프로토콜을 구현할 수 있습니까? 단일 마스터 토폴로지로는 괜찮습니다. 맞춤 프로토콜에서 중재를 제대로 수행하기가 어렵다는 것을 알고 있습니다.


CAN은 자동차 용으로 개발되었으므로 12v입니다.
kenny

@ 케니-위의 트랜시버에서 사용되는 전압 레벨은 5V입니다.
케빈 베르메르

STM32F 시리즈를 고려할 경우이 NXP 부품을 제안해도됩니까? Cortex-M0 코어입니다. search.digikey.com/scripts/DkSearch/…
Jon L

@Jon-반드시 고려할 필요는 없었으며 M0이이 사용 사례에 이상적 일 것입니다. 그러나 Nuvoton M052LAN 도 Cortex-M0이며 수량의 대략 절반 ($ 1.21 대 $ 2.35) 인 부품을 고려하십시오. CAN 모듈이 없습니다. 그런 종류의 가격 차이는 저의 동기입니다.
케빈 베르메르

운영 등급도 고려할 수 있습니다. CAN을 지원하는 대부분의 부품은 CAN이 아닌 변형에 대해 산업용 또는 자동차 용입니다.
Mark

답변:


11

펌웨어에서만 CAN 프로토콜을 구현하는 것이 어려울 수 있으며 올바르게 이해하는 데 시간이 걸릴 것이라고 생각합니다. 좋은 생각이 아닙니다.

그러나 가격이 높습니다. 방금 확인한 결과 QFN 패키지의 dsPIC 33FJ64GP802는 마이크로 칩 다이렉트로 1000 개당 3.68 USD에 판매됩니다. 실제 생산량의 경우 가격이 낮아집니다.

하드웨어 CAN 주변기기는 실제 작업을 수행하며 가격 인상은 귀하가 주장하는 것과 거의 거리가 없습니다.

추가 :

펌웨어 경로를 사용하기로 결정한 것으로 보이므로 여기에 눈에 띄는 몇 가지 명백한 문제가 있습니다. 나에게 아직 발생하지 않은 다른 문제가있을 수 있습니다.

20kbit / s에서 CAN을 수행하려고합니다. CAN의 속도는 매우 느리며, 최소 10 미터 동안 1Mbit / s까지 올라갑니다. 하나의 데이터 포인트를 제공하기 위해 NMEA 2000 선상 신호 표준은 CAN에서 200kbits / s로 계층화되어 있으며 이는 대형 선박의 한쪽 끝에서 다른 쪽 끝으로 이동하기위한 것입니다.

필요한 것은 비트 당 하나의 인터럽트라고 생각할 수 있으며 해당 인터럽트에서 필요한 모든 것을 할 수 있습니다. 각 CAN 비트 시간에 여러 가지 일이 있기 때문에 작동하지 않습니다. 서브 비트 레벨에서 특히 두 가지를 수행해야합니다. 첫 번째는 충돌을 감지하고 두 번째는 비트 전송률을 즉석에서 조정합니다.

CAN 버스에는 열성 및 우세의 두 가지 신호 상태가 있습니다. 열성이란 버스를 운전할 때 아무것도 발생하지 않습니다. 두 라인 모두 총 60Ω으로 연결됩니다. MCP2551과 같은 공통 칩으로 구현 된 일반 CAN 버스는 양쪽 끝에 120Ω 터미네이터가 있어야하므로 총 60Ω이 두 개의 차동 라인을 수동적으로 끌어 당깁니다. 지배적 인 상태는 내가 올바르게 기억한다면 두 줄이 열성 상태에서 약 900mV 떨어진 곳에서 적극적으로 당겨지는 경우입니다. 기본적으로 이것은 차동 쌍으로 구현된다는 점을 제외하고는 오픈 콜렉터 버스와 같습니다. CANH-CANL <900mV 인 경우 버스는 열성 상태이고 CANH-CANL> 900mV 인 경우 지배적입니다. 지배적 상태 신호 0 및 열성 1.

노드가 1을 버스에 "쓰기"할 때마다 (다른 노드가 0을 쓰고 있는지 확인합니다.) 버스가 우성 상태 (0)에있을 때 현재 전송중인 비트는 1이며, 다른 사람도 전송 중임을 의미합니다. 충돌은 두 발신자가 동의하지 않는 경우에만 중요하며, 열성 상태를 보내는 사람이 메시지를 취소하고 중단하는 것이 규칙입니다. 지배적 인 상태를 보내는 노드는 이것이 일어난 것을조차 알지 못합니다. 이것이 CAN 버스에서 중재가 작동하는 방식입니다.

CAN 버스 중재 규칙은 다른 사람이 0을 보내지 않도록하기 위해 1로 보내는 모든 비트를 통해 버스를 도중에 지켜야한다는 것을 의미합니다.이 점검은 일반적으로 비트로가는 길의 약 2/3 정도입니다. CAN 버스 길이에 대한 기본 제한 사항입니다. 비트 전송률이 느릴수록 버스의 한쪽 끝에서 다른 쪽 끝으로 최악의 경우 전파되는 시간이 길어 지므로 버스가 더 길어질 수 있습니다. 이 점검은 버스를 소유하고 있고 1 비트를 보내는 것으로 생각되는 모든 비트 에서 수행해야합니다 .

또 다른 문제는 비트 전송률 조정입니다. 버스의 모든 노드는 RS-232보다 비트 레이트에 동의해야합니다. 작은 클럭 차이가 중대한 오류로 누적되는 것을 방지하려면 각 노드는 공칭보다 약간 길거나 짧은 비트를 수행 할 수 있어야합니다. 하드웨어에서 이는 비트 전송률보다 약 9 배에서 20 배 정도 빠른 클럭을 실행하여 구현됩니다. 이 빠른 클럭의주기를 타임 퀀 타라고합니다. 새로운 비트의 시작이 당신이 생각하는 위치와 관련하여 방황하고 있음을 감지하는 방법이 있습니다. 그런 다음 하드웨어 구현은 한 번에 한 번 퀀텀을 추가하거나 건너 뛰어 다시 동기화합니다. 예상 비트 시간과 실제 측정 된 비트 시간 사이의 작은 위상차를 조정할 수있는 한이를 구현할 수있는 다른 방법이 있습니다.

어느 쪽이든, 이러한 메커니즘은 다양한 시간에 여러 가지 일이 필요합니다. 이러한 종류의 타이밍은 펌웨어에서 매우 까다로워 지거나 버스가 매우 느리게 실행되어야합니다. 20kbits / s의 펌웨어로 타임 퀀타 시스템을 구현한다고 가정 해 봅시다. 비트 당 최소 9 시간의 퀀텀은 180kHz 인터럽트가 필요합니다. 그것은 dsPIC 33F와 같은 것으로 가능하지만 프로세서의 상당 부분을 차지할 것입니다. 40MHz의 최대 명령 속도에서 인터럽트 당 222 개의 명령 사이클을 얻습니다. 모든 검사를 수행하는 데 오랜 시간이 걸리지 않지만 아마도 50-100주기, 즉 프로세서의 25-50 %가 CAN에 사용되고 실행중인 다른 모든 것을 선점해야한다는 것을 의미합니다. 따라서 이러한 프로세서가 자주 실행하는 많은 응용 프로그램을 막을 수 있습니다. 스위칭 전원 공급 장치 또는 모터 드라이버의 펄스 제어에 의한 펄스와 같은. 다른 모든 인터럽트에서 50-100 사이클 대기 시간은 이와 같은 칩으로 수행 한 많은 작업의 완벽한 쇼 스토퍼가 될 것입니다.

그래서 당신은 어떻게 든 할 수있는 돈을 쓸 것입니다. 전용 하드웨어 주변 장치에없는 경우에는 더 큰 프로세서로 인해 상당한 펌웨어 오버 헤드를 처리 한 다음 다른 모든 것에 대해 예측할 수없고 가능한 큰 인터럽트 대기 시간을 처리해야합니다.

그런 다음 선행 엔지니어링이 있습니다. CAN 주변 장치가 작동합니다. 귀하의 의견에 따르면이 주변 장치의 증분 비용은 $ .56입니다. 그것은 나에게 거래처럼 보인다. 대량의 제품을 구입하지 않은 경우 펌웨어로만 CAN을 구현하는 데 걸리는 시간과 비용을 크게 줄일 수있는 방법이 없습니다. 당신의 볼륨이 너무 높으면, 우리가 언급 한 가격은 어쨌든 현실적이지 않으며 CAN 하드웨어를 추가하는 차이는 더 낮아질 것입니다.

나는 이것이 실제로 이해가되지 않습니다.


나는 당신의 의견을 소중하게 생각하지만 아무도 어려움을 해결하려고 시도하지 않은 이유에 대해 궁금합니다. 모든 프로젝트에는 그러한 문제가 있습니다! 내가 시도하면 어떻게되는지 알려 드리겠습니다.
케빈 베르메르

1000의 수량으로, microchipdirect에서 dsPIC33FJ64GP202에 대해 $ 3.12의 가격을 발견했습니다-총 가치 차이는 $ 560입니다! 시도해 볼만한 가치가 있습니다. 릴, 표준 패키지 수량 등에 대해 걱정할 필요없이 개별 제품의 수를 쉽게 얻을 수 있었기 때문에 각 제품마다 가격을 인용했습니다.
Kevin Vermeer

2
@ 케빈, 낮은 수량 가격이 항상 높은 수량 가격에 비례하지는 않습니다. 이 중 몇 개를 만들 계획인지는 모르겠지만, 560 달러는 펌웨어에서 CAN을 수행하는 엔지니어링 비용을 지불하지 않습니다. 나는 당신이 겪게 될 몇 가지 어려움에 대해 Explainig에 대답 할 것입니다.
Olin Lathrop

WTF !? 방금 답변에 몇 가지 내용을 추가했으며 단락 나누기의 대부분이 사라졌습니다. 난에 입력 된 편집 창에서 빈 줄은 분명히 있었다.
올린의 Lathrop

1
대답은 그렇습니다. 그러나 나는 Olin에 전적으로 동의합니다. 나는 실제로이 분야에서 풀 타임으로 일합니다. dsPIC33FJ256 칩을 사용합니다. 비트 뱅 접근 방식으로 글을 쓰는 데 소요되는 시간은 하드웨어가 당신을 위해 그것을하고 당신이 바퀴를 재발 명하는 비용 이점을 제거합니다. 말할 것도없이 하드웨어에서 수행하는 작업은 무엇보다도 신중하게 계획해야합니다. 또한 ISO14229 또는 OSEK / Autosar NetworkManagement 요구 사항과 같은 다른 고급 프로토콜을보고 있는지 궁금합니다.
Eric M

2

우리는 PIC18F25K80을 사용합니다 . DSP가 없지만 수량은 ~ $ 2입니다. 언급 한 PIC18F2480을 거의 직접 대체합니다. 우리는 CCS 컴파일러와 Microchip에서 이식 된 CAN 용 소프트웨어 스택을 사용합니다 . 그것은 내가 필요로하고 시도한 모든 것에 잘 작동합니다.


ECAN을 검색하지 않았습니다. Silly Microchip이라는 이름이지만 다음에 더 자세히 읽어야합니다! 내가 말했듯이, 신호 처리 요구가 낮기 때문에 실제 DSP가 필요하지 않다고 생각합니다.
Kevin Vermeer

2

이 글을 읽고 있다면 UART와 일부 영리한 펌웨어 만 사용하여 CAN 기능을 비트 bash하려는 것 같습니다. 나를 믿어 라, 이것은 효과가 없을 것이다-나는 CAN이나 CANopen의 복잡한 것들에 대한 좋은 글을 읽는 것이 좋습니다. 이 경로를 내려 가면 원하는 비용 절감 효과를 없앨 수 있습니다.

CAN 모듈과 함께 마이크로 컨트롤러를 사용하고 추가로 $ 2를 전달하거나 RS-485를 통한 Modbus 와 같은 UART와 호환되는 다른 프로토콜에 대해 생각 했습니까?


당신은 그것을 올바르게 읽고 있습니다. CAN에 대한 벡터 교육 책자를 철저히 읽었습니다. 모든 메시지에는 CRC에 대한 전처리가 필요한 것처럼 보이지만 나머지 패킷은 동일해야하며 수신 라인을 계속 확인하여 충돌이 있는지 확인해야합니다. 사람들이 생각하는 것만 큼 어렵지는 않지만, 나는 당신의 조언을 확실히 고려할 것입니다.
케빈 베르메르

RS485 아이디어를 통한 Modbus를 좋아합니다. 이러한 트랜시버의 대부분은 5V 공급 장치 인 것으로 보입니다. RS232와 같은 +/- 입력 전압이 필요하다는 인상을 받았습니다. 그것을 조사해야 할 것입니다.
Kevin Vermeer

비트 뱅킹은 확실히 작동합니다! 위에서 Olin이 언급 한 것처럼 사소한 것은 아니지만 수행 할 수 있습니다. 나는 개인적으로 PIC18F 시리즈와 dsPIC33 시리즈 마이크로 모두에서 그것을 뽑았다. 정말로보고 싶다면 PIC18F 소스를 업로드 할 수 있습니다. 그러나 dsPIC 소스는 내가 상업적인 프로젝트의 일환으로 제공 할 수 없습니다. 두 경우 모두 MCP2551을 사용하며 LIN 코드도 있습니다. LIN은 프로토콜 계층에서 조금 더 단순하지만 LIN 스케줄을 구현하는 것은 조금 더 어렵다 ...
Eric M

1
@EricM-비트 전송률은 얼마였으며 소프트웨어에서 전체 CAN 사양을 구현할 수 있었습니까? 나는 것이 사랑 이의 PIC18F 코드를 볼 수 있습니다.
Rocketmagnet

예, 많은 측면을 처리하는 dsPIC에서 ECAN 모듈을 복제하지 않도록 전체 CAN 사양을 구현했습니다. PIC18 구현에서 버스를 전체 사양 이상으로 비트 뱅킹했으며이 코드는 GPIO 라인을 사용하는 dsPIC에서 작동합니다. 코드에 대한 링크로 며칠 안에 업데이트하겠습니다.
Eric M

0

또한 PIC µC에서 비트 뱅킹 CAN 프로토콜에 대해 생각하고 있습니다. EricM을 부탁드립니다. 실제로 그렇게했다면 적어도 PIC18F 또는 DSPic의 코어 주파수에서 어떤 비트 전송률을 답장하고 알려주십시오. 고마워!

일반적으로 : RS 485는 주요 질문에 대한 솔루션이지만, 전이중 UART 통신이 아닌 CAN- (또는 FlexRay)-트랜시버를 모든 프로토콜로 사용할 수도 있습니다. NRZ 코딩을 사용하십시오.

그러나 UART / V24 / RS232에서 전이중은 대부분 세부적으로 생각하지 않고 사용되므로 응용 프로그램의 수퍼 루프 또는 상태 시스템에 약간의 두뇌를 두어야 할 수도 있습니다 ...

그러나 CAN- 비트 뱅킹으로 돌아 가기 : 나는 수년간 CAN과 함께 일 해왔고 비트 뱅킹 구현을 본 적이 없지만, 생각할 수있는 한, DSPic 또는 ARM 등과 같은 최신 µC를 사용하여 tp 100kBit의 비트 타이밍을 위해 작동해야합니다. (80MHz 이상의 코어 사용)

적어도 읽기만 고려된다면 ... 전송은 비트 구조를 준비 할 때 약간의 오버 헤드를 의미하므로 100 % 버스로드에 도달 할 수 없지만 CAN에서는 65 % 이상이 드물게 나타납니다.


2
전기 공학 StackExchange에 오신 것을 환영합니다. 답변의 첫 부분은 실제로 답변이 아니므로 원하는 것이 있으면 새로운 질문을합니다. OP는 CAN 프로토콜의 소프트웨어 구현에 대해 구체적으로 물었고 귀하의 답변은 그 질문을 다루지 않고 돌아 다니는 것처럼 보입니다. 질문의 주제를 유지하십시오.
조 Hass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.