Исследование внешней EEPROM типа AT24Cxx и 24LCxx
Исследование внешней EEPROM типа AT24Cxx и 24LCxx
Сообщений 1 страница 9 из 9
Поделиться22014-01-18 06:00:21
Побайтовая запись, чтение и стирание переменных типа "Long (DWord)" в EEPROM 24LC64
Исходник (Bascom 2.0.7.1) + эмуляция (Протеус 7.10) - скачать
Поделиться32014-01-18 06:00:46
$map ' Получаем карту распределения памяти
$regfile = "m8def.dat" ' Используемый контроллер
$crystal = 1000000 ' 1 МГц
$framesize = 32 'размер области используемой и необходимой для преобразований
$hwstack = 40 ' Размер аппаратного стека
$swstack = 16 ' Размер программного стека
$baud = 4800 '4800 '9600 '19200 '38400Dim Цикл As Byte
Dim Переменная_для_записи_byte(4) As Byte
Dim Переменная_для_записи_long As Long At Переменная_для_записи_byte OverlayDim Переменная_для_чтения_long As Long
Dim Переменная_для_чтения_byte(4) As Byte At Переменная_для_чтения_long OverlayDo
Incr Переменная_для_записи_long
For Цикл = 1 To 4
Print Переменная_для_записи_byte(цикл) ; " ";
Переменная_для_чтения_byte(цикл) = Переменная_для_записи_byte(цикл)
Next Цикл
Print ""
Print ""Print Переменная_для_чтения_long
Print ""Waitms 10
Loop
End
Вместо Print вставте запись или чтение EEPROM
Поделиться42014-01-18 06:02:19
Исследование EEPROM AT24Cxx
Есть такая платка
На ней кроме Ds1307 стоит EEPROM AT24C32, и все это за 2$.
Исследование работы с EEPROM AT24C32. Постраничная и побайтная запись. В Протеус почему-то отказалась работать при 32 байт на страницу, в железе работает.
Эмуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться52015-03-08 05:33:56
Всем Доброго Здоровья!
Архивы перезалиты 07.03.2015
Поделиться62015-07-25 16:15:13
Работа с EEPROM вынесена в подпрограммы и функции
'===============================================================================
$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m328pdef.dat" 'Документация Atmel - http://www.atmel.com/images/Atmel-8271- … mplete.pdf
$crystal = 8000000
$framesize = 32 ' Размер области используемой и необходимой для преобразований
$hwstack = 40 ' Размер аппаратного стека
$swstack = 16 ' Размер программного стека$baud = 4800 : Ucsr0a.1 = 1 ' Двойная скорость работы USART, скорость трансляции = $baud * 2
'===============================================================================
' Настраиваем шину I2c
'===============================================================================
Config Sda = Portc.4 ' Конфигурация порта для SDA
Config Scl = Portc.5 ' Конфигурация порта для SCL
Config I2cdelay = 1 ' Задержка I2c 10 - 100кгц , 5 - 200кгц , 2 - 500кгц , 1 - 1мгц " - для стабильной работы чем длиннее провода тем меньше частота"
I2cinit ' Инициализация шины i2c'===============================================================================
' Конфигурация внешней EEPROM 24LCxxx
'===============================================================================
Const Lc24xxx_запись = &HA0 ' Адрес чтения EEPROM
Const Lc24xxx_чтение = &HA1 ' Адрес записи EEPROMDim Буфер_чтения_24lcxxx_low_byte As Byte
Dim Буфер_чтения_24lcxxx_high_byte As ByteDim Буфер_записи_24lcxxx_byte As Byte
Dim Буфер_записи_24lcxxx_word As Word
Dim Буфер_записи_24lcxxx_low_byte As Byte At Буфер_записи_24lcxxx_word Overlay
Dim Буфер_записи_24lcxxx_high_byte As Byte At Буфер_записи_24lcxxx_word + 1 OverlayDim Адрес_ячейки_24lcxxx_word As Word
Dim Адрес_ячейки_24lcxxx_low As Byte At Адрес_ячейки_24lcxxx_word Overlay
Dim Адрес_ячейки_24lcxxx_high As Byte At Адрес_ячейки_24lcxxx_word + 1 Overlay'Используемые подпрограммы и функции
Declare Function Read_lc24xxx_byte(byval Copy_adress_word As Word) As Byte
Declare Function Read_lc24xxx_word(byval Copy_adress_word As Word) As Word
Declare Sub Write_lc24xxx_byte(byval Copy_adress_word As Word , Byval Copy_data_byte As Byte)
Declare Sub Write_lc24xxx_word(byval Copy_adress_word As Word , Byval Copy_data_word As Word)'===============================================================================
' И С П О Л Ь З У Е М Ы Е П О Д П Р О Г Р А М М Ы
'===============================================================================Dim Адрес_word As Word
Dim Переменная_byte As Byte
Dim Переменная_word As Word'-------------- Разрешаем работу необходимых прерываний ----------------------
'------------ Разрешаем работу всех включенных прерываний --------------------
' Enable Interrupts
'===============================================================================
' Г Л А В Н Ы Й Ц И К Л
Главный_цикл:
'===============================================================================
nopПеременная_byte = Read_lc24xxx_byte(адрес_word)
Переменная_word = Read_lc24xxx_word(адрес_word)
Write_lc24xxx_byte Адрес_word , Переменная_byte
Write_lc24xxx_word Адрес_word , Переменная_word
' Waitms 250
'Power Adcnoise - нельзя использовать по причине неработы прерываний INT0 (смотреть документацию с.39 (Power Managementand Sleep Modes))
' Idle
'===============================================================================
Goto Главный_цикл
End
' П О Д П Р О Г Р А М М Ы
'==============================================================================='===============================================================================
Sub Write_lc24xxx_byte(byval Copy_adress_word As Word , Byval Copy_data_byte As Byte)
'-------------------------------------------------------------------------------
Адрес_ячейки_24lcxxx_word = Copy_adress_word
Буфер_записи_24lcxxx_byte = Copy_data_byteI2cstart ' Стартуем
I2cwbyte Lc24xxx_запись ' Адресное обращение к микросхеме
I2cwbyte Адрес_ячейки_24lcxxx_high ' Отправляем старший байт адреса ячейки памяти
I2cwbyte Адрес_ячейки_24lcxxx_low ' Отправляем младший байт адреса ячейки памяти
I2cwbyte Буфер_записи_24lcxxx_byte ' Записываемый в EEPROM байт
I2cstop ' Освобождаем шину I2cGosub Подтвержение_записи_lc24xxx
'-------------------------------------------------------------------------------
End Sub
'==============================================================================='===============================================================================
Sub Write_lc24xxx_word(byval Copy_adress_word As Word , Byval Copy_data_word As Word)
'-------------------------------------------------------------------------------
Адрес_ячейки_24lcxxx_word = Copy_adress_word
Буфер_записи_24lcxxx_word = Copy_data_wordI2cstart ' Стартуем
I2cwbyte Lc24xxx_запись ' Адресное обращение к микросхеме
I2cwbyte Адрес_ячейки_24lcxxx_high ' Отправляем старший байт адреса ячейки памяти
I2cwbyte Адрес_ячейки_24lcxxx_low ' Отправляем младший байт адреса ячейки памяти
I2cwbyte Буфер_записи_24lcxxx_high_byte ' Записываемый в EEPROM байт
I2cwbyte Буфер_записи_24lcxxx_low_byte ' Записываемый в EEPROM байт
I2cstop ' Освобождаем шину I2cGosub Подтвержение_записи_lc24xxx
'-------------------------------------------------------------------------------
End Sub
'==============================================================================='===============================================================================
Function Read_lc24xxx_byte(byval Copy_adress_word As Word) As Byte
'-------------------------------------------------------------------------------
Адрес_ячейки_24lcxxx_word = Copy_adress_wordI2cstart ' Стартуем
I2cwbyte Lc24xxx_запись ' Адресное обращение к микросхеме
I2cwbyte Адрес_ячейки_24lcxxx_high
I2cwbyte Адрес_ячейки_24lcxxx_low
I2crepstart ' Аналог команды "I2cstop-I2cstart", можно просто "I2cstart", но так надежнее
I2cwbyte Lc24xxx_чтение ' Адресное обращение к микросхеме
I2crbyte Буфер_чтения_24lcxxx_low_byte , Nack ' Считанный из EEPROM байт
I2cstop ' Освобождаем шину I2cRead_lc24xxx_byte = Буфер_чтения_24lcxxx_low_byte
'-------------------------------------------------------------------------------
End Function
'==============================================================================='===============================================================================
Function Read_lc24xxx_word(byval Copy_adress_word As Word) As Word
'-------------------------------------------------------------------------------
Адрес_ячейки_24lcxxx_word = Copy_adress_wordI2cstart ' Стартуем
I2cwbyte Lc24xxx_запись ' Адресное обращение к микросхеме
I2cwbyte Адрес_ячейки_24lcxxx_high
I2cwbyte Адрес_ячейки_24lcxxx_low
I2crepstart ' Аналог команды "I2cstop-I2cstart", можно просто "I2cstart", но так надежнее
I2cwbyte Lc24xxx_чтение ' Адресное обращение к микросхеме
I2crbyte Буфер_чтения_24lcxxx_high_byte , Ack ' Считанный из EEPROM байт
I2crbyte Буфер_чтения_24lcxxx_low_byte , Nack ' Считанный из EEPROM байт
I2cstop ' Освобождаем шину I2cRead_lc24xxx_word = Makeint(буфер_чтения_24lcxxx_low_byte , Буфер_чтения_24lcxxx_high_byte)
'-------------------------------------------------------------------------------
End Function
'==============================================================================='===============================================================================
Подтвержение_записи_lc24xxx: ' Подпрограмма для подтверждения записи данных в EEPROM
'-------------------------------------------------------------------------------
I2cstart ' Стартуем
I2cwbyte Lc24xxx_запись ' Адресное обращение к микросхеме
If Err = 1 Then
Goto Подтвержение_записи_lc24xxx ' Ждем подтверждения окончания записи EEPROM
End If
'-------------------------------------------------------------------------------
Return
'===============================================================================
Поделиться72022-02-26 18:12:02
приветствую всех!
Наверное, вопрос больше к Александру:
Есть массив данных, он не кратен "страницам" памяти EEPROM (примерно 180 байт будет).
Нельзя последовательную запись данных, если в процессе записи я пересекаю "страницу"?
Из даташита на 24c512
Instead, after the EEPROM acknowledges receipt of the first data word, the microcontroller can transmit up to 127 more data words
When the word address, internally generated, reaches the page boundary, the following byte is placed at the beginning of the same page. If more than 128 data words are transmitted to the EEPROM, the data word address will roll-over,
and the previous data will be overwritten. The address roll over during write is from the last byte of the current page to the first byte of the same page.
Я так понимаю, подряд можно писать только 127 байт? Иначе перезапишется вся текущая страница?
Поделиться82022-03-12 09:43:23
Я так понимаю, подряд можно писать только 127 байт? Иначе перезапишется вся текущая страница?
Писать можно постранично или побайтно
Если побайтно, то сначала указывается адрес записываемой ячейки, затем записываемые данные.
Если постранично, то сначала указывается адрес записываемой страницы, затем записываемые данные, перезапись сразу всей страницы, т.е. предыдущие данные будут утеряны.
Поделиться92022-03-12 10:34:53
понятно,
я так и переделал...







