Частота дискретизации I2C

У меня возникли проблемы с попыткой пробовать подчиненные устройства I2C с помощью микроконтроллера dsPIC33f.

Я использую внутренний таймер timer1 PIC, чтобы «поставить галочку» на определенной частоте дискретизации и получить необходимые данные. К сожалению, результаты получаются недостаточно быстро, и я не уверен, почему. Одно из моих подчиненных устройств - акселерометр ADXL345, максимальная скорость передачи данных которого составляет 3600 Гц. Мне не нужен почти такой высокий уровень, но, похоже, я не могу успешно сэмплировать где-либо выше 50 Гц.

I2C настроен на «быстрый режим» 400 кГц. Абсолютный максимум, на котором я хотел бы выбрать акселерометр, составляет 1 кГц, хотя это было бы излишним, меня действительно больше интересует около 128 Гц. Я установил следующие параметры акселерометра:

  • Формат данных (0x31) - самотестирование выключено, прерывание инвертировано выключено, полное разрешение включено, бит выравнивания выключен, бит диапазона +/- 16g.
  • Скорость передачи данных (0x2C) - режим низкого энергопотребления выключен (нормальный режим), режим выходной скорости передачи данных 400 Гц (я читал в таблице данных, что 400 кГц I2C поддерживает только 800 Гц, поэтому я не рискую с 400 Гц).
  • Управление питанием (0x2D) - автоматическое отключение, режим измерения включен, бит сна отключен, частота дискретизации режима сна 8 Гц (хотя и не используется, поэтому может игнорироваться).
  • Прерывания (0x2E) - прерывание по готовности данных разрешено, все остальное отключено.

Я использую timer1 для выборки с указанной частотой дискретизации, я знаю, что частота дискретизации работает достаточно, поскольку у меня есть счетчик, который выводит сообщение после того, как счетчик достигает одной минуты; Я использую секундомер, чтобы убедиться, что это правильно. Например, при частоте дискретизации 100 Гц я жду, пока счетчик посчитает до 6000 (100 * 60) и отобразит сообщение, если секундомер показывает 1 минуту, когда я вижу это сообщение, я знаю, что это выборка, по крайней мере, с некоторой точностью.

Когда я пытаюсь выполнить выборку только с акселерометра (режим чтения нескольких байтов I2C, считайте все шесть байтов за один вызов), он работает недостаточно быстро. Используя мой метод секундомера, кажется, что на выполнение задания, которое должно занять одну минуту (выборка при 100 Гц), уходит около минуты и 15 секунд, то есть он не обрабатывает команду I2C достаточно быстро. Более высокая частота дискретизации увеличивает задержку.

У меня есть ощущение, что это как-то связано с тем, что часы I2C и таймер 1 не синхронизируются, и поэтому в моем запросе данных акселерометра есть ненужное ожидание. Я не могу представить, что тактовая частота 400 кГц для I2C недостаточна, но, пожалуйста, поправьте меня, если я ошибаюсь.

Как мне правильно читать данные с ведомых устройств I2C? У меня также есть гироскоп и магнитометр, которые я хочу читать с достаточно высокой частотой дискретизации, магнитометр имеет ограничение в 160 Гц, поэтому, как я уже сказал, частота дискретизации 128 Гц будет подходящей для всех трех устройств. Попытка прочитать данные со всех трех устройств одновременно, очевидно, увеличивает более медленную, чем ожидалось, выборку.

Я также буду собирать аналоговые данные с 4 контактов одновременно (АЦП 10 бит). Этот код уже реализован, и я могу читать аналоговые данные на частоте 1 кГц с ожидаемой частотой дискретизации, просто устройства I2C работают медленно!

Я ожидал, что акселерометр будет в порядке при попытке сэмплирования на 100 Гц, когда я могу выводить на 3600 Гц (макс. 800 Гц для I2C), но он действительно борется, и я не знаю, что еще попробовать.

Ваше здоровье!


