概要
確認した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() {
}まとめ
読めてよかったです。