From 190f1b5876b58e0fed4cdb52b71677b7b802337b Mon Sep 17 00:00:00 2001 From: Marvin Blum Date: Fri, 29 Jul 2022 20:58:38 +0200 Subject: [PATCH] Finished EEPROM reader/writer. --- at28c256/at28c256.c | 76 ++++++++++++++++++++++++++++++++++++--------- at28c256/at28c256.h | 2 +- main.c | 22 +++++++++---- 3 files changed, 79 insertions(+), 21 deletions(-) diff --git a/at28c256/at28c256.c b/at28c256/at28c256.c index a350ae2..1ee739e 100644 --- a/at28c256/at28c256.c +++ b/at28c256/at28c256.c @@ -2,6 +2,8 @@ #include "at28c256.h" #include "../ard/pins.h" +#include "../ard/serial.h" + unsigned char _ck, _addr, _oe, _we, _io0, _io1, _io2, _io3, _io4, _io5, _io6, _io7; void at28c256_init(unsigned char ck, unsigned char addr, unsigned char oe, unsigned char we, unsigned char io0, unsigned char io1, unsigned char io2, unsigned char io3, unsigned char io4, unsigned char io5, unsigned char io6, unsigned char io7) { @@ -28,11 +30,7 @@ void at28c256_init(unsigned char ck, unsigned char addr, unsigned char oe, unsig _io7 = io7; } -void at28c256_write(unsigned short addr, unsigned char data) { - // just to be safe, disable output - digital_write(_oe, HIGH); - - // set the address +void set_addr(unsigned short addr) { unsigned int i; for(i = 0; i < 16; i++) { @@ -47,17 +45,67 @@ void at28c256_write(unsigned short addr, unsigned char data) { } digital_write(_addr, LOW); +} + +void at28c256_write(unsigned short addr, unsigned char data) { + // just to be safe, disable output + digital_write(_oe, HIGH); + + // set the output address + set_addr(addr); // write data - digital_write(_io0, data & 1); - digital_write(_io1, data & 1<<1); - digital_write(_io2, data & 1<<2); - digital_write(_io3, data & 1<<3); - digital_write(_io4, data & 1<<4); - digital_write(_io5, data & 1<<5); - digital_write(_io6, data & 1<<6); - digital_write(_io7, data & 1<<7); - digital_write(_we, data); + pin_mode(_io0, OUTPUT); + pin_mode(_io1, OUTPUT); + pin_mode(_io2, OUTPUT); + pin_mode(_io3, OUTPUT); + pin_mode(_io4, OUTPUT); + pin_mode(_io5, OUTPUT); + pin_mode(_io6, OUTPUT); + pin_mode(_io7, OUTPUT); + + digital_write(_io0, data & 1 ? HIGH : LOW); + digital_write(_io1, data & (1<<1) ? HIGH : LOW); + digital_write(_io2, data & (1<<2) ? HIGH : LOW); + digital_write(_io3, data & (1<<3) ? HIGH : LOW); + digital_write(_io4, data & (1<<4) ? HIGH : LOW); + digital_write(_io5, data & (1<<5) ? HIGH : LOW); + digital_write(_io6, data & (1<<6) ? HIGH : LOW); + digital_write(_io7, data & (1<<7) ? HIGH : LOW); + + digital_write(_we, LOW); _delay_us(1); // min 100ns digital_write(_we, HIGH); } + +unsigned char at28c256_read(unsigned short addr) { + // just to be safe, disable write + digital_write(_we, HIGH); + + // set the output address + set_addr(addr); + + // read data + pin_mode(_io0, INPUT); + pin_mode(_io1, INPUT); + pin_mode(_io2, INPUT); + pin_mode(_io3, INPUT); + pin_mode(_io4, INPUT); + pin_mode(_io5, INPUT); + pin_mode(_io6, INPUT); + pin_mode(_io7, INPUT); + + unsigned char data = 0; + digital_write(_oe, LOW); + data |= digital_read(_io0); + data |= digital_read(_io1)<<1; + data |= digital_read(_io2)<<2; + data |= digital_read(_io3)<<3; + data |= digital_read(_io4)<<4; + data |= digital_read(_io5)<<5; + data |= digital_read(_io6)<<6; + data |= digital_read(_io7)<<7; + digital_write(_oe, HIGH); + + return data; +} diff --git a/at28c256/at28c256.h b/at28c256/at28c256.h index fd3939e..40187ba 100644 --- a/at28c256/at28c256.h +++ b/at28c256/at28c256.h @@ -3,6 +3,6 @@ void at28c256_init(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char); void at28c256_write(unsigned short, unsigned char); -//unsigned char at28c256_read(unsigned short); TODO +unsigned char at28c256_read(unsigned short); #endif diff --git a/main.c b/main.c index 1e1f652..f99cf05 100644 --- a/main.c +++ b/main.c @@ -20,11 +20,21 @@ void prepare() { serial_init(9600); at28c256_init(2, 13, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12); - at28c256_write(0x0000, 0x7B); // 123 - at28c256_write(0x0001, 0x2A); // 42 + serial_write("Writing data\n\r", 14); + at28c256_write(0, 0x7D); + at28c256_write(1, 0x12); + at28c256_write(2, 0x9F); + at28c256_write(3, 0x5A); + + serial_write("Reading data\n\r", 14); + int i; + char out[20]; + + for(i = 0; i < 4; i++) { + unsigned char value = at28c256_read(i); + const int n = sprintf(out, "0x%x\n\r", value); + serial_write(out, n); + } } -void loop() { - serial_write("Test\n\r", 6); - _delay_ms(1000); -} +void loop() {}