person ritchie888    schedule 08.04.2013    source источник
comment
У вас есть осциллограф, логический анализатор или другое измерительное оборудование?   -  person payala    schedule 09.04.2013
comment
У меня есть доступ к осциллографу, что вы предлагаете мне попробовать?   -  person ritchie888    schedule 13.04.2013
comment
Почему ты не принимаешь ответ @ ritchie888?   -  person Ihsan    schedule 20.04.2013


Ответы (1)


Хорошо, это может быть много чего:

  • Самое простое объяснение в вашем случае - это неправильная конфигурация таймера, который вы используете для запуска опросов. Мне нужно знать, как вы это используете, запускает ли оно прерывание, когда вы устанавливаете флаг для запуска опроса акселерометра? Вы вручную опрашиваете таймер, чтобы запустить опрос акселерометра. В любом случае переключение выходного контакта с высокого на низкий, когда это происходит, и просмотр его с помощью осциллографа даст вам ценную информацию. Все ли периоды опроса длиннее, или только некоторые из них занимают намного больше времени, чем ожидалось?

  • Чаще всего я видел медленные процедуры обработки I2C. Ваш I2C может быть настроен на 400 кГц, и это действительно скорость, с которой биты байта читаются и записываются, но есть некоторое время обработки между байтами, которое очень сильно зависит от сложности вашего кода. В вашем случае, поскольку вы используете режим чтения нескольких байтов, на этот раз на самом деле не между байтами, а между циклами опроса. Но странно, что это была бы ваша проблема, это не такой частый опрос и чтение больших данных.

  • Что я бы сделал в вашем случае (имея какое-то измерительное оборудование, которое, похоже, у вас есть), - это проверить, все ли тайминги соответствуют вашим ожиданиям. Не предполагайте ничего, измерьте его и убедитесь, что он делает то, что вы ожидаете. В этом плане я бы начал с самого простого. Часы работают на частоте 400 кГц? Читаются ли шесть байтов без задержек между ними? Есть ли ожидаемые перерывы между опросами? Не застревает ли шина I2C (низкий уровень SDA и / или SCL в течение длительного периода времени) между опросами? есть ли какие-либо неожиданные сообщения или действия в автобусе, кроме тех, которые связаны с акселерометром? Вот некоторые из вещей, которые я бы проверил, чтобы понять, что может пойти не так. Золотое правило здесь: Не спекулируйте, измеряйте!

  • Если все вышеперечисленное идеально и, как ожидалось, только с более длительным периодом времени между опросами стабильно. Я бы начал проверять время срабатывания программного обеспечения, чтобы получить представление о том, сколько времени уходит на каждую процедуру. Я видел, как многие разработчики программного обеспечения удивлялись, сколько времени могут занять некоторые, казалось бы, простые операции. Для этого используйте переключение битов вывода, описанное в первом пункте. Используйте пару портов ввода-вывода, чтобы у вас было два маркера по одному на каждом канале осциллографа, и измените место в коде, где вы переключаете эти биты, просто поиграйте с ним, чтобы проверить любые медленные части кода. Если вы хотите для этого еще одно золотое правило, разделяй и властвуй. Установите маркеры на самые высокие подпрограммы абстракции и копайте ниже, разделяя медленную часть кода, пока не обнаружите, что не так.

Попробуйте это и дайте мне знать, помогло ли это.

Ура и удачи!

