비트 뱅이 란?


26

저는 마이크로 컨트롤러 프로그래밍을 처음 사용합니다. ATmega32-A 컨트롤러와 CodeVisionAVR 컴파일러를 사용하고 있습니다. SPI 통신을 사용하여 사인파 신호를 생성하기 위해 파형 발생기 (AD9833)를 사용하고 있습니다. 사인파를 성공적으로 생성 할 수 있습니다. 이제 그 신호를 센서로 전달합니다. 센서 출력은 멀티플렉서를 통해 선택되어 ADC로 전송됩니다. 이제 SPI 통신을 사용하여 ADC 값을 읽고 싶습니다. ADC의 레지스터를 설정하기 위해 많은 노력을 기울였습니다. 여전히 작동하지 않습니다. SPI 통신 코드를 보려면 spi 통신을 사용하여 이전 포스트 ADC 레지스터 설정을 살펴보십시오 . USART (RS232) 통신을 사용하여 PC (PuTTY)에 값을 인쇄하고 있습니다.

누군가 나에게 비트 뱅킹을 사용하도록 조언했습니다. 나는 그 개념을 처음 사용합니다. 어느 누구도 SPI 통신의 비트 뱅잉 코드 예제를 제공 할 수 있습니까? 그 절차를 시작하는 방법? 어느 누구에게나 좋은 친구를 줄 수 있습니까? 외부 하드웨어가 필요합니까?

핀 연결을 포함하여 이것을 작성했습니다.

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}


비트 설정 및 지연 이전의 클럭 출력이 낮아야합니다. 타이밍을 수정하기 위해 몇 가지 지연이 필요합니다 (시계 저 / 고는 대략 같은 기간입니다) Steven의 코드를 다시 살펴보십시오. 읽기를 원하면 코드도 추가해야합니다.
Oli Glaser

@OliGlaser 레지스터를 설정하는 일반적인 SPI 코드 대신이 코드를 직접 사용할 수 있습니다.
verendra

@verendra- "정상 SPI 코드"의 의미를 잘 모르겠습니다. 하드웨어 SPI 대신에 ADC는 프로토콜 및 타이밍에 동의하는 한 펄스 생성 방법에 신경 쓰지 않습니다.
Oli Glaser

답변:


25

비트 뱅킹은 마이크로 컨트롤러 내부의 하드웨어에 의존하는 대신 소프트웨어에서 전체 펄스 시리즈를 생성합니다.

많은 마이크로 컨트롤러에는 하드웨어 SPI가 있으며, 그 결과 바이트를 출력 레지스터에 쓰면 SPI 컨트롤러가 데이터를 이동시키고 동시에 슬레이브로부터 데이터를 수신합니다. 전송이 완료되면 인터럽트를받은 다음 수신 된 데이터를 읽을 수 있습니다.

그러나 일부 마이크로 컨트롤러에는 SPI 하드웨어가 내장되어 있지 않으므로 모든 것을 수동으로 수행하여 시뮬레이션해야합니다. SPI에는 여러 가지 모드가 있으므로이 펄스 다이어그램을 예로 사용하겠습니다.

여기에 이미지 설명을 입력하십시오

따라서 전용 SPI 컨트롤러가 모든 펄스, 데이터 이동 및 타이밍을 처리하는 동안 비트 뱅킹시 모든 작업을 직접 수행해야합니다.

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

비트 뱅킹 SPI는 비교적 간단하며, 예를 들어 비트 뱅킹 I2C를위한 코드는 더 복잡하므로 UART 프로토콜을 비트 뱅킹하려면 타이머가 필요합니다.


2
샘플 C 코드를 제공 할 수 있습니까?
verendra

1
@verendra-의사 코드 예제를 추가했습니다.이 코드는 C로 쉽게 번역 할 수 있어야합니다.
stevenvh

SPI 통신을 사용하여 Wavefrom을 성공적으로 생성하고 있습니다. SPI 만 사용하여 ADC 값을 읽는 데 문제가 있습니다. ADC 값을 읽기 위해 비트 뱅킹을 사용해야합니다. 8 비트를 보내는 내 코드를 살펴볼 수 있습니까? 그러나 나는 그것을 사용하는 방법을 혼란스럽게하고 있습니다. SPI 코드 대신이 코드를 직접 설정하여 레지스터를 설정할 수 있습니까?
verendra

@Steven-당신이 보여주는 다이어그램은 MSB가 먼저이므로 7에서 왼쪽으로 이동하고 0에서 왼쪽으로 이동해야합니다. 표준이 없으므로 LSB가 될 수 있다는 것을 알고 있지만 대부분의 SPI 주변 장치 가이 방법을 사용한다고 생각합니다 .
Oli Glaser

2
@Oli-좋은 지적, 나는 그것을 놓쳤다. 의견을 보내 주셔서 감사합니다. 표준이없는 이유는 전송 된 비트 수가 시프트 레지스터 길이와 같은 한 중요하지 않기 때문입니다. 최근 NXP Cortec-M3과 같은 일부 마이크로 컨트롤러는 가변 길이 시프트 레지스터를 가지고 있으며 방향이 중요 할 수 있습니다. AVR에서 IIRC를 먼저 MSB 또는 LSB를 먼저 선택할 수 있습니다.
stevenvh

