|
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 8 2009, 18:53
|

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

|
Цитата(Alexashka @ Dec 8 2009, 18:57)  Таки объясните откуда Nax брался? Таймаут в слейве?  Думаю так: Из за того что я ждал больше положенного 9-клок задерживался со стороны микроконтроллера, и компас на нас забивал, потом, когда мы все же давали 9-й клок компасу уже было на нас начхать вот он и делал NACK. На самом деле делать NACK - значит ничего не делать на шине, а вот для ACK надо при девятом клоке удерживать SDA в низком состоянии.
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
Dec 8 2009, 21:11
|

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

|
Цитата(rezident @ Dec 8 2009, 23:02)  ACK - ACKnowledge (подтверждение), NACK - No ACKnowledge (отсутствие подтверждения). Согласно спецификации I2C, минимальная частота обмена на шине не ограничена, т.е. шина по сути полностью статическая. В отличие от SMBUS, например. Так что slave "начхать" на дешифрацию своего адреса никак не может (не имеет права), если только у него не аварийная ситуация при которой он не может корректно функционировать. Так что ваши догадки выглядят не очень убедительно. Может вы функцию инициализации модуля USCI еще до кучи приведете? ОК, Слава дешифровал свой адрес, готов выдать ACK но 9-го клока все нет и нет. ( ну по крайней мере у меня других идей нет почему оно не работало раньше) инициализация I2C: Код void I2C_Init(unsigned char s_addr){ P3SEL |= 0x06;
UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC; UCB0CTL1 = UCSSEL_3 + UCSWRST;
/* BASE FREQ (SMCLK) 8 Mhz 0x0020 - 400 Kbs 0x0050 - 100 Kbs 0x0320 - 10 Kbs 0x1F40 - 1 Kbs */ UCB0BR0 = 0x50; UCB0BR1 = 0x00; UCB0I2COA = 0x01; UCB0I2CSA = s_addr; UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IFG2 &= ~ (UCB0TXIFG | UCB0RXIFG); }//I2C_Init
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
Сообщений в этой теме
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 Kaplinsky 3С и 3D это уже 8-ми битные адреса с учетом флага ... Dec 6 2009, 18:18 jam Цитата(Kaplinsky @ Dec 6 2009, 21:18) 3С ... Dec 6 2009, 19:27  Kaplinsky Цитата(jam @ Dec 6 2009, 21:27) Они же пр... Dec 6 2009, 19:47   jam Цитата(Kaplinsky @ Dec 6 2009, 22:47) Дум... Dec 6 2009, 22:59 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    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
|
|
|