Цитата(rezident @ Dec 7 2009, 20:34)

Чтении?

Вроде как запись по осциллограмме получается. Адрес 0x3C=0b00111100. Или я ошибаюсь?
Выходит сама м/с растягивает SCL.

Но почему она выдает NACK на запись я не знаю.

Ты не на ту осциллограмму смотрел. Чтение у меня вторая осциллограмма в этой теме.
ПРОРЫВ !
Проблема решена, причина найдена (неправильное программирование I2C модуля MSP430) !
(подробнее позже)
Сейчас борюсь с тем что при чтении выдает два байта вместо одного, опишу решение обязательно.
================================================================================
Изначально идея состояла в том что бы не использовать прерывания для чтения данных компаса.
Не хотелось городить глобальные переменные,флаги, счетчики, делать "роботу" в прерывании... и прочую ерунду - зачем если можно подождать (пусть и в активном ожидании) соответствующих флагов.
Моей главной ошибкой было то что я ждал бита UCTXSTT - ждал пока передастся START и адрес Славы (ну логично же! )
Код
UCB0CTL1 |= UCTXSTT | UCTR; // Send START, SLAVE ADDR with WRITE
// while (UCB0CTL1 & UCTXSTT);
а потом уже записывал адрес регистра в буфер передатчика.
А не надо было его ждать (почему - не знаю, ведь написано же, флаг очищается после того как передастся START и адрес Славы)
Но еще, после передачи устанавливается флаг прерывания передатчика (UCB0TXIFG) сигнализирующий о том что можно записывать данные в буфер передатчика, мол заряжай давай.
А понял я когда у меня уже вскипел моск, и я перебрав все варианты (и даже перепробовав разные резисторы) все же решил создать ISR и включить прерывания. Где то глубоко внутри терзало меня сомнение что примеры все написаны с использованием прерываний но я отмахивал это сомнение в конец очереди, так как не очень мне нравиться как сделаны примеры)
...
вот рабочая функция, может кому пригодиться:
Код
#define NACK_TX -1
#define NACK_RX -2
int I2C_Read(unsigned char addr, unsigned char *data, int cnt){
int result,i;
result = 0;
UCB0CTL1 |= UCTXSTT | UCTR; // Send START, SLAVE ADDR with WRITE
// while (UCB0CTL1 & UCTXSTT);
while (!(IFG2 & UCB0TXIFG)) if (UCB0STAT & UCNACKIFG){
result = NACK_TX;
goto STOP;
}
UCB0TXBUF = addr;
while (!(IFG2 & UCB0TXIFG)) if (UCB0STAT & UCNACKIFG){
result = NACK_TX;
goto STOP;
}
UCB0CTL1 &= ~UCTR;
UCB0CTL1 |= UCTXSTT; // Send START, SLAVE ADDR with WRITE
for (i=0;i<cnt;i++){
while (!(IFG2 & UCB0RXIFG)) if (UCB0STAT & UCNACKIFG){
result = NACK_RX;
goto STOP;
}
data[i] = UCB0RXBUF;
}//for
STOP:
UCB0CTL1 |= UCTXSTP;
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
if (IFG2 & UCB0RXIFG) UCB0RXBUF;
return result;
}//I2C_Read
Благодарю всех кто откликнулся:
Alexashka,
jam,
rezident 
- спасибо ребята !
А также Форуму
Electronix.ru -
давно я так не подсаживался...
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".