EEPROM(93c46)読取検証

概要

 確認したEEPROM(93c46)読取方法について記載します。
 ARDUINO UNO とRaspberryPi picoで接続・読取プログラムが少し異なりますので、それぞれ書いています。

ARDUINO UNO

#include <Arduino.h>
#include <SPI.h>
// 5V → 93C46 8pin , GND → 93C46 5pin
// SCK  : pin 13 (Serial ClocK)          →93C46 2pin
// MISO : pin 12 (Master In Slave Out)   →93C46 4pin
// MOSI : pin 11 (Master Out Slave In)   →93C46 3pin
// SS   : pin 10 (Slave Select pin)      →93C46 1pin
 
void setup() {
  Serial.begin(9600); 
    
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);  
    
  // 書込モード設定
  digitalWrite(SS, HIGH); 
    // 書込有効化 
    SPI.transfer(0b00000001);  
    SPI.transfer(0b00110000);    
 
    // 書込無効化    
    //SPI.transfer(0b00000001);  
    //SPI.transfer(0b00000000);    
  digitalWrite(SS, LOW); 
  delay(10);  
 
  // アドレス0番地から5番地までデータを書き込む
  // uint8_t count =1;
  // for (int i=0; i< 6; i++){
  //   digitalWrite(SS, HIGH); 
  //     // WRITE命令 + アドレス
  //     SPI.transfer(0b00000001);  
  //     SPI.transfer(0b01000000 | i);    
  //     // 2byte書き込む
  //     SPI.transfer(count++);
  //     SPI.transfer(count++);    
  //   digitalWrite(SS, LOW);
  //   delay(10);  
  // }
 
  char buf[4];
  // アドレス 0-9 番地までデータ読込
  for (int i=0; i< 10; i++){
    if(i==2 || i==5){Serial.println("");}

    digitalWrite(SS, HIGH);    
      SPI.transfer(0b00000001);  
      SPI.transfer(0b10000000 | i);         
      delay(5);    

      uint8_t b1 =  SPI.transfer(0x00);
      uint8_t b2 =  SPI.transfer(0x00);
      uint8_t b3 =  SPI.transfer(0x00);  
      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(SS, LOW);     
  }  
  Serial.println("");
}
 
void loop() {
}

RASPBERRY PI PICO

#include <SPI.h>
SPISettings settings;

// ピン定義(Raspberry PI PICO SPI)
// 3.3V → 93C46 8pin , GND → 93C46 5pin
#define PIN_SPI_SCK 18   //→93C46 2pin ■SPI SCK 
#define PIN_SPI_MISO 16  //→93C46 4pin ■SPI RX (MISO:Master In Slave Out)
#define PIN_SPI_MOSI 19  //→93C46 3pin ■SPI TX (MOSI : Master Out Slave In)
#define PIN_SPI_SLCT 17  //→93C46 1pin ■SPI SELECT
 
void setup() {
  pinMode(PIN_SPI_MOSI, OUTPUT);      // SPI送信
  pinMode(PIN_SPI_MISO, INPUT);       // SPI受信
  pinMode(PIN_SPI_SCK, OUTPUT);       // SPIクロック
  pinMode(PIN_SPI_SLCT, OUTPUT);      // SPIスレーブセレクト

  Serial.begin(9600); 
  delay(1500);

  settings = SPISettings(2000000, MSBFIRST, SPI_MODE0);   //2000000  (10M=10,000,000)  
  SPI.begin();
    
  // 書込モード設定
  digitalWrite(PIN_SPI_SLCT, HIGH); 
    SPI.beginTransaction(settings);
    // 書込有効化 
    SPI.transfer(0b00000001); 
    SPI.transfer(0b00110000);    
     
    // 書込無効化    
    //SPI.transfer(0b00000001);  
    //SPI.transfer(0b00000000);
    SPI.endTransaction();
    delay(5);    
  digitalWrite(PIN_SPI_SLCT, LOW); 
  delay(10);  
 
  // アドレス0番地から5番地までデータを書き込む
  // uint8_t count =1;
  // for (int i=0; i< 6; i++){
  //   digitalWrite(PIN_SPI_SLCT, HIGH); 
  //     // WRITE命令 + アドレス
  //     SPI.beginTransaction(settings);
  //     SPI.transfer(0b00000001);  
  //     SPI.transfer(0b01000000 | i);    
 
  //     // 2byte書き込む
  //     SPI.transfer(count++);
  //     SPI.transfer(count++);
  //     SPI.endTransaction();
  //   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);    
      SPI.beginTransaction(settings);
      SPI.transfer(0b00000001);  
      SPI.transfer(0b10000000 | i);    

      uint8_t b1 =  SPI.transfer(0x00);
      uint8_t b2 =  SPI.transfer(0x00);
      uint8_t b3 =  SPI.transfer(0x00); 
      SPI.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("");
}
 
void loop() {
}

まとめ

 読めてよかったです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です