Цитата(pokk @ May 31 2017, 07:32)

(1) . . .. , и в случае выхода одного из строя что бы все остальное работало.
(2) . . . .если много раз зависал в одной функции то перейти на более медленный опрос этой функции раз в 10 секунд, или вообще выключить её опрос)
(1) если датчик закоротит одну из линий I2C - то естественно, "ляжет" вся шина. И с этим ничего не сделаешь.
Шина I2C - внутрисхемный интерфейс, и если датчик висит на проводе более 10 см - готовьтесь к проблемам.
Чтоб ОНО таки работало, проверьте подтягивающие резисторы I2C. Они должны быть (для надежной рабты периферии, в соотв-ии с миним. требованиями стандарта)
R = 4.7 ... 10 кОм. ОНО будет, конечно, работать и на 100к, но помехоустойчивать будет приближаться к 0.
Снижать вниз R нельзя, можно попалить выходные узлы как мастера, так и слейвов.
Экранируйте провод линии - если они внешние для прибора.
Для работы с длинной внешней шиной I2C есть спец. микросхемы-драйверы.
(2)
не используйте
Код
while( USCI_I2C_RDY_ ) { } - прямой путь к завесам в нем.
лучше так
Код
MyTimer.Start(1000);
while( USCI_I2C_RDY ) // бит периферийного узла I2C
{
if( MyTimer.IsElaps() )
{
RetCode = eI2C_ERR_RDY;
break;
}
}
Завесы при работе с периферией I2C вполне возможны. slave может войти в "ступор" (ожидание) и ваш софт получит коллизию - навечно, до второго пришествия
Reset. Вывести шину из этого состояния софтово можно принудительной подачей 9 clk (узел I2C отключить. ногодрыг SCK)
Вообще, если что-то не работает или "глючит" - 99 проц. - вина аффтара софта и железа

Не устраняйте последствия, найдите и устраните причину сбойной работы.