ESP32 및 MCP3008에서 SPI 학습

4405 단어 SPIMCP3008ESP32
ESP32를 사용하여 SPI의 기본 동작을 확인합니다.
여기에 연결하는 장치로서 10 bit x 8 채널의 AD 컨버터 MCP3008 이 수중에 있었으므로 그것을 사용했습니다.

환경


  • Arduino 1.8.10 for Linux
  • esp32 by Espressif System Version 1.0.3
  • WEMOS LOLIN32

  • 연결








    신호명
    MCP3008 PIN
    MCP3008 신호명
    케이블
    ESP32 GPIO
    ESP32 신호명


    VDD
    16
    VDD
    오렌지
    3V3
    3V3

    15
    VREF
    VDD



    14
    AGND
    DGND에 연결


    SCK
    13
    CLK
    황색
    IO18
    VSPCLK

    미소
    12
    DOUT
    보라색
    IO19
    VSPIQ

    MOSI
    11
    DIN

    IO23
    VSPID

    CS
    10
    CS/SHDN
    녹색
    IO5
    VSPICS0

    GND
    9
    DGND
    블랙
    GND
    GND


    MCP3008에는 아날로그 입력 포트가 CH0 ~ CH7인 8채널이 있습니다. 각각 10비트의 분해능으로 AD 변환을 실시해, SPI로 마이크로컴퓨터 등에 캡처할 수 있습니다. 테스트를 위해 CH0에 1kΩ의 저항을 붙여 VDD에 연결해 보았습니다.

    MCP3008의 SPI 설정



    데이터 시트에서 전송에 필요한 설정을 읽어보십시오.


  • MSBFIRST (LSBFIRST 전송도 MSBFIRST 전송 후에 발생합니다)
  • 아이들링 HIGH/LOW 양대 대응
  • 전송 타이밍 클럭의 상승 에지
  • 클럭 속도 10kHz 이상, 최대 1.35MHz (VDD = 2.7V)

  • 시작 비트로 1비트 전송하지만 SPI 라이브러리는 8비트 단위로 전송합니다. 그러기 전에 7비트의 0을 넣어 전송합니다.
    다음 8비트에서는 다음과 같이 데이터가 송수신됩니다.


    bit7
    bit6
    bit5
    bit4
    bit3
    bit2
    bit1
    bit0


    SGL/DIFF
    D2
    D1
    D0
    ?
    0
    B9
    B8


    여기서 bit7 ~ bit4는 MCP3008에 대한 입력입니다. SGL/DIFF는 단일 종단 입력과 작동 입력의 비트입니다. 1이면 싱글 엔드, 0이면 작동 입력입니다.
    이번에는 싱글 엔드 입력을 사용합니다. 이 경우 D2/D1/D0은 채널 지정, CH0이면 D2=0, D1=0, D0=0. CH1이라면 D2=0, D1=0, D0=1.
    bit2 ~ bit0은 MCP3008의 출력입니다. bit2는 항상 0, B9 및 B8에서 10bit의 AD 변환 값 중 상위 2 비트입니다.

    또한 다음 8 비트에서 다음과 같이 MCP3008에서 계속되는 B7 ~ B0의 나머지 8 비트가 출력됩니다.


    bit7
    bit6
    bit5
    bit4
    bit3
    bit2
    bit1
    bit0


    B7
    B6
    B5
    B4
    B3
    B2
    B1
    B0


    이 전송이 끝나도 CS 신호가 Low 만났을 경우에는, 다음의 7bit가 MSBFIRST 전송으로서 행해집니다.







    B1
    B2
    B3
    B4
    B5
    B6
    B7


    SPI 전송 모드




    모드
    CPOL (클럭 극성)
    CPHA (클럭 위상)


    0
    0
    0

    1
    0
    1

    2
    1
    0

    3
    1
    1


    클록 극성은 0 : 아이들 Lo 펄스 High 1 : 아이들 High 펄스 Lo
    클럭 위상은 0 : 펄스 팁에서 전송 1 : 펄스 후단에서 전송

    따라서 MCP3008은 SPI의 모드 0 또는 모드 3을 사용합니다.

    ESP32의 SPI 설정



    ESP32 는 VSPI, HSPI 의 2 개의 SPI 채널이 있습니다만, SPI 라이브러리라면 VSPI 쪽이 사용된다고 합니다.
    게다가 SPI의 포트 할당은 변경 가능한 것 같습니다만, 이번은 디폴트의 설정을 사용하고 있습니다.
    속도는 SPISettings 매개 변수로 설정합니다. 이번에는 1000000으로 설정하여 최대 1MHz로 구동하게 됩니다.

    코드


    
    
    #include <SPI.h>
    #define SS 5
    float Vref = 3.3 ;
    
    SPISettings settings(1000000,MSBFIRST,SPI_MODE1);
    
    
    void setup() {
        pinMode(SS, OUTPUT);
        Serial.begin(115200);
        SPI.begin();
    }
    
    void loop(){
        byte single = 1 << 7; // Single...1 /Diff...0
        byte channel = 0;
        byte buffer1  = single |  ( channel << 4 ) ;
        byte buffer2 = 0 ;
        float volt; 
        unsigned int getdata;
        SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
        SPI.transfer( 0b00000001); // Start bit 
        buffer1 = SPI.transfer(buffer1); // CH0 singleEnd
        buffer2 = SPI.transfer(buffer2);
        digitalWrite(SS, HIGH);
        SPI.endTransaction();
        getdata = ((buffer1 & 0x03) *256) + buffer2;
        volt = getdata*Vref /1024;
        Serial.print(   getdata ); 
        Serial.println( ": " +String(volt,3) + "V");
        delay(1000);
        delay(1000);
    }
    

    실행 결과


    1023: 3.297V
    1023: 3.297V
    1023: 3.297V
    7: 0.023V
    23: 0.074V
    0: 0.000V
    0: 0.000V
    0: 0.000V
    154: 0.496V
    1023: 3.297V
    1023: 3.297V
    1023: 3.297V
    1023: 3.297V
    1023: 3.297V
    1023: 3.297V
    ・
    ・
    ・
    
    

    CH0에 접속한 저항을 VDD에서 GND로 다시 연결하고 다시 VDD에 접속했을 때의 값입니다.

    좋은 웹페이지 즐겨찾기