Как переиницилизировать шину i2c (SDA) в 1-Wire?

krepton85
Offline
Зарегистрирован: 02.02.2016

Собственно проблема такая, работаю с MEGA 2560 хочу что бы на 20 пине (SDA для i2c) так же можно было использовать 1-wire устройство. 

Если сразу же после загрузки Меги использовать 1-wire устройство , а затем i2c то все отлично работает, но если наоборот: сначало I2C затем 1-Wire, то 1-Wire уже не работает. Пробовал даже перед каждым использованием 1-wire по новой его иницилизировать OneWire ds(20);//для 1-wire чипов 20 пин данных (он же SDA для I2C), но ничего не выходит. Хотя в моей схеме есть еще немного др. аппаратное решение, думаю сработает, но все же, может кто знает, как сделать по нормальному?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетч у Вас, как всегда секртеный, но мой хрустальный шар подсказывает, что когда Вы используете I2C, Вы забываете его потом выключить. В этом случае он подминает свои пины под себя и не даёт их использовать обычным образом.

Чтобы выключить I2C и получить пины в своё пользование, нужно записать 0 в бит TWEN регистра TWCR. 

Делается ли это в библиотеке (и как) ищите сами, я библиотекой почти не пользуюсь и не знаю.

krepton85
Offline
Зарегистрирован: 02.02.2016

Думаю что, как раз в этом и проблемма, библиатека не имеет такой функции как отключить (остановить) i2c.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

krepton85 пишет:

Думаю что, как раз в этом и проблемма, библиатека не имеет такой функции как отключить (остановить) i2c.

Цитирую Евгения: "нужно записать 0 в бит TWEN регистра TWCR". Что из этого непонятно? Написать одну строчку разве так сложно?

TWCR = 0 << TWEN;

И выключится I2C. Включить - вместо 0 написать единичку.

krepton85
Offline
Зарегистрирован: 02.02.2016

Все, всем спасибо, все работает теперь как задумано.