Компания Microchip выпускает широкий спектр
недорогой энергонезависимой памяти с последовательным интерфейсом I2C. Емкость
этих EEPROM начинается со 128 бит и может достигать 256 и более кбит, что
позволяет применять ее в различных областях электроники. И хотя сейчас многие
микроконтроллеры имеют EEPROM данных на своем кристалле, ее может оказаться
недостаточно. Поэтому в некоторых случаях применение внешней памяти будет вполне
оправданно (примеры применения данных микросхем имеются и на этом сайте).
Полное описание технических
характеристик EEPROM можно найти на сайте
производителя, а на этой странице приведены лишь тексты подпрограмм для
работы с данными микросхемами. Подпрограммы написаны для PIC-контроллеров и
позволяют производить запись или чтение одного байта по заданному адресу EEPROM.
Эти подпрограммы применимы для работы с микросхемами емкостью до 16 кбит. Для
больших емкостей необходимо приведенные ниже подпрограммы модифицировать таким
образом, что бы адрес ячейки памяти передавался двумя байтами. Так же, если за
один цикл необходимо считать/записать более одного байта, то нижеприведенные
подпрограммы так же необходимо
модифицировать. В том случае, если в
микроконтроллере имеется аппаратная поддержка I2C, то можно воспользоваться
подпрограммами, приведенными здесь.
Текст программы:
LIST p=16c505,
r=hex include P16C505.INC
cblock 0x08 ;Регистры
AddrLo ;Младший байт адреса в
EEPROM
AddrHi ;Старший байт адреса в EEPROM
Cnt
;Счетчик
Temp
;Регистры для хранения переменных разного
назначения
TempTr ;
endc
;Константы для инициализации InitOption equ b'00000000' InitPortC equ
b'00000000' InitPortB equ b'00000000'
SDARecPortC equ b'00010000' ;Константа для переключения линии SDA на вход
#define SCL PORTC,3 #define SDA PORTC,4
goto Begin
Init ;Общая инициализация movlw
InitPortB ; tris PORTB
; movlw InitPortC
; tris PORTC
; movlw InitOption
; option
; return ;
SwReceive ;Переключение SDA на вход
movlw SDARecPortC tris
PORTB return
Transmitt movwf TempTr
; bsf SDA
; call Init ;Переключить линию для
передачи
bcf SDA
;Start bcf SCL ;
bcf STATUS,C ;Передача байта управления
rlf AddrHi,0 ;и трех старших бит
адреса iorlw b'10100000'
; call SendByte ;
call SwReceive ;Переключить линию для
приема подтверждения
bsf SCL ;Прием
подтверждения btfsc SDA
; goto Transmitt ;Подтверждение
отсутствует bcf SCL ;
call Init ;Переключить на передачу
movf AddrLo,0 ;Передать младший байт
адреса call SendByte
; call SwReceive ;Переключить линию для
приема подтверждения
bsf SCL ;прием
подтверждения btfsc SDA
; goto Transmitt ;Подтверждение
отсутствует bcf SCL ;
call Init ;Переключить на передачу
movf TempTr,0 ;Передача
байта call SendByte
; call SwReceive ;Переключить линию для
приема подтверждения
bsf SCL ;Прием
подтверждения btfsc SDA
; goto Transmitt ;Подтверждение
отсутствует bcf SCL ;
call Init ;Переключить на передачу
bcf SDA
;Stop bsf SCL
; bsf SDA ;
return
SendByte ;Подпрограмма передачи одного
байта movwf
Temp movlw
0x8 movwf
Cnt SendBt
clrwdt bcf
SDA rlf
Temp,1 btfsc
STATUS,C bsf
SDA bsf
SCL bcf
SCL decfsz
Cnt,1 goto
SendBt return
Receive bsf SDA
; call Init ;Переключить на передачу
bcf SDA
;Start bcf SCL ;
bcf STATUS,C ;Передача байта управления
rlf AddrHi,0 ;и трех старших бит
адреса iorlw b'10100000'
; call SendByte ;
call SwReceive ;Переключить на прием
bsf SCL ;Прием
подтверждения btfsc SDA
; goto Receive ;Подтверждение
отсутствует bcf SCL ;
call Init ;Переключить на передачу
movf AddrLo,0 ;Передать младший байт
адреса call SendByte
; call SwReceive ;Переключить на прием
bsf SCL ;Прием
подтвержедния btfsc SDA
; goto Receive ;Подтверждение
отсутствует bcf SCL ;
call Init ;Переключить на передачу
bsf SDA ;Повторный
Start bsf SCL
; bcf SDA
; bcf SCL ;
bsf STATUS,C ;Передача байта управления
rlf AddrHi,0 ;и трех старших бит
адреса iorlw b'10100000'
; call SendByte
; call SwReceive ;Переключить на прием
bsf SCL ;прием
подтверждения btfsc SDA
; goto Receive ;Подтверждение
отсутствует bcf SCL ;
call ReceiveByte ;Прием байта
bcf SDA
; call Init ;Переключить на передачу
bsf SCL ;Передача
подтверждения bsf SDA
;Stop return
ReceiveByte ;Подпрограмма приема одного
байта movlw
0x8 movwf
Cnt ReceiveBt
clrwdt bsf
SCL bcf
STATUS,C btfsc
SDA bsf
STATUS,C rlf
Temp,1 bcf
SCL decfsz
Cnt,1 goto
ReceiveBt movf
Temp,0 movwf
TempTr return
Begin ;Пример использования подпрограмм:
movlw 0xbc ;Запись значения 0x55 по
адресу 0x2bc movwf AddrLo ;
movlw 0x02
; movwf AddrHi ;
movlw 0x55
; call Transmitt ;
movlw 0xbc ;Чтение байта по адресу
0x2bc movwf AddrLo ;
movlw 0x02
; movwf AddrHi ;
call Receive ;Полученное значение будет
в регистре w
goto $
end
|