CAN 버스가 어렵습니까? CAN 버스를 이해하는 것은 불가능합니다!

CAN (Controller Area Network)은 분산 실시간 제어를 실현할 수있는 직렬 통신 네트워크 인 컨트롤러 영역 네트워크입니다.

CAN을 생각할 때, CAN은이 회사 (및 Intel)에서 개발 한 독일 회사 인 Bosch를 생각해야합니다 .CAN에는 널리 사용되는 많은 우수한 기능이 있습니다. 예 : 전송 속도는 최대 1Mbps, 통신 거리는 최대 10km, 무손실 비트 중재 메커니즘, 다중 마스터 구조입니다.

최근 몇 년 동안 CAN 컨트롤러 가격은 점점 낮아지고 있으며 많은 MCU에도 CAN 컨트롤러가 통합되어 있습니다. 이제 모든 차량에는 CAN 버스가 장착되어 있습니다.

일반적인 CAN 애플리케이션 시나리오 :

CAN 버스 표준

CAN 버스 표준은 물리 계층과 데이터 링크 계층 만 지정하며 사용자 정의 애플리케이션 계층이 필요합니다. 다른 CAN 표준은 물리 계층에서만 다릅니다.

CAN 트랜시버는 로직 레벨과 물리적 신호 간의 변환을 담당합니다.

논리적 신호를 물리적 신호 (차동 레벨)로 변환하거나 물리적 신호를 논리적 레벨로 변환합니다.

서로 다른 차동 레벨 특성을 갖는 두 가지 CAN 표준, 즉 IOS11898 및 IOS11519가 있습니다.

높고 낮은 레벨 진폭은 낮고 해당 전송 속도는 빠릅니다.

* 트위스트 페어 공통 모드는 레벨이 동시에 변경되고 전압 차이가 변하지 않기 때문에 간섭을 제거합니다.

물리적 계층

CAN에는 3 개의 인터페이스 장치가 있습니다.

여러 노드가 연결되면 그중 하나가 로우이면 버스는 로우이고 모든 노드가 하이로 출력 될 때만 하이입니다. 소위 "라인 및".

CAN 버스에 5 개의 연속적인 동일한 비트가 있으면 반대 비트를 삽입하여 동기화를위한 전환 에지를 생성합니다. 따라서 누적 된 오류를 제거합니다.

485 및 232와 마찬가지로 CAN의 전송 속도는 거리에 반비례합니다.

CAN 버스, 단자 저항 연결 :

무한 전송 라인을 시뮬레이션하기 위해 케이블의 특성 임피던스가 120Ω이기 때문에 왜 120Ω입니까?

데이터 링크 계층

CAN 버스 전송은 CAN 프레임이며 CAN 통신 프레임은 데이터 프레임, 원격 프레임, 오류 프레임, 과부하 프레임 및 프레임 간격의 5 가지 종류로 나뉩니다.

데이터 프레임은 노드간에 데이터를 송수신하는 데 사용되며 가장 많이 사용되는 프레임 유형입니다. 원격 프레임은 수신 노드에서 송신 노드로 데이터를 수신하는 데 사용됩니다. 오류 프레임은 노드가 데이터를 찾을 때 다른 노드에 알리는 데 사용되는 프레임입니다. 프레임 오류, 과부하 프레임은 수신 노드가 수신 기능을 송신 노드에 알리기 위해 사용하는 프레임, 데이터 프레임과 원격 프레임을 이전 프레임에서 분리하는 데 사용되는 프레임입니다.

데이터 프레임은 중재 구간의 길이에 따라 표준 프레임 (2.0A)과 확장 프레임 (2.0B)으로 구분됩니다.

프레임 시작


프레임 시작은 우성 비트 (낮은 수준)로 구성되고, 송신 노드는 프레임 시작을 보내고 다른 노드는 프레임 시작과 동기화됩니다.

프레임의 끝은 7 개의 보이지 않는 비트 (높은 수준)로 구성됩니다.

중재 섹션

CAN 버스는 다 지점 경쟁 문제를 어떻게 해결합니까?

답변은 중재 섹션에서 제공됩니다.

