Блог про Arduino / Freeduino

пятница, 19 декабря 2008 г.

Библиотека i2cmaster для Arduino

Ковырялся тут с подключением по шине I2C микросхемы AD7746 от Analog Devices - это такой измеритель емкости со
встроенным датчиком температуры.
Казалось бы, проблем никаких нет - для Arduino есть стандартная библиотека TWI/I2C - бери и пользуй. Но обнаружилась в ней некоторая особенность - сразу после передачи данных она всегда переводит шину в состояние "Stop Condition".
Для некоторых устройств это никак не мешает работе, а вот чип AD7746 после получения "Stop Condition" сбрасывает внутренний указатель. А работа с этим AD7746 происходит так, что надо сначала записать в этот указатель адрес нужного регистра, а потом уже писать в него, или читать оттуда.
А получается, что я пишу в указатель адрес нужного регистра, после этого происходит "Stop Condition", микроконтроллер сбрасывается, и последующее чтение читает мне опять содержимое регистра с нулевым адресом. :(
Ну ладно, у нас же OpenSource - полез в исходники, и что-то мне пока не хватило задору научить эту библиотеку писать без "Stop Condition" - надо детальнее изучать datasheet на ATmega168.
Рыскал по интернету, нашел библиотеку i2cmaster от Peter Fleury (http://jump.to/fleury), и вот она мою проблему решила!
Пришлось только библиотеку маленько поправить для совместимости с Arduino - указал частоту 16Мгц и включение встроенных подтягивающих резисторов.
Выкладываю в общее пользование: i2cmaster_arduino.zip.
Файл нужно разархивировать в папку hardware\libraries (там должна появиться папка i2cmaster)
...может кто-то все-таки родную библиотеку соберется подшаманить?

4 комментария:

dallaskassel комментирует...

буду с нетерпением ждать описаний разных интересных штук :-)

Анонимный комментирует...

Странно как-то... Если это косяк, то уж слишком капитальный. Есть исходник этой стандартной библиотеки? Хотя бы хидер, понять какие функции в ней были.

Анонимный комментирует...

Блин, как вы вообще что-то делаете на AVR-ках:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=62915

Посмотрел исходники - мрак. Такое ощущение, что вместо прямого человеческого HW I2C взяли кусочек FPGA и заливают туда STATE машину.

id комментирует...

Гм. В итоге, вроде бы руки до модификации стандартной либы дошли у меня.

Буду благодарен за критику ;)