6

비트 뱅잉은 장치에서 나가거나 장치로 들어오는 신호가 하드웨어가 아닌 소프트웨어에 의해 생성 / 샘플링되는 개념을 말합니다. 분명히 일부 하드웨어가 필요하지만 비트 뱅킹을 사용할 때 각 출력의 유일한 하드웨어는 소프트웨어로 명시 적으로 설정하거나 지울 수있는 래치이며, 각 입력의 유일한 하드웨어는 소프트웨어가 소프트웨어인지 여부를 테스트 할 수있는 인터페이스입니다 높음 또는 낮음 (일반적으로 한 상태에 대해 조건부 분기를 실행하지만 다른 상태에서는 실행하지 않음).

비트 뱅잉으로 달성 할 수있는 최대 속도는 일반적으로 전용 하드웨어로 달성 할 수있는 것의 일부이지만 프로세서 속도로 인한 제한을 벗어나면 비트 뱅킹이 훨씬 더 다양하며 상황에서 사용될 수 있습니다. 범용 하드웨어가 적합하지 않고 특수 하드웨어가 비용 효율적이지 않은 경우.

예를 들어, 많은 컨트롤러에는 기본적으로 다음과 같이 동작하는 "SPI 스타일"포트가 있습니다. 바이트가 특정 레지스터에 기록 될 때 하드웨어는 몇 개의 클럭 펄스 (일반적으로 8 개)를 생성하여 데이터 비트를 클럭킹합니다. 각 클럭 펄스의 리딩 에지 ​​및 트레일 링 에지에서 수신 데이터 비트를 샘플링합니다. 일반적으로 컨트롤러의 SPI 스타일 포트는 다양한 기능을 구성 할 수 있지만 경우에 따라 비정상적인 작업을 수행하는 장치와 프로세서를 인터페이스해야 할 수도 있습니다. 디바이스는 데이터 비트가 8이 아닌 배수로 처리 될 것을 요구할 수도 있고, 또는 데이터가 동일한 클럭 에지에서 출력 및 샘플링 될 것을 요구할 수도 있고, 또는 다른 특이한 요구 사항을 가질 수도있다. 컨트롤러의 특정 하드웨어가 사용중인 하드웨어의 정확한 요구 사항을 지원할 수 있다면, 많음 (일부는 구성 가능한 비트 수, 별도로 구성 가능한 송수신 타이밍 등을 제공합니다) 그렇지 않은 경우 비트 뱅킹이 도움이 될 수 있습니다. 컨트롤러에 따라 SPI-ish 인터페이스의 비트 뱅킹은 하드웨어가 처리하는 데 2-10 배가 걸리지 만 요구 사항이 하드웨어에 맞지 않으면 데이터를 더 느리게 교환하는 것이 전혀 할 수 없습니다.

비트 뱅킹 설계에서 주목해야 할 한 가지 중요한 점은 통신중인 장치가 비트 뱅킹 컨트롤러에서 모든 타이밍을 생성하기 위해 대기하거나 컨트롤러가 허용되는 위치에서 가장 간단하고 강력하다는 것입니다. 방해받지 않고 이벤트가 도착할 때까지 기다렸다가 다른 이벤트가 도착하기 전에 해당 이벤트와 관련된 모든 작업을 수행 할 수있는 위치에서 대기해야합니다. 장치가 비교적 짧은 시간 내에 외부 자극에 반응 할 수 있어야하는 상황에서는 훨씬 덜 견고하지만 이러한 자극을 관찰하는 데 100 %의 에너지를 장치에 공급할 수는 없습니다.

예를 들어, 프로세서가 클럭 속도에 비해 매우 높은 속도로 UART 스타일의 데이터를 직렬로 전송하도록하려고한다고 가정합니다 (예 : 초당 8,192 개의 명령을 실행하는 PIC가 1200 bps로 데이터를 출력하려고 함). 인터럽트가 활성화되어 있지 않으면 그러한 전송이 어렵지 않습니다 (7 개의 명령 사이클마다 1 비트 클럭). PIC가 들어오는 1200bps 데이터 바이트를 기다리는 것 외에는 아무것도하지 않으면 시작 비트를 기다리는 3 사이클 루프를 실행 한 다음 7 사이클 간격으로 데이터 클럭을 진행할 수 있습니다. 실제로, 들어오는 바이트의 데이터가 도착했을 때 PIC가 전송할 준비가 된 바이트의 데이터를 가지고 있다면, 비트 당 7 사이클은 PIC가 들어오는 바이트를 읽는 것과 동시에 데이터의 바이트를 보내는 데 충분한 시간이 될 것입니다. 마찬가지로,이러한 응답이 원래 전송에 대해 고정 된 타이밍을 갖는 경우 . 반면에 비트 뱅 통신을 처리 할 수있는 속도의 PIC가 속도를 낼 수있는 방법은 없을 것입니다. 전송하지 않을 때 마음에 드는 모든 것을 수행하고, 대부분의 타이밍에 대부분의 시간을 소비해야 할 장치 하나는 첫 번째 장치의 전송을 기다리는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.