#include <SPI.h>
const uint8_t latchPin = 9;
const uint8_t parallelLoad = 8;
const uint8_t clockEnable = 18;
#define USE_SPI
#ifdef USE_SPI
// https://www.allaboutcircuits.com/technical-articles/spi-serial-peripheral-interface/
// 74HC165 shifts on rising edge, uC samples on falling
SPISettings Settings165( 1000, MSBFIRST, SPI_MODE2);
// 74HC595 samples on rising edge and shifts on falling
SPISettings Settings595( 1000, MSBFIRST, SPI_MODE0);
#endif USE_SPI
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32-C3!");
Serial.print("MOSI: ");
Serial.println(MOSI);
Serial.print("MISO: ");
Serial.println(MISO);
Serial.print("SCK: ");
Serial.println(SCK);
Serial.print("SS: ");
Serial.println(SS);
pinMode(latchPin, OUTPUT);
digitalWrite(latchPin, LOW);
pinMode(parallelLoad, OUTPUT);
digitalWrite(parallelLoad, HIGH);
pinMode(clockEnable, OUTPUT);
digitalWrite(clockEnable, HIGH);
#ifdef USE_SPI
SPI.begin();
#else
pinMode(SCK, OUTPUT);
pinMode(MOSI, OUTPUT);
pinMode(MISO, INPUT);
#endif
}
int bitNumber = 0;
void loop() {
const uint16_t outputValue = 1 << bitNumber;
#ifdef USE_SPI
SPI.beginTransaction( Settings595 );
SPI.transfer16(outputValue);
SPI.endTransaction();
#else
digitalWrite(SCK, LOW);
shiftOut(MOSI, SCK, MSBFIRST, outputValue >> 8);
shiftOut(MOSI, SCK, MSBFIRST, outputValue & 0xFF);
#endif
delayMicroseconds(5);
digitalWrite(latchPin, HIGH);
delayMicroseconds(5);
digitalWrite(latchPin, LOW);
delayMicroseconds(5);
Serial.print(" Output: ");
Serial.print(outputValue);
#ifdef USE_SPI
digitalWrite(clockEnable, LOW);
SPI.beginTransaction( Settings165 );
// because we changed the mode, we have to read in dummy value so that SCK gets high
SPI.transfer(0);
digitalWrite(parallelLoad, LOW);
delayMicroseconds(5);
digitalWrite(parallelLoad, HIGH);
delayMicroseconds(5);
const uint16_t value = SPI.transfer16(0);
digitalWrite(clockEnable, HIGH);
SPI.endTransaction();
#else
digitalWrite(clockEnable, LOW);
digitalWrite(SCK, LOW);
const uint8_t highByte = shiftIn(MISO, SCK, MSBFIRST);
const uint8_t lowByte = shiftIn(MISO, SCK, MSBFIRST);
const uint16_t value = (highByte << 8) | lowByte;
digitalWrite(clockEnable, HIGH);
#endif
Serial.print(" Input: ");
Serial.println(value);
++bitNumber;
if (bitNumber > 15)
bitNumber = 0;
// put your main code here, to run repeatedly:
delay(100); // this speeds up the simulation
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1