로직 분석기 시험 4: 하드웨어 SPI 및 소프트웨어 SPI

MCP3008에서 하드웨어 SPI 및 소프트웨어 SPI 처리 시간



A/D 컨버터인 MCP3008 을 이용한 하드웨어 SPI와 소프트웨어 SPI의 처리 시간에 차이가 있다는 것을 깨달았으므로 여기에 기록한다.

하드웨어 SPI 및 소프트웨어 SPI



여기 에 설명 있음. 하드웨어 SPI는 전용 회로를 사용하고 소프트웨어 SPI는 GPIO를 사용한다.

환경



로직 애널라이저를 시험해보는 그 3(SPI) 과 같다. Arduino에서 A/D 컨버터 MCP3008과 온도 센서 MCP9700 을 이용.

MCP3008 데이터시트



하드웨어 SPI 처리





하드웨어 SPI에서는 8비트를 정리해 처리하는 ‘leading zeros’가 계기가 되고 있는 것 같다. 이것을 기초로 코딩한다 ( 마지막 소스 코드 참조 )

소프트웨어 SPI 처리





시리얼에 1비트씩 처리한다.

소스 코드



하드웨어 SPI



지난번 와 정확히 동일.
#include <SPI.h>
#define SPI_CS 10
float Vref = 5.0 ;
SPISettings settings(1000000,MSBFIRST,SPI_MODE0);

void setup() {
  Serial.begin(9600);
  pinMode(SPI_CS, OUTPUT);
  SPI.begin();
}

void loop(){
  // SPI setting and write&read
  SPI.beginTransaction(settings);
  digitalWrite(SPI_CS, LOW);
  SPI.transfer(0b00000001);                 // Start bit 1
  byte highByte = SPI.transfer(0b10000000); // SingleEnd Channel 0
  byte lowByte = SPI.transfer(0x00);        // dummy
  digitalWrite(SPI_CS, HIGH);
  SPI.endTransaction();
  unsigned int dataCh0 = ((highByte & 0x03) << 8) + lowByte;

  // Conversion of read data according to MCP9700 spec
   float volts = dataCh0 * Vref / 1024;
  float temperature = (volts - 0.5) / 0.01; // : 500 mv at 0 degree and 10 mv / degree 
  Serial.println("dataCh0: " + String(dataCh0,HEX) + "  Voltage: " + String(volts,3));
  Serial.println("Temperature: " + String(temperature,2) + " degrees");
  Serial.println();
  delay(3000);
}

소프트웨어 SPI



여기 에 있는 것과 거의 같다.
#include <SPI.h>
#define SPI_CS   7
#define SPI_MOSI 6
#define SPI_MISO 5
#define SPI_CLK  4
float Vref = 5.0;

void setup() {
  Serial.begin(9600);
  pinMode(SPI_CS, OUTPUT);
  pinMode(SPI_CLK, OUTPUT);
  pinMode(SPI_MOSI, OUTPUT);
  pinMode(SPI_MISO, INPUT);
  digitalWrite(SPI_CLK, LOW);
  digitalWrite(SPI_MOSI, LOW);
  digitalWrite(SPI_CS, HIGH);
}

void loop() {
  // SPI setting and write&read
  unsigned int outBuffer, inBuffer = 0;
  byte command = ((0x01 << 7) |        // Start bit
                  (1 << 6) |           // 1: SingleEnd
                  ((0 & 0x07) << 3));  // Channel 0
  digitalWrite(SPI_CS, LOW);
  outBuffer = command << 8;
  for (int c = 0; c < 16; c++) {
    digitalWrite(SPI_MOSI, (outBuffer >> (15 - c)) & 0x01);
    digitalWrite(SPI_CLK, HIGH);
    digitalWrite(SPI_CLK, LOW);
    inBuffer <<= 1;
    if (digitalRead(SPI_MISO))
      inBuffer |= 0x01;
  }
  digitalWrite(SPI_CS, HIGH);
  unsigned int dataCh0 = inBuffer & 0x3ff;

  // Conversion of read data according to MCP9700 spec
  float volts = dataCh0 * Vref / 1024;
  float temperature = (volts - 0.5) / 0.01; // : 500 mv at 0 degree and 10 mv / degree 
  Serial.println("dataCh0: " + String(dataCh0,HEX) + "  Voltage: " + String(volts,3));
  Serial.println("Temperature: " + String(temperature,2) + " degrees");
  Serial.println();
  delay(3000);
}

로직 애널라이저



하드웨어 SPI





소프트웨어 SPI




소지하는 로직 애널라이저의 SPI 디코드는 하드웨어 SPI를 전제로 하고 있는 것 같고, 그대로는 디코드할 수 없다. 시험에, Clock polarity와 Clock phase를 적당히 선택한다고 디코드해 주었다.


비교



둘 다 MISO와 같은 데이터('9c' 및 '9f', 변환 후는 26-27도)를 볼 수 있다. 여기서 포인트는 처리 속도. 로직 애널라이저에서 취득 데이터의 처리 시간(빨간색 테두리)을 보면,
- 하드웨어 SPI 26μs
- 소프트웨어 SPI 340μs
되어 있다. 이만큼 차이가 있는 것은 조금 깜짝.

소프트웨어 SPI에 대해서는 이용하는 마이크로 컴퓨터 등의 능력에도 의존할 것이다. 또, 다른 SPI 대응 디바이스로 어떤 결과가 될지는 불명.

좋은 웹페이지 즐겨찾기