CAN 버스 컨트롤러는 데이터를 전송하는 동안 버스 레벨을 모니터링하며 레벨이 다른 경우 전송을 중지하고 다른 처리를 수행합니다. 비트가 중재 섹션에 있으면 버스 경쟁을 종료하고 다른 섹션에 있으면 오류 이벤트가 생성됩니다.

프레임 ID가 작을수록 우선 순위가 높습니다. 데이터 프레임의 RTR 비트가 지배적 수준이고 원격 프레임이 열성 수준에 있기 때문에 프레임 형식과 프레임 ID가 같으면 데이터 프레임이 원격 프레임보다 우선합니다. 표준 프레임이 지배적 수준에 있고 확장 프레임의 IDE 비트는 보이지 않으며 처음 11 비트에서 동일한 ID를 가진 표준 프레임 및 확장 프레임의 경우 표준 프레임의 우선 순위가 확장 프레임의 우선 순위보다 높습니다.

제어 섹션

총 6 비트가 있으며 표준 프레임의 제어부는 확장 프레임 플래그 비트 IDE, 예약 비트 r0, 데이터 길이 코드 DLC로 구성되며 확장 프레임 제어부는 IDE, r1, r0, DLC로 구성됩니다.

데이터 세그먼트

0-8 바이트, 짧은 프레임 구조, 우수한 실시간 성능, 자동차 및 산업 제어 분야에 적합;

CRC 단

CRC 검사 세그먼트는 15 비트 CRC 값과 CRC 구분 기호로 구성됩니다.

ACK 단

수신 노드가 수신 한 프레임의 시작부터 CRC 세그먼트까지 오류가 없으면 ACK 세그먼트에 우세한 레벨을 보내고, 보내는 노드는 열성 레벨을 보내며, 라인과 결과가 우세합니다. 수평.

원격 프레임

원격 프레임은 표준 프레임과 확장 프레임으로 나뉘는 6 개의 세그먼트로 나뉘며 RTR 비트는 1 (리세 시브 레벨)입니다.

CAN은 매우 신뢰할 수있는 버스이지만 5 개의 오류도 있습니다.

CRC 오류 :이 오류는 전송 및 수신 된 CRC 값이 다를 때 발생합니다.

형식 오류 : 프레임 형식이 잘못된 경우 오류가 발생합니다.

응답 오류 :이 오류는 송신 노드가 ACK 단계에서 응답 메시지를 수신하지 못할 때 발생합니다.

비트 전송 오류 : 전송 노드는 정보를 전송할 때 버스 레벨이 전송 레벨과 일치하지 않음을 발견하고이 오류가 발생합니다.

비트 스터핑 오류 :이 오류는 통신 케이블에서 통신 규칙을 위반 한 경우 발생합니다.

이 다섯 가지 오류 중 하나가 발생하면 송신 노드 또는 수신 노드가 오류 프레임을 보냅니다.

일부 노드가 다른 노드의 통신을 방해하여 항상 오류 프레임을 전송하는 것을 방지하기 위해 CAN 프로토콜은 노드의 3 가지 상태와 동작을 규정합니다.

과부하 프레임

노드가 수신 할 준비가되지 않은 경우 과부하 프레임을 보내 송신 노드에 알립니다.

프레임 간격

데이터 프레임, 원격 프레임 및 그 앞에있는 프레임을 분리하는 데 사용되며 오류 프레임 및 과부하 프레임 앞에 프레임 간격이 추가되지 않습니다.

CAN 노드 구축

해당 제어를 실현하기위한 노드를 구성하며, CAN 노드 회로, CAN 컨트롤러 드라이버, CAN 응용 계층 프로토콜, CAN 노드 응용 프로그램의 네 부분으로 나뉩니다.

서로 다른 노드에서 수행하는 기능은 다르지만 모두 동일한 하드웨어 및 소프트웨어 구조를 가지고 있습니다.

 

