Перейти к содержанию
    

Kaplinsky

Свой
  • Постов

    97
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Kaplinsky

  • Звание
    Частый гость
    Частый гость
  • День рождения 27.10.1980

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Фотоувеличитель

    Привет Всем. кому нужен фотоувеличитель (Ленинград-4У) ? Лежит место занимает. Выбрасывать как всегда жалко. Понимаю что сегодня по назначению его вряд-ли кто использует, но может приспособить под что-то ? Может нужен кому ? Налетай ! Киев, Борщаговка. К нему в подарок еще отдам красный фонарь.
  2. Да просто отдаю, что бы не выбрасывать. БЕЗВОЗДМЕЗДНО. :)
  3. Отдам журналы ChipNews-Украина номера за 2005-2009 года а именно 44, 45, 51, 54-56, 58, 59, 62-76, 78-90 весят 15 кг. Киев, борщаговка. недалеко от дома есть пункт приема макулатуры, но как то не хочется их туда...
  4. Таки да, граблей с I2C там хватает. Перед тем как вскипятить себе мозг на MSP430F2471 я работал с MSP430F2274 (eZ430-RF2500) хотел подключить туда компас. В Errata проблема не описана но при работе линия SCL всегда была в нуле - что я только не делал. http://e2e.ti.com/forums/p/9665/51804.aspx#51804 Поделись ка программной реализацией I2C пожалуйста ?
  5. Это верно. Нет, флаг UCNACKIFG был, я его обнаруживал и давал STOP что бы освободить шину. Собственно из за этого флага невозможно было передать байт для записи (адрес регистра компаса)
  6. ОК, Слава дешифровал свой адрес, готов выдать 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
  7. Думаю так: Из за того что я ждал больше положенного 9-клок задерживался со стороны микроконтроллера, и компас на нас забивал, потом, когда мы все же давали 9-й клок компасу уже было на нас начхать вот он и делал NACK. На самом деле делать NACK - значит ничего не делать на шине, а вот для ACK надо при девятом клоке удерживать SDA в низком состоянии.
  8. Ты не на ту осциллограмму смотрел. Чтение у меня вторая осциллограмма в этой теме. ПРОРЫВ ! Проблема решена, причина найдена (неправильное программирование I2C модуля MSP430) ! (подробнее позже) Сейчас борюсь с тем что при чтении выдает два байта вместо одного, опишу решение обязательно. ================================================================================ Изначально идея состояла в том что бы не использовать прерывания для чтения данных компаса. Не хотелось городить глобальные переменные,флаги, счетчики, делать "роботу" в прерывании... и прочую ерунду - зачем если можно подождать (пусть и в активном ожидании) соответствующих флагов. Моей главной ошибкой было то что я ждал бита UCTXSTT - ждал пока передастся START и адрес Славы (ну логично же! ) UCB0CTL1 |= UCTXSTT | UCTR; // Send START, SLAVE ADDR with WRITE // while (UCB0CTL1 & UCTXSTT); а потом уже записывал адрес регистра в буфер передатчика. А не надо было его ждать (почему - не знаю, ведь написано же, флаг очищается после того как передастся START и адрес Славы) Но еще, после передачи устанавливается флаг прерывания передатчика (UCB0TXIFG) сигнализирующий о том что можно записывать данные в буфер передатчика, мол заряжай давай. А понял я когда у меня уже вскипел моск, и я перебрав все варианты (и даже перепробовав разные резисторы) все же решил создать ISR и включить прерывания. Где то глубоко внутри терзало меня сомнение что примеры все написаны с использованием прерываний но я отмахивал это сомнение в конец очереди, так как не очень мне нравиться как сделаны примеры) ... :rolleyes: вот рабочая функция, может кому пригодиться: #define NACK_TX -1 #define NACK_RX -2 int I2C_Read(unsigned char addr, unsigned char *data, int cnt){ int result,i; result = 0; UCB0CTL1 |= UCTXSTT | UCTR; // Send START, SLAVE ADDR with WRITE // while (UCB0CTL1 & UCTXSTT); while (!(IFG2 & UCB0TXIFG)) if (UCB0STAT & UCNACKIFG){ result = NACK_TX; goto STOP; } UCB0TXBUF = addr; while (!(IFG2 & UCB0TXIFG)) if (UCB0STAT & UCNACKIFG){ result = NACK_TX; goto STOP; } UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; // Send START, SLAVE ADDR with WRITE for (i=0;i<cnt;i++){ while (!(IFG2 & UCB0RXIFG)) if (UCB0STAT & UCNACKIFG){ result = NACK_RX; goto STOP; } data[i] = UCB0RXBUF; }//for STOP: UCB0CTL1 |= UCTXSTP; while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent if (IFG2 & UCB0RXIFG) UCB0RXBUF; return result; }//I2C_Read Благодарю всех кто откликнулся: Alexashka, jam, rezident :cheers: - спасибо ребята ! А также Форуму Electronix.ru - :a14: давно я так не подсаживался...
  9. Немного поэкспериментировал с резисторами, вместо SLAVE устройства (компаса) поцепил два резистора подтянутых к питанию. Это 47К, 100Кгц Это 4.3К, 100Кгц. Сигнал стал правильнее. Обратите внимание паузы нет между 8-м и 9-м клоками А теперь компас с резисторами 4.3К и 100Кгц клоками пауза 400 мксек. И это одна из самых маленьких что мне удалось поймать - в основном 9-й клок уходит далеко за экран осциллографа. 2 Resident: Паузы при чтении нет, как видно на осциллограмме. В чем же дело ? ...9-й клок, NACK его ! не переключайтесь, будьте с нами, продолжение следует...
  10. Вот такая схема подключения используется только еще есть два подтягивающих резистора по 15К (других не было, я не думаю что проблема может быть в этом) к питанию линий SDA и SCL Питание подаю 3.3 в. вот такая платка у меня вот отсюда http://www.sparkfun.com/commerce/product_i...roducts_id=9371 Проверял гипотезу что разные адреса могут быть и что 0x1Е для чтения, а для записи какой не известно. Написал перебор адресов, перебрал все для записи ( W=0 ) не откликнулся никакой - везде этот NACK ... Вот на что я обратил внимание: так вот причина паузы скорее всего мастер, MSP430. кстати пауза эта плавающая. Я наблюдал увеличение/уменьшение этой паузы при многократных попытках записи. надо зреть в себя...
  11. Думал об этом. Давал 100к, 400к - результат тот же. На этих скоростях мне фронты не нравятся вот и работаю на 10к, сигналы нормальные (прямоугольные, без затянутых фронтов) так вроде надежнее.
  12. 3С и 3D это уже 8-ми битные адреса с учетом флага RW. 7-ми битный адлрес 1E - сдвиньте на 1 бит вправо 3С или 3D. В даташите на HMC так написано: 7-ми битный адрес 1E, 8-ми битный для записи 3C 8-ми битный для чтения 3D Экспериментировал, с другим адрес не откликается.
  13. HMC5843 Honeywell digital compass

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