Я работаю над проектом, в котором используется оптический датчик от мыши. У меня есть оригинальная управляющая печатная плата (все еще заполненная, за исключением самого оптического датчика), и у меня есть оптический датчик на моей специальной печатной плате, которая должна управляться nrf51822. Я подключил контакты часов + данных (это двухпроводной интерфейс) к обеим платам, управляемые оригинальной платой управления (я установил контакты часов и данных в качестве входов без подтягивающих резисторов).
Я пытаюсь перехватить трафик, чтобы определить, какие сигналы отправляются, но мне не очень повезло - я подозреваю, что моя тактовая частота слишком низкая. Как можно быстрее (только в while true
цикле) я сканирую свой вывод часов и вывод данных, а затем вывожу их оба на выход моей консоли через UART со скоростью 1 Мбод. Запуск этого цикла пустым в течение 5 секунд приводит к ~ 4000 циклам, что означает, что я получаю время выполнения> 1 мс для каждого цикла, что я считаю своей основной проблемой.
Как бы то ни было, я фиксирую (примерно за 700 сканирований) 100 групп чередующихся «часы 1 и данные 1» и «часы 0 и данные 0» — каждая группа состоит из 4–9 элементов (то есть 4–9 «1» на оба, а затем 4-9 «0» на обоих). Затем, примерно через 400 сканирований (~ 0,5 секунды), я получаю то же самое, но 54 группы. В этот момент я прекратил сканирование.
Есть ли способ: A) Ускорить мой цикл сканирования, чтобы я мог более точно фиксировать трафик? или Б) Расшифровать то, что у меня уже есть (сомнительно)?
Нужно ли мне рассматривать альтернативный маршрут? Я не нашел доступа к осциллографу, что... жаль.
Буду признателен за любой совет. Спасибо.
Как указал Крис Страттон в своих комментариях к другому ответу, вам нужно изменить способ работы вашего программного обеспечения.
Есть два варианта:
Вариант 1.
Запуск в узком цикле, опрашивающий выводы и записывающий метку времени в буфер при изменении их состояния. Если значение не изменилось, ничего не делайте.
Как только буфер заполнится, выведите время, записанное по последовательному каналу.
Вариант 2:
Используйте последовательные и тактовые линейные входы в качестве прерываний. Когда выводы меняются, в буфер записывается временная метка перехода и новое состояние вывода.
Сделайте так, чтобы фоновый цикл отправлял зарегистрированные данные на последовательный порт, не отставая от данных, насколько это возможно, указывая, не переполнился ли буфер.
Оба они решают большую проблему, с которой вы столкнулись: вы пытаетесь вывести последовательные данные из критически важного по времени фрагмента кода, printf работает медленно, а последовательные порты работают в ледяном темпе, никогда не выполняйте их в нужном вам разделе кода. быстро бежать. Вариант 1 проще и, вероятно, справится с немного более высокими частотами, но будет записывать только до тех пор, пока у вас есть место для буферизации, и, возможно, может сообщать о двух очень близких друг к другу фронтах как о неправильном порядке. Вариант 2 выводит во время работы, поэтому он должен работать дольше (будь то на 1 фронт больше или сохраняется и работает неопределенно, зависит от скорости фронтов и последовательного порта), но из-за накладных расходов на прерывания будет иметь более низкий верх скорость и сложнее кодировать.
Другое очевидное решение — одолжить/арендовать у кого-нибудь осциллограф или логический анализатор.
NRF51822 использует ARM Cortex M0, который кажется совершенно неподходящим для вашей задачи захвата. Cortex M0 использует от 1 до 4 циклов для основных инструкций и намного дольше, если вы используете такие вещи, как умножение. Процессор не может быть прерван во время декодирования базовой инструкции.
Если вы хотите захватить данные, было бы намного лучше с небольшим 8-битным процессором с 1 циклом на команду, таким как ATMega328. Вы должны быть в состоянии подключить Arduino Nano за 3 доллара для сериализации данных и вывода через последовательный порт.
Поскольку протокол является синхронным, вы должны иметь возможность использовать SPI в режиме Slave для получения данных. Вы должны прочитать отличный обзор SPI Ника Гэммонса , чтобы начать.
Если вы используете ведомое устройство SPI, вам фактически придется вставлять 8 бит в очередь UART каждые 8 тактов вашего устройства. Просто помните, что этот метод захвата не будет захватывать пробелы (без тактов), поэтому вы получите плотный дамп (без пробелов) данных.
Чтобы понять, почему ARM Cortex M0 плохо справляется со скоростью прерывания или битовыми портами, прочитайте это и это .
Винс Патрон
Крис Стрэттон
Полезный
Полезный
Крис Стрэттон
0___________
Полезный