Использование микрочипа 25LC080 серии eeprom с Arduino
Вот моя работа над регистрирующим устройством для Wii геймпада.
Мне понадобилось устройство для считывания значений с акселерометра геймпада wii. На руках у меня был был микрочип 25LC080 eeprom, вполне подходящий для того, чтобы реализовать нужное мне устрйство на моем Arduino.
На сайте Arduino есть большое руководство по работе с чипами серии . С его помощью я получил большую часть необходимой для моего проекта информации, которую я и использовал, лишь слегка доработав.
Моя задумка состояла в том, чтобы Arduino считывал данные с акселерометра и записывал их на EEprom для дальнейшего просмотра. Использовать эти данные можно, например, для измерения ускорения подъема на лифте и поездки в автомобиле в играх Wii.
25LC080 может хранить до 1024 байт данных. Геймпад Wii производит 3 байта данных (1 для каждой оси), таким образом сохранено может быть только 333 положений, поэтому я заказал 25AA512, который запоминает до 64000 байтов.
Вот код:
// Original program code by Heather Dewey-Hagborg, http://www.arduino.cc/en/Tutorial/SPIEEPROM
// with slight modifications to work with 25cl0l by Chad Phillips
#define DATAOUT 11 //MOSI
#define DATAIN 12 //MISO
#define SPICLOCK 13 //sck
#define SLAVESELECT 10 //ss
//opcodes
#define WREN 6
#define WRDI 4
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2
byte eeprom_output_data;
byte eeprom_input_data = 0;
byte clr;
int address = 0;
//data buffer
char buffer[128];
void
fill_buffer ()
{
int a = 0;
for (int I = 0; I < 128; I++)
{
buffer[a] = I;
a++;
}
}
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
}
void
setup ()
{
Serial.begin (19200);
pinMode (DATAOUT, OUTPUT);
pinMode (DATAIN, INPUT);
pinMode (SPICLOCK, OUTPUT);
pinMode (SLAVESELECT, OUTPUT);
digitalWrite (SLAVESELECT, HIGH); //disable device
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 rate (fastest)
SPCR = (1 << SPE) | (1 << MSTR);
clr = SPSR;
clr = SPDR;
delay (10);
//fill buffer with data, that will be used to write our test data to eeprom
fill_buffer ();
for (int I = 0; I < 128; I++)
{
start_transfer (buffer[I], I);
delay (50);
}
delay (3000);
Serial.print ("All data sent to EEPROM");
Serial.println ();
Serial.print ("Start reading EEPROM");
Serial.println ();
delay (1000);
}
void
start_transfer (char data, int address)
{
Serial.print ("Write value, ");
Serial.print (data, DEC);
Serial.print (" , to address ");
Serial.print (address, DEC);
Serial.println ();
digitalWrite (SLAVESELECT, LOW);
spi_transfer (WREN); //write enable
digitalWrite (SLAVESELECT, HIGH);
delay (10);
digitalWrite (SLAVESELECT, LOW);
spi_transfer (WRITE); //write instruction
spi_transfer ((char) (address >> 8)); //send MSByte address first
spi_transfer ((char) (address)); //send LSByte address
// start spi transfer
spi_transfer (data); //write data byte
digitalWrite (SLAVESELECT, HIGH); //release chip
}
byte
read_eeprom (int EEPROM_address)
{
//READ EEPROM
int data;
digitalWrite (SLAVESELECT, LOW);
spi_transfer (READ); //transmit read opcode
spi_transfer ((char) (EEPROM_address >> 8)); //send MSByte address first
spi_transfer ((char) (EEPROM_address)); //send LSByte address
data = spi_transfer (0xFF); //get data byte
digitalWrite (SLAVESELECT, HIGH); //release chip, signal end transfer
return data;
}
void
loop ()
{
eeprom_output_data = read_eeprom (address);
Serial.print ("EEPROM address ");
Serial.print (address, DEC);
Serial.print (" contains value ");
Serial.print (eeprom_output_data, DEC);
Serial.println ();
address++;
// This eeprom only holds 1024 bytes
// Set back to zero when we hit the end
// In this example we only initialed the
// first 128 bytes. If this is a new eeprom, bytes 129 to 1024 should contain 255
if (address > 1023)
{
address = 0;
Serial.print (" reset address to 0\n");
}
delay (20); //pause for readability
}
комментарии(0)
Комментировать