У меня нет UART на моем микроконтроллере, так как я могу его добавить?

Я использую микроконтроллер ATMEGA32HVB , который имеет возможность балансировки ячеек, с помощью которой мы можем соединить 4 батареи последовательно и использовать по одной за раз. Это очень полезно для управления питанием, поэтому я не могу использовать другой микроконтроллер. Пожалуйста, предложите несколько способов добавить к нему UART, чтобы я мог легко подключаться к последовательным устройствам.

Программный способ UART, описанный пользователем 26129, называется битовым взрывом .
Всего лишь мои очень субъективные 0,02 доллара, но я обычно предпочитаю отдельный выделенный контроллер батареи и UART, интегрированный в uC, а не наоборот. Зачем вам встроенное в UC управление батареями?
Я должен использовать перезаряжаемые батареи, которые будут заряжаться с помощью солнечной панели, поэтому мне нужно 4 батареи последовательно, которые будут использоваться по одной за раз.
Один вопрос в том, насколько сильно вы хотите использовать UART и в каких направлениях. Если вы хотите только время от времени генерировать отладочное сообщение или сообщение о состоянии, в то время, когда ваш процессор не испытывает особых дополнительных требований, последовательный вывод битов может выглядеть очень привлекательно. Существуют галочки, такие как использование прерываний по смене контакта, которые также могут уменьшить среднюю нагрузку на наличие входного канала, но если вы ожидаете получать символы с высокой скоростью передачи в то время, когда у вас есть другие обязательства в реальном времени, это может быть проблема.

Ответы (5)

Как отмечали другие, вы можете либо добавить в свою систему дополнительное оборудование, чтобы обеспечить функциональность UART, либо вы можете эмулировать его в программном обеспечении. Если у вас есть контроль над общей аппаратной конструкцией и есть возможность добавить еще одну микросхему, я бы настоятельно рекомендовал использовать аппаратный подход. Вы, конечно, можете заставить программный UART работать, используя бит-бэнг , но вы можете не захотеть выделять ресурсы ЦП для генерации требуемой синхронизации.

Из таблицы данных видно, что ваш микроконтроллер имеет как SPI, так и I2C (который Atmel называет двухпроводным интерфейсом (TWI)). Вероятно, это лучшие интерфейсы для подключения внешнего UART. Указанные устройства доступны от ряда производителей. Некоторые примеры:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) предлагает линейку 1- и 2-канальных устройств UART SPI/I2C, Рабочий диапазон 3,3 В. Я не использовал ни одну из этих частей специально, но в прошлом я использовал устройства Exar (с параллельными интерфейсами шины памяти), и они работали хорошо.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) предлагает линейку устройств SPI/I2C UART/IrDA/GPIO, также в 1- и 2-канальном исполнении. -канальные разновидности в нескольких диапазонах напряжения. Я использовал эти детали (в частности, SC16IS762) в прошлом с большим успехом.

  • У Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) есть устройства MAX3110E и MAX3111E, которые представляют собой UART, подключенные через SPI. Одной из уникальных особенностей этих устройств является то, что они имеют встроенный линейный драйвер RS-232. Итак, если вам нужно, чтобы ваш UART взаимодействовал с устройством, которое использует линейное напряжение RS-232 вместо логических уровней (например, ПК), это может быть полезно, поскольку избавит вас от необходимости добавлять еще одну микросхему линейного драйвера на вашу плату.

Ничего себе, никогда не знал, что у Максима есть такие предметы, я бы +2, если бы мог.

Если вы ищете аппаратное решение, у Максима есть несколько микросхем UART с интерфейсом SPI к микроконтроллеру (который входит в вашу часть). Посмотрите на MAX3100 или другие варианты здесь: http://www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm

Вам нужно будет использовать программный драйвер UART. В зависимости от того, что именно вы ожидаете от этого UART, вы можете использовать AVR305 (чрезвычайно компактный, но без функций, кроме блокировки полудуплексной передачи/приема), AVR274 (управляемый прерываниями, достаточно полнофункциональный), вы можете написать свой собственный программный драйвер UART или вы можете использовать тот, который вы найдете в Интернете, например, погуглив «avr software uart»

