реклама на сайте
подробности

 
 
> HMC5843 Honeywell digital compass, I2C communication trouble (MSP430)
Kaplinsky
сообщение Dec 4 2009, 12:23
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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 при попытке записи - ломаю голову третий день. Подкиньте идею.


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alexashka
сообщение Dec 8 2009, 16:57
Сообщение #2


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Таки объясните откуда Nax брался? Таймаут в слейве? smile.gif
Go to the top of the page
 
+Quote Post
Kaplinsky
сообщение Dec 8 2009, 18:53
Сообщение #3


Частый гость
**

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



Цитата(Alexashka @ Dec 8 2009, 18:57) *
Таки объясните откуда Nax брался? Таймаут в слейве? smile.gif


Думаю так: Из за того что я ждал больше положенного 9-клок задерживался со стороны микроконтроллера, и компас на нас забивал, потом, когда мы все же давали 9-й клок компасу уже было на нас начхать вот он и делал NACK. На самом деле делать NACK - значит ничего не делать на шине, а вот для ACK надо при девятом клоке удерживать SDA в низком состоянии.


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 8 2009, 21:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Kaplinsky @ Dec 8 2009, 23:53) *
когда мы все же давали 9-й клок компасу уже было на нас начхать вот он и делал NACK. На самом деле делать NACK - значит ничего не делать на шине, а вот для ACK надо при девятом клоке удерживать SDA в низком состоянии.
ACK - ACKnowledge (подтверждение), NACK - No ACKnowledge (отсутствие подтверждения). Согласно спецификации I2C, минимальная частота обмена на шине не ограничена, т.е. шина по сути полностью статическая. В отличие от SMBUS, например. Так что slave "начхать" на дешифрацию своего адреса никак не может (не имеет права), если только у него не аварийная ситуация при которой он не может корректно функционировать. Так что ваши догадки выглядят не очень убедительно. Может вы функцию инициализации модуля USCI еще до кучи приведете?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016