Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- BL24C256A (8-ногый DIP/SOIC):
- Pin 1 (A0) ─── GND
- Pin 2 (A1) ─── GND
- Pin 3 (A2) ─── GND
- Pin 4 (GND) ─── GND
- Pin 5 (SDA) ─── A4
- Pin 6 (SCL) ─── A5
- Pin 7 (WP) ─── GND (разрешить запись)
- Pin 8 (VCC) ─── 5V
- // Определяем пины I2C в программном режиме
- #define SDA_PIN 4
- #define SCL_PIN 5
- #define EEPROM_ADDR 0xA0 // Адрес + бит записи (0)
- // Прототипы функций
- void i2c_init();
- void i2c_start();
- void i2c_stop();
- void i2c_write(uint8_t data);
- uint8_t i2c_read(uint8_t ack);
- uint8_t eeprom_write(uint16_t address, uint8_t data);
- uint8_t eeprom_read(uint16_t address);
- void setup() {
- Serial.begin(9600);
- i2c_init();
- Serial.println("Тест BL24C256A без библиотек");
- Serial.println("----------------------------");
- }
- void loop() {
- // Демонстрация записи и чтения
- static uint16_t address = 0x0100;
- static uint8_t counter = 0;
- // Записываем байт
- if (eeprom_write(address, counter)) {
- Serial.print("Записано: Адрес=0x");
- Serial.print(address, HEX);
- Serial.print(", Данные=0x");
- Serial.println(counter, HEX);
- // Ждем завершения внутренней записи (5ms max по даташиту)
- delay(10);
- // Читаем обратно
- uint8_t read_data = eeprom_read(address);
- Serial.print("Прочитано: 0x");
- Serial.print(read_data, HEX);
- if (read_data == counter) {
- Serial.println(" ✓ УСПЕХ");
- } else {
- Serial.println(" ✗ ОШИБКА");
- }
- } else {
- Serial.println("Ошибка записи!");
- }
- counter++;
- address = (address + 1) % 0x7FFF; // Не выходим за границы
- delay(1000);
- }
- // ============================================================================
- // НИЗКОУРОВНЕВЫЕ ФУНКЦИИ I2C (ПОБИТОВАЯ РЕАЛИЗАЦИЯ)
- // ============================================================================
- void i2c_init() {
- pinMode(SDA_PIN, INPUT);
- pinMode(SCL_PIN, INPUT);
- digitalWrite(SDA_PIN, HIGH);
- digitalWrite(SCL_PIN, HIGH);
- }
- void i2c_start() {
- pinMode(SDA_PIN, OUTPUT);
- delayMicroseconds(5);
- pinMode(SCL_PIN, OUTPUT);
- delayMicroseconds(5);
- }
- void i2c_stop() {
- pinMode(SDA_PIN, OUTPUT);
- delayMicroseconds(5);
- pinMode(SCL_PIN, INPUT);
- delayMicroseconds(5);
- pinMode(SDA_PIN, INPUT);
- delayMicroseconds(5);
- }
- void i2c_write(uint8_t data) {
- for (uint8_t i = 0; i < 8; i++) {
- pinMode(SDA_PIN, (data & 0x80) ? INPUT : OUTPUT);
- data <<= 1;
- delayMicroseconds(2);
- pinMode(SCL_PIN, INPUT);
- delayMicroseconds(5);
- pinMode(SCL_PIN, OUTPUT);
- delayMicroseconds(2);
- }
- // Чтение ACK
- pinMode(SDA_PIN, INPUT);
- delayMicroseconds(2);
- pinMode(SCL_PIN, INPUT);
- delayMicroseconds(5);
- pinMode(SCL_PIN, OUTPUT);
- delayMicroseconds(2);
- }
- uint8_t i2c_read(uint8_t ack) {
- uint8_t data = 0;
- pinMode(SDA_PIN, INPUT);
- for (uint8_t i = 0; i < 8; i++) {
- data <<= 1;
- delayMicroseconds(2);
- pinMode(SCL_PIN, INPUT);
- delayMicroseconds(3);
- if (digitalRead(SDA_PIN)) data |= 1;
- delayMicroseconds(2);
- pinMode(SCL_PIN, OUTPUT);
- delayMicroseconds(2);
- }
- // Отправка ACK/NACK
- pinMode(SDA_PIN, ack ? INPUT : OUTPUT);
- delayMicroseconds(2);
- pinMode(SCL_PIN, INPUT);
- delayMicroseconds(5);
- pinMode(SCL_PIN, OUTPUT);
- delayMicroseconds(2);
- pinMode(SDA_PIN, INPUT);
- return data;
- }
- // ============================================================================
- // ФУНКЦИИ ДЛЯ РАБОТЫ С EEPROM
- // ============================================================================
- uint8_t eeprom_write(uint16_t address, uint8_t data) {
- i2c_start();
- // Отправка адреса устройства + бит записи
- i2c_write(EEPROM_ADDR & 0xFE); // 0xA0 = 10100000, сбрасываем бит чтения
- // Отправка 2-байтового адреса памяти (старший байт первый)
- i2c_write((address >> 8) & 0xFF); // Старший байт адреса
- i2c_write(address & 0xFF); // Младший байт адреса
- // Отправка данных
- i2c_write(data);
- i2c_stop();
- return 1; // Успех
- }
- uint8_t eeprom_read(uint16_t address) {
- // Сначала устанавливаем указатель - запись адреса
- i2c_start();
- i2c_write(EEPROM_ADDR & 0xFE); // Режим записи
- i2c_write((address >> 8) & 0xFF); // Старший байт адреса
- i2c_write(address & 0xFF); // Младший байт адреса
- // Теперь читаем данные
- i2c_start();
- i2c_write(EEPROM_ADDR | 0x01); // Режим чтения (0xA1)
- uint8_t data = i2c_read(0); // Чтение с NACK (последний байт)
- i2c_stop();
- return data;
- }
Advertisement
Add Comment
Please, Sign In to add comment