おやじ のすべての投稿

IOT(?)な日常を目指して、学習しています。

PICOのSPI1を使う

概要

 PICOのSPI1を使います。PICOにはSPIが2系統あるので、同時に使用できるか確認しました。過去に投稿しているWIZnet W5500-EVB-Pico を使用する際など実際にはSPI接続していますが、ライブラリを使っているので、SPI接続であることをあまり意識していません。
 一方、SPI接続デバイスを複数使用したいとき、内容を判っていないので、ライブラリを変更することは簡単ではありません。
 独立した2系統のSPIをそれぞれ使用することが出来れば、この問題をある程度解消できると思い、今回テストしています。

接続

 PICO SPI1とEEPROM(93c46)を接続します。

Raspberry PI PICO
+ W5500 Lite
EEPROM(93c46)
GP124
GP131
GP142
GP153
GND5
3.3V8

プログラム

#include <SPI.h>
#include <Ethernet.h>

SPISettings settings;             //[SPI1] SPI1テスト
#define PIN_SPI_SCK 14            //[SPI1]→93C46 2pin ■SPI SCK 
#define PIN_SPI_MISO 12           //[SPI1]→93C46 4pin ■SPI RX (MISO:Master In Slave Out)
#define PIN_SPI_MOSI 15           //[SPI1]→93C46 3pin ■SPI TX (MOSI : Master Out Slave In)
#define PIN_SPI_SLCT 13           //[SPI1]→93C46 1pin ■SPI SELECT

//
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // ▼EEPROM(93c46)読取(SPI1)
  pinMode(PIN_SPI_SLCT, OUTPUT);  //[SPI1] SPI1スレーブセレクト
  settings = SPISettings(2000000, MSBFIRST, SPI_MODE0);   //[SPI1]SPI1設定  ※ 2MHz (10M=10,000,000)
  SPI1.setSCK(PIN_SPI_SCK);       //[SPI1]→93C46 2pin ■SPI SCK 
  SPI1.setRX(PIN_SPI_MISO);       //[SPI1]→93C46 4pin ■SPI RX (MISO:Master In Slave Out)
  SPI1.setTX(PIN_SPI_MOSI);       //[SPI1]→93C46 3pin ■SPI TX (MOSI : Master Out Slave In)
  SPI1.begin();                   //[SPI1]

  // 書込モード設定
  digitalWrite(PIN_SPI_SLCT, HIGH); 
    SPI1.beginTransaction(settings); 
    // 書込無効化    
    SPI1.transfer(0b00000001);  
    SPI1.transfer(0b00000000);
    SPI1.endTransaction();
    delay(5);    
  digitalWrite(PIN_SPI_SLCT, LOW); 
  delay(10);  

  char buf[4];
  // アドレス 0-9 番地までデータ読込
  for (int i=0; i< 10; i++){
    if(i==2 || i==5){Serial.println("");}

    digitalWrite(PIN_SPI_SLCT, HIGH);    
      SPI1.beginTransaction(settings);
      SPI1.transfer(0b00000001);  
      SPI1.transfer(0b10000000 | i);    

      uint8_t b1 =  SPI1.transfer(0x00);
      uint8_t b2 =  SPI1.transfer(0x00);
      uint8_t b3 =  SPI1.transfer(0x00); 
      SPI1.endTransaction();       
      delay(5);

      sprintf(buf, "%02x", ((b2 & 0b01111111) << 1) | (b3 >> 7)); 
      Serial.print(buf);
      Serial.print(" ");

      sprintf(buf, "%02x", (b1 << 1) | (b2 >> 7)); 
      Serial.print(buf);
      Serial.print(" ");

    digitalWrite(PIN_SPI_SLCT, LOW);     
  }  
  Serial.println("");
  Serial.println("");
  // ▲EEPROM(93c46)読取(SPI1)

  // Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH Shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit FeatherWing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit FeatherWing Ethernet
  Ethernet.init(17);    // WIZnet W5100s-EVB-Pico W5500-EVB-Pico W6100-EVB-Pico 

  Serial.println("Ethernet WebServer Example");
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an HTTP request ends with a blank line
    bool currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the HTTP request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard HTTP response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          // for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
          for (int analogChannel = 26; analogChannel < 29; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

まとめ

 EEPROMの内容取得、ethernet接続ともに確認できました。
WIZnet W5500-EVB-Pico でも同じく動作確認出来ました。