CAN 트랜시버와 컨트롤러는 CAN 메시지의 송수신을 완료하기 위해 각각 CAN의 물리 계층 및 데이터 링크 계층에 해당합니다. 기능 회로는 신호 수집 또는 제어 주변 장치와 같은 특정 기능을 완료합니다. 주 컨트롤러 및 애플리케이션 소프트웨어는 다음과 같습니다. 메시지 형식은 메시지를 구문 분석하고 해당 제어를 완료합니다.

CAN 하드웨어 드라이버는 메인 컨트롤러 (예 : P89V51)에서 실행되는 프로그램으로 주로 다음 작업을 완료합니다 : 레지스터 기반 작업, CAN 컨트롤러 초기화, CAN 메시지 전송 및 CAN 메시지 수신;

CAN 하드웨어 드라이버를 직접 사용하는 경우 컨트롤러 변경시 상위 응용 프로그램을 수정해야하므로 휴대 성이 떨어집니다. 애플리케이션 계층과 하드웨어 드라이브 계층에 가상 드라이브 계층을 추가하면 서로 다른 CAN 컨트롤러 간의 차이점을 보호 할 수 있습니다.

통신 기능을 완성하는 것 외에도 CAN 노드에는 특정 하드웨어 기능 회로가 포함되어 있습니다. 기능 회로는 하향 직접 제어 기능 회로를 구동하고 상향은 애플리케이션 계층에 대한 제어 기능 회로 기능 인터페이스를 제공합니다. 특정 기능에는 신호 수집, 인간-기계 디스플레이 등이 포함됩니다.

CAN 트랜시버는 CAN 버스에서 CAN 컨트롤러 로직 레벨과 차동 레벨의 교환을 실현하는 것입니다. CAN 트랜시버를 구현하기위한 두 가지 방식이 있습니다. 하나는 CAN 트랜시버 IC (전원 공급 장치 절연 및 전기 절연 추가 필요)를 사용하는 것이고 다른 하나는 CAN 절연 트랜시버 모듈을 사용하는 것입니다. 두 번째 유형이 권장됩니다.

CAN 컨트롤러는 CAN의 핵심 구성 요소로 CAN 프로토콜에서 데이터 링크 계층의 모든 기능을 구현하고 CAN 프로토콜의 분석을 자동으로 완료 할 수 있습니다. 일반적으로 두 가지 유형의 CAN 컨트롤러가 있습니다. 하나는 컨트롤러 IC (SJA1000)이고 다른 하나는 CAN 컨트롤러와 통합 된 MCU (LPC11C00)입니다.

MCU는 기능 회로 및 CAN 컨트롤러의 제어를 담당합니다. 노드가 시작되면 CAN 컨트롤러 매개 변수를 초기화하고 CAN 컨트롤러를 통해 CAN 프레임을 읽고 전송하며 CAN 컨트롤러가 중단되면 인터럽트 예외를 처리합니다. CAN 컨트롤러의; 수신 된 데이터에 따라 출력 제어 신호;

 

인터페이스 관리 로직 : MCU 명령어를 해석하고 CAN 컨트롤러에있는 각 기능 모듈의 레지스터 유닛을 주소 지정하며 인터럽트 정보 및 상태 정보를 메인 컨트롤러에 제공합니다.

송신 버퍼와 수신 버퍼는 CAN 버스 네트워크에 대한 완전한 정보를 저장할 수 있습니다.

수락 필터링은 저장된 확인 코드를 CAN 메시지 식별 코드와 비교하는 것이며 확인 코드와 일치하는 CAN 프레임 만 수신 버퍼에 저장됩니다.

CAN 코어는 데이터 링크의 모든 프로토콜을 구현합니다.

CAN 프로토콜 애플리케이션 계층 개요

CAN 버스는 신뢰할 수있는 전송 서비스 만 제공하므로 노드가 메시지를 수신 할 때 애플리케이션 계층 프로토콜을 사용하여 데이터를 보낸 사람과 데이터의 의미를 결정해야합니다. 일반적인 CAN 애플리케이션 계층 프로토콜은 CANOpen, DeviceNet, J1939, iCAN 등입니다.