person payala    schedule 13.04.2013
comment
Спасибо за вашу помощь. Я расследовал это, и я почти уверен, что у меня есть ненужные задержки в моем процессе I2C. Я последовал вашему совету и использовал выходной контакт для переключения светодиода в определенные моменты времени, я также потратил некоторое время на осциллограф, чтобы посмотреть, как он выглядит. Хорошей новостью является то, что частота дискретизации I2C составляет 400 кГц (или достаточно близко), поэтому дело не в том, что часы настроены неправильно: imgboot.com/user/ritchie888/images/setup1.png - person ritchie888; 17.04.2013
comment
Я использую timer1 для вызова прерывания и установки флага с определенной частотой дискретизации (проверено и работает нормально). В каждом опросе я вызываю функцию для чтения данных I2C. Думаю, виноват ваш второй пункт. Я использовал пример кода I2C веб-сайта микрочипов, чтобы понять, что делать, но он ждет вызова прерывания (ACK / NACK) почти после каждого этапа процесса I2C, например, отправки стартового бита, стопового бита и т. Д. и перезапустите бит. Насколько я понимаю, ACK не требуется для этих этапов (?), И ожидание их вызова вызывает огромные задержки. Мысли? - person ritchie888; 17.04.2013
comment
Если я правильно помню, I2C Microchip устанавливает флаги прерывания для нескольких событий, не только ACK / NACK, но также Start / Stop, чтение / запись байтов и тому подобное. Вероятно, этого и ждет код. Однако, и каждый раз, когда я говорю это, я вызываю противоречие, мой опыт работы с образцом кода микрочипа не очень хорош (и я люблю микроконтроллеры Microchip). Но их примерный код не является ни оптимальным, ни поддерживаемым, ни свободным от ошибок, и иногда мне даже интересно, протестирован ли он. Я научился интерпретировать это больше как псевдокод, который служит руководством, когда вы не знаете, с чего начать. - person payala; 17.04.2013
comment
Что мне действительно нравится, так это их таблицы данных. В большинстве случаев они ясны и точны, так что это моя основная рекомендация. В вашем случае я бы получил время полного байта, чтобы увидеть, как начальный ›адрес-› ACK- ›данные-› ACK- ›останавливает поток и время между ними. У вас хороший прицел, так что вам повезло. Этот MSO должен быть смешанным, поэтому вы, вероятно, сможете подключить логический анализатор и напрямую интерпретировать шину I2C (настоятельно рекомендуется, когда вы начнете анализировать кадры). - person payala; 17.04.2013
comment
В очередной раз благодарим за помощь. Думаю, я уже начал разбираться в проблеме. Я устанавливал внутренний генератор на 80 МГц (по крайней мере, я так думаю). После удаления этого и использования стандартной скорости генератора запуска, которая, как я полагаю, составляет 7,37 МГц, я получаю сверхбыстрый I2C. К сожалению, не зная тактовой частоты, я не могу подтвердить, правильно ли работает таймер прерывания (timer1), поэтому я вызываю команду I2C в цикле while, но она делает это ОЧЕНЬ быстро, поэтому я думаю, что устанавливаю часы была проблема. Есть ли у I2C максимальная тактовая частота? - person ritchie888; 17.04.2013
comment
Что ж, это возможно, в основном потому, что есть много вещей, которые могут пойти не так, если ваши часы неправильно настроены, и, учитывая, что многие вещи зависят от ваших настроек часов, есть много шансов, что что-то выйдет из строя. В любом случае, для меня было бы полезно, если бы вы взяли с собой некоторые инструменты для отладки встроенных систем и оборудования. Осциллограф - ваш главный союзник, и использование контактов ввода / вывода для передачи сигналов времени или последовательности очень полезно. Просто совет, если вы подозреваете настройку часов ... измерьте штифты часов и проверьте их. - person payala; 18.04.2013
comment
Хотя есть баланс, некоторые вещи должны быть теоретически правильными, их недостаточно, чтобы их измерить. Особенно, если вам нужна какая-то безопасность или гарантия определенных характеристик. Наиболее распространенные частоты I2C - 100 кГц и 400 кГц, но предел определяется частями, подключенными к шине (в основном), если вы хотите перейти на более высокую скорость, будьте осторожны с константой RC линий шины, это может стать узким местом относительно скорости автобуса. Пожалуйста, я люблю помогать, когда могу. - person payala; 18.04.2013
comment
Задача решена! Оказалось, что это не имеет отношения к I2C или генератору. Это я был глуп с прерыванием таймера. При каждом опросе таймера я выключал таймер, сбрасывал таймер, а затем снова его включал. Понятия не имею, зачем я это делал. После того, как вы удалили это и просто сбросили флаг на каждом прерывании таймера, все работает хорошо. Простите за мою глупость! Спасибо еще раз. - person ritchie888; 18.04.2013
comment
Не волнуйтесь, когда что-то не получается ... это всегда мы !! (В 99% случаев). Здорово, что теперь он работает! - person payala; 18.04.2013