- 비트 뱅잉이란?
- Bit Banging을 사용하는 경우
- Bit Banging을 통한 직렬 통신 알고리즘
- SPI를 통한 비트 뱅잉
- Bit Banging의 예 : Arduino의 SPI 통신
- Bit Banging의 단점
- Arduino에서 Bit banging을 통한 UART
통신 인터페이스는 프로젝트에 사용할 마이크로 컨트롤러를 선택할 때 고려되는 요소 중 하나입니다. 설계자는 선택한 마이크로 컨트롤러가 제품에 사용되는 다른 모든 구성 요소와 통신하는 데 필요한 모든 인터페이스를 갖도록합니다. 마이크로 컨트롤러에 SPI 및 I2C와 같은 인터페이스 중 일부가 존재하면 이러한 마이크로 컨트롤러의 비용이 항상 증가하고 BOM 예산에 따라 원하는 마이크로 컨트롤러를 저렴하게 만들 수 없습니다. 이러한 상황에서는 Bit Banging 과 같은 기술이 적용 됩니다.
비트 뱅잉이란?
비트 뱅킹은 전체 통신 프로세스가 전용 하드웨어가 아닌 소프트웨어를 통해 처리되는 직렬 통신 기술입니다. 데이터를 전송하기 위해이 기술은 데이터를 대상 장치로 데이터를 전송하는 Tx 핀 역할을하는 마이크로 컨트롤러의 I / O 핀 상태를 조작하는 데 사용되는 신호 및 펄스로 데이터를 인코딩하는 소프트웨어를 사용합니다. 데이터를 수신하기 위해이 기술은 통신 전송 속도에 의해 결정되는 특정 간격 후에 Rx 핀의 상태를 샘플링하는 것을 포함합니다. 소프트웨어는 동기화, 타이밍, 레벨 등을 포함하여이 통신을 달성하는 데 필요한 모든 매개 변수를 설정하며, 이는 일반적으로 비트 뱅잉이 사용되지 않을 때 전용 하드웨어에 의해 결정됩니다.
Bit Banging을 사용하는 경우
Bit-Banging은 일반적으로 필요한 인터페이스가있는 마이크로 컨트롤러를 사용할 수 없거나 필요한 인터페이스가있는 마이크로 컨트롤러로 전환하는 것이 너무 비쌀 수있는 상황에서 사용됩니다. 따라서 동일한 장치가 여러 프로토콜을 사용하여 통신 할 수있는 저렴한 방법을 제공합니다. 이전에 UART 통신 만 가능했던 마이크로 컨트롤러는 비트 뱅킹을 통해 SPI 및 12C를 사용하여 통신하도록 장착 할 수 있습니다.
Bit Banging을 통한 직렬 통신 알고리즘
비트 뱅킹을 구현하는 코드는 다양한 마이크로 컨트롤러에 따라 다를 수 있으며 직렬 프로토콜에 따라 다를 수도 있지만 비트 뱅잉을 구현하는 절차 / 알고리즘은 모든 플랫폼에서 동일합니다.
예를 들어 데이터를 보내기 위해 아래 의사 코드가 사용됩니다.
- 스타트
- 시작 비트 보내기
- 수신기의 전송 속도와 일치하는 타이밍을 기다립니다.
- 데이터 비트 보내기
- 수신기의 전송 속도와 일치하는 시간을 다시 기다립니다.
- 모든 데이터 비트가 전송되었는지 확인하십시오. 아니라면 4로 이동하십시오. 그렇다면 7로 이동하십시오.
- 정지 비트 보내기
- 중지
데이터 수신 은 좀 더 복잡한 경향이 있으며, 일반적으로 수신 핀에서 데이터를 사용할 수 있는지 결정하는 데 인터럽트가 사용됩니다. 이는 마이크로 컨트롤러가 너무 많은 처리 능력을 낭비하지 않도록하는 데 도움이됩니다. 특정 구현에서는 마이크로 컨트롤러 I / O 핀을 사용하지만 처리되지 않을 경우 노이즈와 오류의 가능성이 더 높습니다. 인터럽트를 사용하여 데이터를 수신하는 알고리즘은 아래에 설명되어 있습니다.
- 스타트
- Rx 핀에서 인터럽트 활성화
- 인터럽트가 트리거되면 시작 비트 획득
- 전송 속도에 따라 타이밍을 기다립니다.
- Rx 핀 읽기
- 모든 데이터가 수신 될 때까지 4부터 반복
- 전송 속도에 따라 타이밍을 기다립니다.
- 정지 비트 확인
- 중지
SPI를 통한 비트 뱅잉
위에서 언급했듯이 다른 프로토콜에 대한 비트 뱅킹은 다르게 작동하므로 구현을 시도하기 전에 데이터 프레이밍 및 클럭킹을 이해하기 위해 각 프로토콜에 대해 읽는 것이 중요합니다. 예를 들어 SPI 모드 1 을 사용하면 클럭의 기본 값은 항상 0이고 데이터는 항상 클럭의 상승 에지에서 전송 또는 수신됩니다. SPI 모드 1 통신 프로토콜의 타이밍 다이어그램은 아래와 같습니다.
이를 구현하기 위해 다음 알고리즘을 사용할 수 있습니다.
- 스타트
- 통신을 시작하려면 SS 핀을 낮게 설정하십시오.
- Master Out Slave In (MOSI)에 대한 핀을 전송할 데이터의 첫 번째 비트로 설정합니다.
- 클럭 핀 (SCK)을 높게 설정하여 데이터가 마스터에서 전송되고 슬레이브에서 수신되도록합니다.
- MISO (Master in Slave Out) 상태를 읽고 슬레이브에서 데이터의 첫 번째 비트를 수신합니다.
- SCK를 낮게 설정하여 다음 상승 에지에서 데이터를 보낼 수 있습니다.
- 모든 데이터 비트가 전송 될 때까지 2로 이동합니다.
- 전송을 중지하려면 SS 핀을 High로 설정하십시오.
- 중지
Bit Banging의 예: Arduino의 SPI 통신
예를 들어 Arduino에서 비트 뱅킹을 통한 SPI 통신 알고리즘을 구현하여 아래 코드를 사용하여 SPI를 통해 데이터 를 비트 뱅킹 하는 방법을 보여 드리겠습니다.
사용할 Arduino의 핀을 선언하는 것으로 시작합니다.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; 바이트 sendData = 64; // 전송할 값 byte slaveData = 0; // 슬레이브가 보낸 값 저장
다음으로, 핀의 상태가 선언 되는 void setup () 함수로 이동합니다. MISO (Master in Slave out) 핀만 데이터를 수신하는 유일한 핀이므로 입력으로 선언됩니다. 다른 모든 핀은 출력으로 선언됩니다. 핀 모드를 선언 한 후 SS 핀은 HIGH로 설정됩니다. 그 이유는 프로세스에 오류가없고 통신이 낮음으로 설정된 경우에만 시작되도록하기 위함입니다.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
다음으로 루프 를 시작하여 데이터를 보냅니다 . 이 루프는 데이터를 반복적으로 전송합니다.
SS 핀을 로우로 작성하여 통신 을 시작하고 사전 정의 된 데이터를 비트로 나누고 전송 하는 bitbangdata 함수를 호출 하여 루프 를 시작합니다. 이 작업이 완료되면 SS 핀 HIGH를 작성하여 데이터 전송의 끝을 나타냅니다.
void loop () { digitalWrite (SSPin, LOW); // SS 낮음 slaveData = bitBangData (sendData); // 데이터 전송 digitalWrite (SSPin, HIGH); // SS 하이 다시 }
bitbangdata () 함수는 아래에 기록된다. 이 함수는 전송할 데이터를 가져 와서 비트로 나누고 알고리즘의 7 단계에 표시된대로 전송 코드를 반복하여 전송합니다.
byte bitBangData (byte _send) //이 함수는 비트 뱅킹을 통해 데이터를 전송합니다. { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 비트 한 바이트 { digitalWrite (MOSIPin, bitRead (_send, i)); // MOSI 설정 digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // MISO 캡처 digitalWrite (SCKPin, LOW); // SCK 낮음 } return _receive; // 수신 된 데이터 반환 }
Bit Banging의 단점
그러나 비트 뱅잉을 채택하는 것은 특정 솔루션에서 구현하기에 신뢰할 수없는 비트 뱅잉에 대한 몇 가지 단점이 있기 때문에 신중한 결정이어야합니다. 비트 뱅잉은 프로세스에서 소비되는 높은 처리 전력으로 인해 마이크로 컨트롤러가 소비하는 전력을 증가시킵니다. 전용 하드웨어에 비해 글리치 및 지터와 같은 더 많은 통신 오류는 특히 다른 작업과 동시에 마이크로 컨트롤러가 데이터 통신을 수행 할 때 비트 뱅잉을 사용할 때 발생합니다. 비트 뱅킹을 통한 통신은 전용 하드웨어를 사용할 때 발생하는 속도의 일부로 발생합니다. 이것은 특정 응용 프로그램에서 중요 할 수 있으며 비트 뱅잉을 "그다지 좋지 않은"선택으로 만들 수 있습니다.
비트 뱅잉은 다음을 포함한 모든 종류의 직렬 통신에 사용됩니다. RS-232, 비동기 직렬 통신, UART, SPI 및 I2C.
Arduino에서 Bit banging을 통한 UART
비트 뱅킹의 인기있는 구현 중 하나는 Arduino가 전용 하드웨어 UART 핀 (D0 및 D1)을 사용하지 않고도 UART를 통해 통신 할 수 있도록하는 Arduino 소프트웨어 직렬 라이브러리입니다. 이것은 사용자가 Arduino 보드의 핀 수가 지원할 수있는만큼 많은 직렬 장치를 연결할 수 있기 때문에 많은 유연성을 제공합니다.