Первоначальная настройка датчика на шине TWI

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

Сообщение x8973 »

Всем доброго времени суток. Копаюсь с цифровым акселерометром MMA7660. Как большинство цифровых датчиков, он требует настройки перед запуском измерений. Скачав скетч для Ардуино, нашел в нем такой алгоритм настройки:

1. записать в регистр 0x07 байт 0x00 (Перевод в режим StandBy, начало настройки)
2. записать в регистр 0х06 байт 0х10
3. записать в регистр 0х08 байт 0х00 (120 сэмплов, режим автоматического засыпания)
4. записать в регистр 0х07 байт 0х01 (Перевод в режим ActiveMode, начало измерений)

Собственно, вопрос у меня один - как записать байт в конкретный регистр? Как считать из определенного регистра - знаю.
Считывание содержимого регистров датчика делаю следующим образом:

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

ISR(TWI_vect)
{
	switch (TWSR & 0xF8)
	{
		case 0x08: //На шине кто-то есть. Передать адрес для записи.
		{
			TWDR = 0x98;
			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWIE);
			break;
		}
		case 0x18: //Устройство ответило. Передать адрес памяти.
		{
			TWDR = 0x00;
			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWIE);
			break;
		}
		case 0x28: //Устройство передало подтверждение. Сброс шины.
		{
			TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA);
			break;
		}
		case 0x10: //На шине кто-то есть. Передать адрес для чтения.
		{
			TWDR = 0x99;
			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWIE);
			break;
		}
		case 0x40: //Устройство готово. Передать команду к началу передачи данных.
		{
			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
			break;
		}
		case 0x50: //Пришли данные. Прочитать байт и передать ACK или NACK.
		{
			USART_Transmit(TWDR);
			byte_cnt++;
			if (byte_cnt < 10)
				TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
			else
				TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWIE);
			break;
		}
		case 0x58: //Пришли данные. Прочитать байт и сформировать STOP.
		{
			//USART_Transmit(0x06);
			USART_Transmit(TWDR);
			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO)|(1<<TWIE);
			byte_cnt = 0;
			break;
		}
	}
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20102
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

x8973 писал(а):как записать байт в конкретный регистр
Также как и считать — выставить адрес перед записью.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

Сообщение x8973 »

То есть по статусу 0х18 передаем адрес ячейки, затем попадаем в статус 0х28, передаем байт данных, снова попадаем в 0х18, и теперь завершаем работу? Или после передачи адреса нужно делать ПОВСТАРТ, и потом снова запускаться в режиме "Ведущий-передатчик"?
Друг Кота
Аватара пользователя
Сообщения: 20102
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

x8973 писал(а):Или после передачи адреса нужно делать ПОВСТАРТ, и потом снова запускаться в режиме "Ведущий-передатчик"?
Это всё расписано и разрисовано в ДШ на контроллер.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

Сообщение x8973 »

В ДШ, а точнее в книжке Евстифеева, ничего не сказано про передачу адреса ячейки для записи. Так же как и про передачу адреса для чтения. Там расписаны коды статуса шины и возможные варианты реакции на эти статусы.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20102
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

x8973 писал(а):книжке Евстифеева
Это просто обобщённый перевод даташитов. Читайте первоисточник.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Ответить

Вернуться в «Периферия»