CAN 애플리케이션 계층 프로토콜 드라이버는 메인 컨트롤러 (예 : P89V51)에서 실행되는 프로그램으로, 애플리케이션 계층 프로토콜에 따라 CAN 메시지를 정의하고 CAN 메시지의 분석 및 조립을 완료합니다. 예를 들어, 프레임 ID를 사용하여 노드 주소를 표시하고, 수신 된 프레임 ID가 자신의 노드 ID를 전달하지 않으면 직접 폐기하거나 처리를 위해 상위 계층으로 전달합니다. 수신 노드의 주소로 설정합니다.

CAN 트랜시버

SJA1000의 많은 출력 모드가 있으며 가장 많이 사용되는 것은 일반 출력 모드이며 입력 모드는 일반적으로 비교기 모드를 선택하지 않아 통신 거리를 늘리고 절전 모드에서 전류를 줄일 수 있습니다.

통신 속도에 따라 트랜시버는 고속 CAN 트랜시버와 내결함성 CAN 트랜시버로 구분됩니다.

동일한 네트워크에서 동일한 CAN 트랜시버를 사용해야합니다.

CAN 연결 라인에는 많은 간섭 신호가 있으며 하드웨어에 필터 및 간섭 방지 회로를 추가해야합니다.

 

CAN 절연 트랜시버 (통합 필터 및 간섭 방지 회로)도 사용할 수 있습니다.

CAN 컨트롤러와 MCU의 연결 모드


SJA1000은 외부 RAM으로 간주 할 수 있으며 주소 폭은 8 비트이며 최대 256 개의 레지스터를 지원합니다.

#define REG_BASE_ADDR 0xA000 // 寄存器基址
unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;

// 写SJA1000寄存器
void WriteSJAReg(unsigned char RegAddr, unsigned char Value) {
*(SJA_CS_Point + RegAddr) = Value;
return;
}

// 读SJA1000寄存器
unsigned char ReadSJAReg(unsigned char RegAddr) {
 return (*(SJA_CS_Point + RegAddr));
}

 

 

 

버퍼의 데이터를 레지스터에 연속적으로 쓰기

…… for (i=0;i<len;i++) { WriteSJAReg(RegAdr+i,ValueBuf[i]);  }……

연속적으로 여러 레지스터를 버퍼로 읽습니다.

……for (i=0;i<len;i++) {  ReadSJAReg(RegAdr+i,ValueBuf[i]);   }……

 

 

헤더 파일에는 다음 스키마가 포함됩니다.

  1. 각 프로그램에는 사용 된 헤더 파일이 포함되어 있습니다.

  2. 각 프로그램에는 다른 모든 헤더 파일을 포함하는 공통 헤더 파일이 있습니다.

#ifndef __CONFIG_H__ // 防止头文件被重复包含
#define __CONFIG_H__
#include <8051.h>         // 包含80C51寄存器定义头文件
#include "SJA1000REG.h"         // 包含SJA1000寄存器定义头文件

// 定义取字节运算
#define LOW_BYTE(x)  (unsigned char)(x)
#define HIGH_BYTE(x)  (unsigned char)((unsigned int)(x) >> 8)

// 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)
#define OSCCLK 11059200UL
// 宏定义MCU的时钟频率
#define CPUCLK (OSCCLK / 12)
#endif // __CONFIG_H__

SJA1000은 전원을 켠 후 재설정 상태에 있으며 작동하기 전에 초기화해야합니다.

(1) 모드 레지스터의 Bit0을 설정하여 리셋 모드로 들어갑니다.

(2) 클럭 주파수 분할 레지스터를 설정하여 클럭 주파수와 CAN 모드를 선택합니다.

(3) 수락 필터 설정, 확인 코드 및 보호 코드 설정;

(4) 버스 타이머 레지스터 0과 1을 설정하여 CAN 전송 속도를 설정합니다.

(5) 출력 모드를 설정합니다.

(6) 재설정 모드를 종료하려면 모드 레지스터의 Bit0을 지우십시오.

모드 레지스터


 

감지 전용 모드 : SJA1000은 CAN 프레임을 보낼 때 응답 비트를 확인하지 않습니다.

