dllbridge

24c256

Oct 3rd, 2025
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.16 KB | None | 0 0
  1.  
  2.  
  3. BL24C256A (8-ногый DIP/SOIC):
  4.     Pin 1 (A0)  ─── GND
  5.     Pin 2 (A1)  ─── GND  
  6.     Pin 3 (A2)  ─── GND
  7.     Pin 4 (GND) ─── GND
  8.     Pin 5 (SDA) ─── A4
  9.     Pin 6 (SCL) ─── A5
  10.     Pin 7 (WP)  ─── GND (разрешить запись)
  11.     Pin 8 (VCC) ─── 5V
  12.  
  13.  
  14. // Определяем пины I2C в программном режиме
  15. #define SDA_PIN 4
  16. #define SCL_PIN 5
  17. #define EEPROM_ADDR 0xA0  // Адрес + бит записи (0)
  18.  
  19. // Прототипы функций
  20. void i2c_init();
  21. void i2c_start();
  22. void i2c_stop();
  23. void i2c_write(uint8_t data);
  24. uint8_t i2c_read(uint8_t ack);
  25. uint8_t eeprom_write(uint16_t address, uint8_t data);
  26. uint8_t eeprom_read(uint16_t address);
  27.  
  28. void setup() {
  29.   Serial.begin(9600);
  30.   i2c_init();
  31.  
  32.   Serial.println("Тест BL24C256A без библиотек");
  33.   Serial.println("----------------------------");
  34. }
  35.  
  36. void loop() {
  37.   // Демонстрация записи и чтения
  38.   static uint16_t address = 0x0100;
  39.   static uint8_t counter = 0;
  40.  
  41.   // Записываем байт
  42.   if (eeprom_write(address, counter)) {
  43.     Serial.print("Записано: Адрес=0x");
  44.     Serial.print(address, HEX);
  45.     Serial.print(", Данные=0x");
  46.     Serial.println(counter, HEX);
  47.    
  48.     // Ждем завершения внутренней записи (5ms max по даташиту)
  49.     delay(10);
  50.    
  51.     // Читаем обратно
  52.     uint8_t read_data = eeprom_read(address);
  53.    
  54.     Serial.print("Прочитано: 0x");
  55.     Serial.print(read_data, HEX);
  56.    
  57.     if (read_data == counter) {
  58.       Serial.println(" ✓ УСПЕХ");
  59.     } else {
  60.       Serial.println(" ✗ ОШИБКА");
  61.     }
  62.   } else {
  63.     Serial.println("Ошибка записи!");
  64.   }
  65.  
  66.   counter++;
  67.   address = (address + 1) % 0x7FFF; // Не выходим за границы
  68.  
  69.   delay(1000);
  70. }
  71.  
  72. // ============================================================================
  73. // НИЗКОУРОВНЕВЫЕ ФУНКЦИИ I2C (ПОБИТОВАЯ РЕАЛИЗАЦИЯ)
  74. // ============================================================================
  75.  
  76. void i2c_init() {
  77.   pinMode(SDA_PIN, INPUT);
  78.   pinMode(SCL_PIN, INPUT);
  79.   digitalWrite(SDA_PIN, HIGH);
  80.   digitalWrite(SCL_PIN, HIGH);
  81. }
  82.  
  83. void i2c_start() {
  84.   pinMode(SDA_PIN, OUTPUT);
  85.   delayMicroseconds(5);
  86.   pinMode(SCL_PIN, OUTPUT);
  87.   delayMicroseconds(5);
  88. }
  89.  
  90. void i2c_stop() {
  91.   pinMode(SDA_PIN, OUTPUT);
  92.   delayMicroseconds(5);
  93.   pinMode(SCL_PIN, INPUT);
  94.   delayMicroseconds(5);
  95.   pinMode(SDA_PIN, INPUT);
  96.   delayMicroseconds(5);
  97. }
  98.  
  99. void i2c_write(uint8_t data) {
  100.   for (uint8_t i = 0; i < 8; i++) {
  101.     pinMode(SDA_PIN, (data & 0x80) ? INPUT : OUTPUT);
  102.     data <<= 1;
  103.     delayMicroseconds(2);
  104.     pinMode(SCL_PIN, INPUT);
  105.     delayMicroseconds(5);
  106.     pinMode(SCL_PIN, OUTPUT);
  107.     delayMicroseconds(2);
  108.   }
  109.  
  110.   // Чтение ACK
  111.   pinMode(SDA_PIN, INPUT);
  112.   delayMicroseconds(2);
  113.   pinMode(SCL_PIN, INPUT);
  114.   delayMicroseconds(5);
  115.   pinMode(SCL_PIN, OUTPUT);
  116.   delayMicroseconds(2);
  117. }
  118.  
  119. uint8_t i2c_read(uint8_t ack) {
  120.   uint8_t data = 0;
  121.   pinMode(SDA_PIN, INPUT);
  122.  
  123.   for (uint8_t i = 0; i < 8; i++) {
  124.     data <<= 1;
  125.     delayMicroseconds(2);
  126.     pinMode(SCL_PIN, INPUT);
  127.     delayMicroseconds(3);
  128.     if (digitalRead(SDA_PIN)) data |= 1;
  129.     delayMicroseconds(2);
  130.     pinMode(SCL_PIN, OUTPUT);
  131.     delayMicroseconds(2);
  132.   }
  133.  
  134.   // Отправка ACK/NACK
  135.   pinMode(SDA_PIN, ack ? INPUT : OUTPUT);
  136.   delayMicroseconds(2);
  137.   pinMode(SCL_PIN, INPUT);
  138.   delayMicroseconds(5);
  139.   pinMode(SCL_PIN, OUTPUT);
  140.   delayMicroseconds(2);
  141.   pinMode(SDA_PIN, INPUT);
  142.  
  143.   return data;
  144. }
  145.  
  146. // ============================================================================
  147. // ФУНКЦИИ ДЛЯ РАБОТЫ С EEPROM
  148. // ============================================================================
  149.  
  150. uint8_t eeprom_write(uint16_t address, uint8_t data) {
  151.   i2c_start();
  152.  
  153.   // Отправка адреса устройства + бит записи
  154.   i2c_write(EEPROM_ADDR & 0xFE); // 0xA0 = 10100000, сбрасываем бит чтения
  155.  
  156.   // Отправка 2-байтового адреса памяти (старший байт первый)
  157.   i2c_write((address >> 8) & 0xFF);   // Старший байт адреса
  158.   i2c_write(address & 0xFF);          // Младший байт адреса
  159.  
  160.   // Отправка данных
  161.   i2c_write(data);
  162.  
  163.   i2c_stop();
  164.  
  165.   return 1; // Успех
  166. }
  167.  
  168. uint8_t eeprom_read(uint16_t address) {
  169.   // Сначала устанавливаем указатель - запись адреса
  170.   i2c_start();
  171.   i2c_write(EEPROM_ADDR & 0xFE);     // Режим записи
  172.   i2c_write((address >> 8) & 0xFF);  // Старший байт адреса
  173.   i2c_write(address & 0xFF);         // Младший байт адреса
  174.  
  175.   // Теперь читаем данные
  176.   i2c_start();
  177.   i2c_write(EEPROM_ADDR | 0x01);     // Режим чтения (0xA1)
  178.  
  179.   uint8_t data = i2c_read(0);        // Чтение с NACK (последний байт)
  180.  
  181.   i2c_stop();
  182.  
  183.   return data;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment