로직 분석기 시험 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 대응 디바이스로 어떤 결과가 될지는 불명.
Reference
이 문제에 관하여(로직 분석기 시험 4: 하드웨어 SPI 및 소프트웨어 SPI), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/infinite1oop/items/b24cc42d78d5d50c94dc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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);
}
#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);
}
Reference
이 문제에 관하여(로직 분석기 시험 4: 하드웨어 SPI 및 소프트웨어 SPI), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/infinite1oop/items/b24cc42d78d5d50c94dc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)