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

 
 
> 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
Ответов
Kaplinsky
сообщение Dec 7 2009, 08:29
Сообщение #2


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

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



Вот такая схема подключения используется

только еще есть два подтягивающих резистора по 15К (других не было, я не думаю что проблема может быть в этом) к питанию линий SDA и SCL
Питание подаю 3.3 в.


вот такая платка у меня
вот отсюда http://www.sparkfun.com/commerce/product_i...roducts_id=9371

Проверял гипотезу что разные адреса могут быть и что 0x1Е для чтения, а для записи какой не известно.
Написал перебор адресов, перебрал все для записи ( W=0 ) не откликнулся никакой - везде этот NACK ...

Цитата(rezident @ Dec 7 2009, 02:08) *
Мне кажется подозрительной большая пауза на SCL перед выдачей NAK при записи адреса м/с. На диаграмме чтения такой паузы нет. Откуда она берется? Сам датчик SCL "растягивает"? По спецификации I2C это допустимо и нормально и вполне объяснимо тем, что у м/с есть свой собственный внутренний клок. Но какова же причина этой паузы? При беглом чтении даташита я ответа не увидел. laughing.gif


Вот на что я обратил внимание:

Цитата("Datasheet на HMC5843 @ страница 18, I2C COMMUNICATION PROTOCOL")
After each 8-bit transfer, the master device generates a 9 th clock pulse, and releases the SDA line.
The receiving device (addressed slave) will pull the SDA line low to acknowledge (ACK) the successful transfer or leave
the SDA high to negative acknowledge (NACK).


так вот причина паузы скорее всего мастер, MSP430.
кстати пауза эта плавающая. Я наблюдал увеличение/уменьшение этой паузы при многократных попытках записи.

надо зреть в себя...


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


Знающий
****

Группа: Свой
Сообщений: 792
Регистрация: 9-08-05
Из: Транай
Пользователь №: 7 474



Цитата(Kaplinsky @ Dec 7 2009, 11:29) *
Вот такая схема подключения используется
только еще есть два подтягивающих резистора по 15К (других не было, я не думаю что проблема может быть в этом) к питанию линий SDA и SCL
Питание подаю 3.3 в.

Ну осталось проверить только резисторы - по стандарту 2.4ком...
И ещё - попробуйте перед тем как просить данные дать ему адрес конфигурационного регистра , потом записать туда 0х00, а потом только читать...
пошлите ему 0х3с 0х00 0х00, а потом только читайте.
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
- - 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


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:19
Рейтинг@Mail.ru


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