Небольшое примечание о разработке программного обеспечения «UART»: есть, по крайней мере, качественно разные подходы, которые можно использовать в зависимости от требований:

  • Драйвер битового взрыва «захватит все» отключит все прерывания и будет использовать код с подсчетом циклов для тактирования каждого бита. Получение данных с помощью драйвера «захвата всего» требует, чтобы при поступлении данных контроллер ничего не делал, а только ждал их.

  • Драйвер битового взрыва «перехват основного цикла» будет вести себя почти так же, как и выше, за исключением того, что он будет использовать ресурс таймера для битовой синхронизации, а не для подсчета циклов. Прерывания, которые не требуют слишком много времени для обслуживания, можно оставить включенными. Для последовательной передачи ресурс таймера с фиксированной скоростью может использоваться совместно с другими целями; однако для последовательного приема драйвер битового взрыва должен иметь возможность перезагружать таймер при поступлении стартового бита, чтобы он истекал в середине времени каждого входящего бита.

  • Драйвер битового взрыва, полностью управляемый прерываниями, использует таймер с фиксированной скоростью, который предпочтительно работает с некоторым числом, кратным скорости передачи данных (3x и 5x лучше, чем 4x), и делает все через этот таймер. Такой драйвер может работать одновременно со всем остальным, но для него потребуется более быстрый процессор, чем требовался бы прежний тип драйвера.

Чтобы избежать того, чтобы первые два стиля контроллера вечно ждали данных, которые могут никогда не прийти, в подпрограммы чтения обычно включается значение тайм-аута. Обратите внимание, что если цикл контроллера действительно, например, «получает байт, ожидая его до 100 мс, делает что-то еще, если ничего не пришло, затем получает следующий байт и т. д.». и байт поступает между временем ожидания процедуры "get" и контроллером, который снова начинает ждать, этот байт будет потерян; устройство, с которым оно взаимодействует, должно ожидать такой возможности.

Только драйвер третьего типа сможет обрабатывать возможность начала поступления байта данных во время передачи байта данных. Однако первые два стиля можно использовать для некоторых протоколов полноскоростной полнодуплексной связи, если контроллер должен говорить только тогда, когда к нему обращаются. Хитрость заключается в том, чтобы иметь подпрограмму «чтения и записи данных», которая будет ожидать входящего стартового бита, а когда он обнаружен, перекрывает чтение и запись, так что контроллер отправляет каждый бит, как только он собирается проверить входящие данные. Как только контроллер обнаружит входящий стартовый бит, он будет точно знать, когда он должен искать следующие 8 битов данных и стоповый бит, и, таким образом, будет знать, что он может безопасно использовать время между ними для вывода своих собственных данных.

Одно замечание на прощание: контроллер, который использует один из первых двух стилей побитового UART для приема данных, должен обрабатывать каждый байт данных до спада начального бита следующего байта, чтобы избежать потери данных. Если контроллер знает, что обработка займет не менее полубита времени, он может максимизировать время, доступное для обработки, принимая каждый байт, как только он захватил последний бит данных, а не дожидаясь стоп-бита. Однако в качестве дополнительного средства дать контроллеру больше времени может быть полезно иметь устройство, которое передает ему данные, с двумя стоповыми битами, а не с одним. Если можно настроить «маркировку четности», это добавит еще одно дополнительное битовое время. Передача, например, по номеру 115200-8-M-2 позволит обрабатывать больше времени, чем по 57600-8-N-1, даже несмотря на то, что он будет передавать данные более чем в 1,6 раза быстрее.

Вы можете просто использовать контакт ввода/вывода uC. Единственное, когда вы переключаете или передаете данные на эти контакты, у вас должна быть частота контактов, удвоенная по отношению к скорости передачи данных. Вот как обычно работает UART, он будет сэмплировать битовый сигнал в середине.