|
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 4 2009, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Kaplinsky @ Dec 4 2009, 17:23)  Почему два байта и почему NACK при попытке записи - ломаю голову третий день. Подкиньте идею. Не очень внимательно прочитал ваше сообщение, но зацепившись взглядом за адрес 0x1E ... может поэтому (см. цитату из даташита) Цитата The default (factory) HMC5843 7-bit slave address is 0x3C for write operations, or 0x3D for read operations. Заметил, что и у писателей документации и у читателей-разработчиков очень часто возникает недопонимание в части трактовки адреса устройства I2C. Бывает, что ошибки и тех, и других.
|
|
|
|
|
Dec 6 2009, 19:47
|

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

|
Цитата(jam @ Dec 6 2009, 21:27)  Они же просят скорость обмена 100к или 400к , а у Вас вроде 10к - может в этом дело? Думал об этом. Давал 100к, 400к - результат тот же. На этих скоростях мне фронты не нравятся вот и работаю на 10к, сигналы нормальные (прямоугольные, без затянутых фронтов) так вроде надежнее.
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
Dec 7 2009, 08:29
|

Частый гость
 
Группа: Свой
Сообщений: 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 это допустимо и нормально и вполне объяснимо тем, что у м/с есть свой собственный внутренний клок. Но какова же причина этой паузы? При беглом чтении даташита я ответа не увидел.  Вот на что я обратил внимание: Цитата("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. кстати пауза эта плавающая. Я наблюдал увеличение/уменьшение этой паузы при многократных попытках записи. надо зреть в себя...
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
Dec 7 2009, 09:11
|

Знающий
   
Группа: Свой
Сообщений: 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, а потом только читайте.
|
|
|
|
|
Dec 7 2009, 12:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(jam @ Dec 7 2009, 07:28)  Любой участник протокола имеет право на bus wait, сажая SCL в ноль, при этом мастер должен застопорить clock и ждать, пока линия освободится. Я об этом знаю и упоминал, что этот прием полностью соответствует спецификации I2C. Только при реализации "чистого" слейва это чаще всего не требуется. Например, в EEPROM и ADC пин SCL функционально является входом, без возможности управления (удержания) SCL. Цитата(Kaplinsky @ Dec 7 2009, 13:29)  только еще есть два подтягивающих резистора по 15К (других не было, я не думаю что проблема может быть в этом) к питанию линий SDA и SCL Все же попробуйте уменьшить номиналы резисторов до 2...4,7кОм. Цитата(Kaplinsky @ Dec 7 2009, 13:29)  кстати пауза эта плавающая. Я наблюдал увеличение/уменьшение этой паузы при многократных попытках записи. Пауза только при записи? А при чтении она есть?
|
|
|
|
|
Dec 7 2009, 17:39
|

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

|
Немного поэкспериментировал с резисторами, вместо SLAVE устройства (компаса) поцепил два резистора подтянутых к питанию. Это 47К, 100Кгц  Это 4.3К, 100Кгц.  Сигнал стал правильнее. Обратите внимание паузы нет между 8-м и 9-м клоками А теперь компас с резисторами 4.3К и 100Кгц клоками  пауза 400 мксек. И это одна из самых маленьких что мне удалось поймать - в основном 9-й клок уходит далеко за экран осциллографа. 2 Resident: Паузы при чтении нет, как видно на осциллограмме. В чем же дело ? ...9-й клок, NACK его ! не переключайтесь, будьте с нами, продолжение следует...
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|