Tengo una pregunta con respecto a eeproms y un Arduino (estoy usando Arduino Uno). Tengo el siguiente eeprom: 93LC46B . De la hoja de datos, entiendo que para escribir los enteros 1
y 2
en la primera dirección, necesito enviar los siguientes bits:
-
1
: bit de inicio -
01
: escribir código de operación -
000000
: primera dirección -
00110001
:1
-
00110010
:2
El resultado es 1010000000011000100110010
Tengo el siguiente código pero parece que no puedo encontrar la forma de enviar los bits, ¿alguien puede ayudarme?
#include "SPI.h"
int ss=10;
void setup()
{
pinMode(ss, OUTPUT);
digitalWrite(ss, LOW);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
digitalWrite(ss, HIGH);
//what to send?
digitalWrite(ss, LOW);
}
Así que actualicé mi código pero aún no puedo obtener el resultado deseado. Este es el código:
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO
#define SPICLOCK 13//sck
#define SLAVESELECT 10//ss
//opcodes
#define READ 0x80
#define WRITE 0x40
byte eeprom_output_data;
byte clr;
void setup()
{
Serial.begin(9600);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
pinMode(SLAVESELECT, OUTPUT);
digitalWrite(SLAVESELECT, LOW); //disable device
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
clr=SPSR;
clr=SPDR;
delay(10);
digitalWrite(SLAVESELECT, HIGH);
digitalWrite(DATAOUT, HIGH);
digitalWrite(SPICLOCK, HIGH);
delay(1);
digitalWrite(SPICLOCK, LOW);
spi_transfer(WRITE); //01000000
spi_transfer(0x10);
spi_transfer(0x11);
digitalWrite(SLAVESELECT,LOW); //release chip
delay(3000);
eeprom_output_data = read_eeprom();
Serial.print(eeprom_output_data,DEC);
Serial.print('\n');
delay(500); //pause for readability
}
char spi_transfer(volatile char data)
{
SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
{
};
return SPDR; // return the received byte
}
byte read_eeprom()
{
//READ EEPROM
int data;
digitalWrite(SLAVESELECT, HIGH);
digitalWrite(DATAOUT, HIGH);
digitalWrite(SPICLOCK, HIGH);
delay(1);
digitalWrite(SPICLOCK, LOW);
spi_transfer(READ); //transmit read opcode
data = spi_transfer(0xFF); //get data byte
digitalWrite(SLAVESELECT, LOW); //release chip, signal end transfer
return data;
}
void loop()
{
}