Обмен данными с Flash памятью по I2C. Ассемблер 8051.

У Дихальта есть статья по I2C- Тыц, но рабочих примеров я в рунете не нашел. Разобравшись, решил написать сюда.

Код на асме МК51, но при желании можно легко адаптировать под любой контроллер.
Эмулятор использую этот- Тыц
Org 00h
ajmp main
;используемые пины для I2C
sda equ P0.0
scl equ P0.1

;Инициализация I2C
i2cinit:
	setb sda
	setb scl
ret

;Старт передачи I2C
startc:
	setb scl
	clr sda
	clr scl
ret

;Рестарт I2C
rstart:
	clr scl
	setb sda
	setb scl
	clr sda
ret

;Стоп передачи I2C
stop:
	clr scl
	clr sda
	setb scl
	setb sda
ret

;Передача данных I2C
send:
	mov r7,#08
	back:
	clr scl
	rlc a
	mov sda,c
	setb scl
	djnz r7,back
	clr scl
	setb sda
ret

;ответы I2C
ack:
	clr sda
	setb scl
	clr scl
	setb sda
ret

nak:
	setb sda
	setb scl
	clr scl
	setb scl
ret

;Передача данных I2C
recv:
	mov r7,#08
back2:
	clr scl
	setb scl
	mov c,sda
	rlc a
	djnz r7,back2
	clr scl
	setb sda
ret

Main:	;Основная программа

	mov R3, #10		;объем пересылаемых данных
	mov R2, #10h		;начальный адрес флеш
	mov R1, #10		;начальный адрес РПД
	
	acall i2cinit		;инициализация шины I2C

m2:	;чтение байта
	acall startc		;стартовый бит

	mov a, #10100000b	;адрес устройства
	acall send              ;передача адреса
	setb scl			;ждем ответного гудка

	mov a, R2			;адрес ячейки Flash
	acall send              ;передача адреса ячейки
	setb scl
	
	acall rstart		;рестарт
	
	mov a, #10100001b	;адрес устройства с битом чтения
	acall send              ;после рестарта опять передаём адрес устройства ,выставляя последний бит на чтение
	setb scl

	acall recv		;прием данных
	mov @R1,A			;сохраняем байт в РПД

	acall nak			;бит окончания чтения
	acall stop		;стоп бит
;конец чтения байта
	
	inc R2			;инкрементируем адреса
	inc R1

djnz R3, m2			;конец цикла чтения

m1: ajmp m1			

End




В программе реализовано побайтовое чтение Flash-памяти. Для последовательного чтения (в том числе для упрощения данного примера) необходимо отвечать ACK а не NAK и читать следующий байт. Запись проще, за адресом ячейки пишем байт данных, но перед следующей записью необходимо проверять что память нам ответила. В зависимости от типа Flash адрес ячейки может быть 2-х байтовым, тогда передаем на один адрес больше и только потом байт данных или рестарт для чтения.
  • -1
  • 18 января 2013, 16:14
  • murz85

Комментарии (3)

RSS свернуть / развернуть
Плохо искал видимо. У Белова пример работы на асме для 51го точно был. Целая книжка даже написана :)
0
> Код на асме МК51, но при желании можно легко адаптировать под любой контроллер.
Точнее написать с нуля :) ибо комментарии не особо информативные.
+1
  • avatar
  • amx
  • 18 января 2013, 17:37
Пример программного I2C под 51 и у атмела на сайте имеется. Передрал — работает. :) Правда, проверял только на запись.
Но есть же валом 51-х и с «железным» I2C на борту. NXP, Silabs…
0
  • avatar
  • Katz
  • 19 января 2013, 10:05
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.