dllbridge

A29040

Sep 28th, 2025 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <unistd.h>
  4.  
  5. // Адреса регистров для программирования A29040B
  6. #define COMMAND_REGISTER  0x5555
  7. #define COMMAND_REGISTER2 0x2AAA
  8. #define DATA_REGISTER     0x0000
  9.  
  10. // Команды для программирования
  11. #define CMD_UNLOCK1       0xAA
  12. #define CMD_UNLOCK2       0x55
  13. #define CMD_PROGRAM       0xA0
  14. #define CMD_ERASE         0x80
  15. #define CMD_CHIP_ERASE    0x10
  16. #define CMD_SECTOR_ERASE  0x30
  17. #define CMD_RESET         0xF0
  18.  
  19. // Функция для записи байта в память
  20. void write_byte(uint32_t address, uint8_t data) {
  21.     // Разблокировка последовательности
  22.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_UNLOCK1;
  23.     *((volatile uint8_t*)COMMAND_REGISTER2) = CMD_UNLOCK2;
  24.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_PROGRAM;
  25.    
  26.     // Запись данных
  27.     *((volatile uint8_t*)address) = data;
  28.    
  29.     // Ожидание завершения программирования
  30.     while ((*((volatile uint8_t*)address) & 0x80) != (data & 0x80));
  31. }
  32.  
  33. // Функция стирания сектора
  34. void erase_sector(uint32_t sector_address) {
  35.     // Разблокировка последовательности
  36.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_UNLOCK1;
  37.     *((volatile uint8_t*)COMMAND_REGISTER2) = CMD_UNLOCK2;
  38.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_ERASE;
  39.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_UNLOCK1;
  40.     *((volatile uint8_t*)COMMAND_REGISTER2) = CMD_UNLOCK2;
  41.    
  42.     // Стирание сектора
  43.     *((volatile uint8_t*)sector_address) = CMD_SECTOR_ERASE;
  44.    
  45.     // Ожидание завершения стирания
  46.     while ((*((volatile uint8_t*)sector_address) & 0x80) != 0x80);
  47. }
  48.  
  49. // Функция полного стирания чипа
  50. void chip_erase(void) {
  51.     // Разблокировка последовательности
  52.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_UNLOCK1;
  53.     *((volatile uint8_t*)COMMAND_REGISTER2) = CMD_UNLOCK2;
  54.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_ERASE;
  55.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_UNLOCK1;
  56.     *((volatile uint8_t*)COMMAND_REGISTER2) = CMD_UNLOCK2;
  57.    
  58.     // Стирание всего чипа
  59.     *((volatile uint8_t*)COMMAND_REGISTER) = CMD_CHIP_ERASE;
  60.    
  61.     // Ожидание завершения стирания
  62.     while ((*((volatile uint8_t*)DATA_REGISTER) & 0x80) != 0x80);
  63. }
  64.  
  65. // Функция чтения байта из памяти
  66. uint8_t read_byte(uint32_t address) {
  67.     return *((volatile uint8_t*)address);
  68. }
  69.  
  70. // Функция сброса в режим чтения
  71. void reset_to_read_mode(void) {
  72.     *((volatile uint8_t*)DATA_REGISTER) = CMD_RESET;
  73. }
  74.  
  75. // Пример использования
  76. int main() {
  77.     uint32_t address = 0x1000;  // Адрес для записи
  78.     uint8_t data_to_write = 0xAB;
  79.     uint8_t read_back_data;
  80.    
  81.     printf("Программа для работы с A29040B-70\n");
  82.    
  83.     // Сброс в режим чтения
  84.     reset_to_read_mode();
  85.    
  86.     // Чтение исходных данных
  87.     printf("Чтение данных по адресу 0x%04X: 0x%02X\n",
  88.            address, read_byte(address));
  89.    
  90.     // Стирание сектора (если необходимо)
  91.     printf("Стирание сектора...\n");
  92.     erase_sector(address & 0xFFF0);  // Выравнивание по границе сектора
  93.    
  94.     // Запись данных
  95.     printf("Запись данных 0x%02X по адресу 0x%04X...\n",
  96.            data_to_write, address);
  97.     write_byte(address, data_to_write);
  98.    
  99.     // Чтение для проверки
  100.     read_back_data = read_byte(address);
  101.     printf("Прочитано обратно: 0x%02X\n", read_back_data);
  102.    
  103.     // Проверка результата
  104.     if (read_back_data == data_to_write) {
  105.         printf("Запись успешна!\n");
  106.     } else {
  107.         printf("Ошибка записи!\n");
  108.     }
  109.    
  110.     // Возврат в режим чтения
  111.     reset_to_read_mode();
  112.    
  113.     return 0;
  114. }
  115.  
  116.  
  117.  
  118.  
  119. /////////////////////////
  120.  AMD/Fujitsu 29-серия (прямые аналоги)
  121.  
  122. · AM29F010 (128K x 8)
  123. · AM29F040 (512K x 8)
  124. · AM29F080 (1M x 8)
  125. · AM29F016 (2M x 8)
  126.  
  127. 2. SST 39-серия (совместимы по командам)
  128.  
  129. · SST39SF010 (128K x 8)
  130. · SST39SF020 (256K x 8)
  131. · SST39SF040 (512K x 8)
  132.  
  133. 3. Atmel 29/49-серия
  134.  
  135. · AT29C010 (128K x 8)
  136. · AT29C020 (256K x 8)
  137. · AT29C040 (512K x 8)
  138. · AT49F001 (128K x 8)
  139. · AT49F002 (256K x 8)
  140.  
  141. 4. Macronix 29-серия
  142.  
  143. · MX29F001 (128K x 8)
  144. · MX29F002 (256K x 8)
  145. · MX29F004 (512K x 8)
  146.  
  147. 5. Winbond 29/39-серия
  148.  
  149. · W29EE011 (128K x 8)
  150. · W29C010 (128K x 8)
  151. · W39L010 (128K x 8)
  152.  
Tags: A29040
Advertisement
Add Comment
Please, Sign In to add comment