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

 
 
> 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
Ответов
Pavel V.
сообщение Dec 9 2009, 13:47
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Буквально на днях боролся с аппаратным I2C на процессоре F1611, в итоге так и не смог его заставить работать (точнее, смог, но были какие-то паранормальные ошибки). Осциллографа под рукой, к сожалению, не было, поэтому точно сказать что происходило на шине не могу, но по косвенным признакам не формировался STOP после передачи заданного числа байт, приходилось формировать его вручную. Читал Errat-у по этому камню, там куча проблем с I2C, видимо, я на одну из них и напоролся.

Вылечилось все только программной реализацией I2C..


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
Kaplinsky
сообщение Dec 9 2009, 14:07
Сообщение #3


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

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



Цитата(Pavel V. @ Dec 9 2009, 15:47) *
Читал Errat-у по этому камню, там куча проблем с I2C, видимо, я на одну из них и напоролся.

Вылечилось все только программной реализацией I2C..

Таки да, граблей с I2C там хватает.
Перед тем как вскипятить себе мозг на MSP430F2471 я работал с MSP430F2274 (eZ430-RF2500) хотел подключить туда компас. В Errata проблема не описана но при работе линия SCL всегда была в нуле - что я только не делал.
http://e2e.ti.com/forums/p/9665/51804.aspx#51804

Поделись ка программной реализацией I2C пожалуйста ?
Причина редактирования: Излишнее цитирование.


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
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
- - 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.   Цитата(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 Текстовая версия Сейчас: 22nd July 2025 - 16:53
Рейтинг@Mail.ru


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