|
HMC5843 Honeywell digital compass, I2C communication trouble (MSP430) |
|
|
|
Dec 4 2009, 12:23
|

Частый гость
 
Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426

|
Салют разработчикам ! Имею затык при взаимодействии с компасом HMC5843 посредством протокола I2C. В качестве МК применяю MSP430F2471 Проблема в следующем: для прочтения регистра нужно записать в HMC5843 по I2C протоколу адрес регистра а затем произвести операцию чтения. Делаю так: Код #define NACK_1 0x0100 #define NACK_2 0x0200
unsigned int I2C_Read(unsigned char addr){ unsigned int data = 0;
UCB0CTL1 |= UCTXSTT | UCTR; // UCTR - Transmit, UCTXSTT - generate START while (UCB0CTL1 & UCTXSTT); // waiting untill START sent UCB0TXBUF = addr; // Loading register address while (!(IFG2 & UCB0TXIFG)) if (UCB0STAT & UCNACKIFG){ // waiting until data sent or NACK
UCB0CTL1 |= UCTXSTP; // Generate STOP while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent return NACK_1; // wait untill rx flag is set }
UCB0CTL1 &= ~UCTR; // Clear UCTR for reading operation UCB0CTL1 |= UCTXSTT; // Send START, SLAVE ADDR with WRITE while (UCB0CTL1 & UCTXSTT); // waiting untill START sent while (!(IFG2 & UCB0RXIFG)) if (UCB0STAT & UCNACKIFG){
UCB0CTL1 |= UCTXSTP; // Generate STOP while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent return NACK_2; // wait untill rx flag is set }
data = UCB0RXBUF; UCB0CTL1 |= UCTXSTP; // Generate STOP while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent return data;
}//I2C_Read Получаю такой результат:  Почему вылазит этот NACK ??? Адрес правильный а он со мной говорить не хочет ! Скорость I2C - 10Кгц Подтягивающие резисторы 15К. При чтении почему-то компас шлет два байта (регистр из которого читать не указываем по причине невозможности см. выше) и что интересно при запросе чтения компас дает нам ACK а при запросе записи NACK - почему ?  или  Из нижней картинки хорошо видно что есть START мы передаем адрес 0x1E и бит чтения 1, далее компасс дает ACK и выдает ДВА байта - 0x10 (что может быть значением нулевого регистра компаса) и еще какой-то байт 0x7F и потом говорит нам NACK а мы делаем STOP. вот процедура чтения: Код #define NACK_1 0x0100 #define NACK_2 0x0200
unsigned int I2C_Read(unsigned char addr){ unsigned int data = 0;
UCB0CTL1 &= ~UCTR; // Clear UCTR for reading operation UCB0CTL1 |= UCTXSTT; // Send START, SLAVE ADDR with WRITE while (UCB0CTL1 & UCTXSTT); // waiting untill START sent while (!(IFG2 & UCB0RXIFG)) if (UCB0STAT & UCNACKIFG){
UCB0CTL1 |= UCTXSTP; // Generate STOP while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent return NACK_2; // wait untill rx flag is set }
data = UCB0RXBUF; UCB0CTL1 |= UCTXSTP; // Generate STOP while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent return data;
}//I2C_Read Почему два байта и почему NACK при попытке записи - ломаю голову третий день. Подкиньте идею.
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
 |
Ответов
|
Dec 6 2009, 19:47
|

Частый гость
 
Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426

|
Цитата(jam @ Dec 6 2009, 21:27)  Они же просят скорость обмена 100к или 400к , а у Вас вроде 10к - может в этом дело? Думал об этом. Давал 100к, 400к - результат тот же. На этих скоростях мне фронты не нравятся вот и работаю на 10к, сигналы нормальные (прямоугольные, без затянутых фронтов) так вроде надежнее.
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
Сообщений в этой теме
Kaplinsky HMC5843 Honeywell digital compass Dec 4 2009, 12:23 rezident Цитата(Kaplinsky @ Dec 4 2009, 17:23) Поч... Dec 4 2009, 13:58 Alexashka Тоже не внимательно прочитал)
Если адрес не его то... Dec 5 2009, 08:40 rezident Мне кажется подозрительной большая пауза на SCL пе... Dec 7 2009, 00:08 jam Цитата(rezident @ Dec 7 2009, 03:08) Мне ... Dec 7 2009, 00:25  rezident Цитата(jam @ Dec 7 2009, 05:25) Наверно э... Dec 7 2009, 01:07   jam Цитата(rezident @ Dec 7 2009, 04:07) Что ... Dec 7 2009, 02:28 Kaplinsky Вот такая схема подключения используется
только е... Dec 7 2009, 08:29 jam Цитата(Kaplinsky @ Dec 7 2009, 11:29) Вот... Dec 7 2009, 09:11 rezident Цитата(jam @ Dec 7 2009, 07:28) Любой уча... Dec 7 2009, 12:28 Kaplinsky Немного поэкспериментировал с резисторами, вместо ... Dec 7 2009, 17:39 rezident Цитата(Kaplinsky @ Dec 7 2009, 22:39) 2 R... Dec 7 2009, 18:34  Kaplinsky Цитата(rezident @ Dec 7 2009, 20:34) Чтен... Dec 7 2009, 19:46 Alexashka Таки объясните откуда Nax брался? Таймаут в слейве... Dec 8 2009, 16:57 Kaplinsky Цитата(Alexashka @ Dec 8 2009, 18:57) Так... Dec 8 2009, 18:53  rezident Цитата(Kaplinsky @ Dec 8 2009, 23:53) ког... Dec 8 2009, 21:02   Kaplinsky Цитата(rezident @ Dec 8 2009, 23:02) ACK ... Dec 8 2009, 21:11    rezident Цитата(Kaplinsky @ Dec 9 2009, 02:11) ОК,... Dec 9 2009, 01:52     Kaplinsky Цитата(rezident @ Dec 9 2009, 03:52) Как ... Dec 9 2009, 08:23 Pavel V. Буквально на днях боролся с аппаратным I2C на проц... Dec 9 2009, 13:47 Kaplinsky Цитата(Pavel V. @ Dec 9 2009, 15:47) Чита... Dec 9 2009, 14:07  Pavel V. Цитата(Kaplinsky @ Dec 9 2009, 17:07) Под... Dec 9 2009, 14:28   1921 Преречитываю в который раз как увлекательный роман... Feb 1 2011, 08:04
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|