Listen-only 모드 :이 모드에서 SJA1000은 전송 속도 자동 감지를 위해 오류 프레임을 보내지 않습니다. SJA1000은 다른 전송 속도로 CAN 프레임을 수신합니다. CAN 프레임이 수신되면 현재 전송 속도와 버스 전송 속도가 동일 함을 나타냅니다.

전송 속도 설정

CAN 버스는 클럭이없고 비동기 직렬 전송을 사용하며 전송 속도는 1 초에 전송되는 데이터 비트입니다.

 

CAN 프레임 전송 :

CAN 프레임을 전송하는 단계 : 1. 상태 레지스터를 확인하고 전송 버퍼를 사용할 수있을 때까지 기다립니다.

2. 송신 버퍼에 메시지를 채우십시오.

3. 보내기를 시작합니다.

 

SJA1000에는 12 바이트 버퍼가 있으며 보낼 메시지는 레지스터 16-28을 통해 쓰거나 레지스터 96-108을 통해 쓰거나 읽을 수 있습니다.

 

 

 

전송 모드 설정

char SetSJASendCmd(unsigned char cmd) {
unsigned char ret;
switch (cmd) {
default:
case 0:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT); //正常发送
break;
case 1:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); //单次发送
break;
case 2:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);//自收自发
break;
case 0xff:
        ret = SetBitMask(REG_CAN_CMR, AT_BIT);//终止发送
break;
    }
return ret;
}

 보내기 기능

unsigned char SJA_CAN_Filter[8] = {    // 定义验收滤波器的参数,接收所有帧       
0x00, 0x00, 0x00, 0x00,                                                
// ACR0~ACR3       
0xff, 0xff, 0xff, 0xff                                                         
// AMR0~AMR3
};
unsigned char STD_SEND_BUFFER[11] = {   // CAN 发送报文缓冲区       
0x08,   // 帧信息,标准数据帧,数据长度 = 8       
0xEA, 0x60, // 帧ID = 0x753
0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa  // 帧数据
};
void main(void) // 主函数,程序入口{       
    timerInit();// 初始化
    D1 = 0;       
    SJA1000_RST = 1; // 硬件复位SJA1000       
    timerDelay(50); // 延时500ms       
    SJA1000_RST = 0;       
    SJA1000_Init(0x00, 0x14, SJA_CAN_Filter);   // 初始化SJA1000,设置波特率为1Mbps       
    // 无限循环,main()函数不允许返回      
    for(;;) {           
        SJASendData(STD_SEND_BUFFER, 0x0);           
        timerDelay(100);         // 延时1000ms      
    }    
}

프레임 ID가 0x753 인 이유는 버퍼에있는 CAN 프레임의 저장 형식과 관련이 있습니다.

 

 

종단 저항은 매우 중요하며 전송 속도가 높고 종단 저항이 추가되지 않으면 신호 오버 슈트가 매우 심각합니다.

 

SJA1000에는 64 바이트 수신 버퍼 (FIFO)가있어 MCU 요구 사항을 줄일 수 있습니다. MCU는 SJA1000이 질의 또는 중단으로 메시지를 수신 한 후 메시지를 읽었는지 확인할 수 있습니다.

1. 국산 대안은 무형인가? Zhaoyi Innovation Live Class로 돌아 오세요!

2. 오픈 소스 RISC-V가 중국의 "핵심 부족"에 대한 해결책이 될 수 있습니까?

3. Raspberry Pi Pico : 단 $ 4의 MCU

4. MCU가 AI 기능을 지원하는 데는 여러 가지 이유가 있습니다 ~

5. 2020 년에 제가 배운 20 가지 소프트웨어 공학 원리 ~

6. 임베디드 개발에서 상태 머신 아이디어의 적용 ~

면책 조항 :이 기사는 온라인으로 복제되며 저작권은 원저자에게 있습니다. 저작권 문제에 연루된 경우 당사에 문의하시면 귀하가 제공 한 저작권 인증 자료를 기반으로 저작권을 확인하고 저자의 보수를 지불하거나 콘텐츠를 삭제합니다.

추천

출처blog.csdn.net/DP29syM41zyGndVF/article/details/113749928