I2C шлюз для компьютера

Всё об интерфейсах, протоколах, подключении к МК разных устройств, подключении контроллеров к ПК...
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

:lol2: Да уж, ошибка, как говорится, была на поверхности. Для тех, кто поленится сравнивать коды, поясню:

Код: Выделить всё

rcall    Start_uslovie               ; повторный старт
ldi    BTS, 0xA1                  ; выдали адрес часов на чтение
       <------------------ вот здесь забыли вызвать Send_Byte и отправить-таки 0x0A в шину
rcall    Recieve_Byte               ; забрали байт секунд
Но готовность устройства к общению (Ack) всё-таки адо проверять (IMHO), в более сложных проектах может пригодиться.
С уважением, администрация сайта.
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: I2C шлюз для компьютера

Сообщение Arcanum »

вопрос в догонку:
надо ли сбрасывать ack на последний байт при записи в слейв?

upd: туплю. не надо.

реализовал запись. работает.
вот кусок кода:

Код: Выделить всё

ComWriteI2C:

		rcall 	Start_uslovie					; старт шины

		ldi		BTS, 0xA0				; загрузили адрес на ЗАПИСЬ
		rcall 	Send_Byte				; выдали адрес часов на запись

		ldi 	BTS, 0x02				; загрузили адрес байта
		rcall 	Send_Byte				; выдали адрес ячейки памяти байт

		rcall	Read_Buff_RX						; загрузили байт секунд из буфера
		mov 	BTS,OSRG
		rcall 	Send_Byte					; выдали байт секунд					
		
		
		rcall	Read_Buff_RX						; загрузили байт минут из буфера
		mov 	BTS,OSRG
		rcall 	Send_Byte					; выдали байт минут
		
		
		rcall	Read_Buff_RX						; загрузили байт часов из буфера
		mov 	BTS,OSRG
		rcall 	Send_Byte					; выдали байт часов
		
		rcall 	Stop_uslovie					; Стоп шины
		
						LDI		tmp2, 'W'			
						rcall 	Load_Buff_TX
						LDI		tmp2, '_'			
						rcall 	Load_Buff_TX
						LDI		tmp2, 'O'			
						rcall 	Load_Buff_TX
						LDI		tmp2, 'k'			
						rcall 	Load_Buff_TX
						TX_RUN
		
		
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

После долгих ковыряний мне всё таки удалось запихать все три варианта шлюза ( I2C, SPI и 1~Wire) в один. Плюс на остатках памяти ещё и GPIO удалось приделать.
Получилось вот так: UART to I2C/SPI/1W :)
С уважением, администрация сайта.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

Написал пару программулинок для шлюза. Одна сканирует ключи-таблетки по однопроводке, её на сайт выложил (в статье про шлюз, внизу, есть ссылка),
а другая позволяет программировать микросхемы памяти I2C. Она пока не дописана (пока может работать только с микрухами с однобайтным счётчиком), поэтому выложу сюда.
I2C_Programmer.zip
(312.82 КБ) 457 скачиваний
Вместе с USB to UART получается довольно шустрый программатор I2C EPROM. Позже ещё видосы сниму.
С уважением, администрация сайта.
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: I2C шлюз для компьютера

Сообщение Arcanum »

месяц болел, снова вернулся!)
Вопрос - как примерно реализовать многомастерность? у меня на линии и2ц одни часы к которым обращаются от 1 до 5 масетров одновременно. как тиньку обучить чтоб не мешала? слушать линию постоянно? али как?
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

Насколько я понимаю, всё происходит примерно так:
1) Начинать передачу мастер должен ни в любой момент когда попало, а только отследив состояние "свободная шина" (на обоих линиях высокий уровень дольше определённого времени)
2) Мастер должен не просто выставлять сигналы на шину, но и убеждаться, что на шине эти сигналы установились. Точнее это касается только сигнала высокого уровня. Это нужно для отслеживания коллизий, когда N мастеров начали передачу одновременно. Низкий уровень выставляется на шине жёстко, а высокий - подтягивается через резистор (выходная нога при этом переводится в Z-состояние). Соответственно, если какие-то мастера будут выставлять ноль, а какие-то - единицу, то "победят" те, кто выставляет ноль, то есть на шине установится ноль. И тогда те, кто выставлял единицу, должны увидеть, что единица не выставилась, понять, что раз так произошло - значит шиной рулит кто-то ещё и заткнуться в тряпочку (отследить состояние "свободная шина" и попробовать ещё раз) .
С уважением, администрация сайта.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

Написал отдельную статью про то, как использовать шлюз в качестве программатора I2C EPROM. Там же ссылка на новую версию программы (добавил чипов, возможность чтения/сохранения файлов) и небольшой видос, как это всё работает.
С уважением, администрация сайта.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: I2C шлюз для компьютера

Сообщение rhf-admin »

Ещё две статьи. В одной шлюз превращается в программатор SPI EPROM,
в другой - в USB-термометр с http-сервером (то есть считываемая температура доступна через браузер по сети).
Видосы прилагаются. :)
С уважением, администрация сайта.
Ответить

Вернуться в «Интерфейсы / Протоколы / Периферия»