Existem duas formas de adicionar USB a um projeto: utilizando um circuito integrado de aplicação específica (ASIC) ou selecionando um microcontrolador com suporte de hardware USB integrado. Cada abordagem tem os seus prós e contras.
Implementação de USB com um ASIC:
Uma forma simples de adicionar USB a um projeto é utilizar um ASIC que lida internamente com a comunicação USB e emite os dados e sinais necessários. Um dos ASIC USB mais comuns é uma ponte USB-UART, que é uma interface (relativamente) transparente para transferir dados de um host USB para um sistema embebido. Isto assume frequentemente a forma de uma porta COM virtual no host, que pode ser aberta por uma aplicação de terminal série para comunicação bidirecional. Estes ASICs geralmente também incluem outras características, tais como USB-I2C, controlo de linha de E/S, amostragem analógica e assim por diante. Estes dispositivos estão prontos para serem incorporados num projeto, exigindo um esforço mínimo de implementação, o que os torna ideais para adições de última hora.
No entanto, existem algumas limitações na utilização destes ASICs. Uma desvantagem é que representam uma abordagem universal. Se existir alguma funcionalidade que não possa ser implementada com o ASIC, esta abordagem torna-se impraticável. Outra desvantagem são os componentes adicionais incluídos na lista de materiais (BOM). Estas peças requerem área na placa de circuito impresso (PCB) e aumentam o custo do projeto.
Implementação de USB com um Microcontrolador:
Se for necessária comunicação USB antes da seleção do microcontrolador, uma boa opção é considerar um dispositivo com periféricos USB integrados. Isto pode ser encontrado numa ampla variedade de microcontroladores, desde dispositivos de 8 bits de alta eficiência até dispositivos de 32 bits de alto desempenho. A seleção do microcontrolador adequado depende da aplicação.
Para aplicações simples, como teclados, ratos e conversores USB-UART, os MCU de 8 bits são uma boa escolha. Estes dispositivos oferecem uma combinação de tamanho reduzido, baixo consumo de energia, baixo custo e funcionamento nativo a +5V.
Para aplicações computacionalmente intensivas, os MCU de 32 bits devem ser considerados, uma vez que são mais poderosos e têm mais memória disponível. No entanto, os MCU de 32 bits podem ser caros, grandes e ter uma gama de tensão de funcionamento limitada. Uma tabela comparativa dos prós e contras das diferentes abordagens é apresentada abaixo.

Figura 1: Tabela comparativa das diferentes abordagens de implementação
Desenvolvendo aplicações USB em AVR DU
Existe uma grande variedade de microcontroladores com periféricos USB. Esta secção irá focar-se na família de microcontroladores AVR® DU, sucessora da família XMEGA® D.
A família AVR DU introduz diversas melhorias em relação aos dispositivos mais antigos. Para começar, já não requer um cristal exterior, o que reduz o custo da lista de materiais. A família DU contém também um regulador de queda de tensão linear (LDO) integrado para o circuito USB, caso o microcontrolador seja alimentado com 3,9 V ou mais. Por fim, a família AVR DU inclui a funcionalidade de desativação da Interface de Depuração Programável (PDID), que bloqueia permanentemente o dispositivo, impedindo que o microcontrolador seja lido, apagado ou reprogramado.
Os exemplos seguintes são aplicações simples desenvolvidas para a família AVR DU. Estes exemplos utilizam o MPLAB® Code Configurator (MCC), uma ferramenta gratuita que configura e gera uma API para os periféricos de hardware integrados, utilizando a biblioteca de pilha USB incluída. A biblioteca é nativamente compatível com a classe de dispositivos de comunicação (CDC) e dispositivos de interface humana (HID), como teclados e ratos.

Figura 2: Abertura do projeto USB-SPI/I2C no MCC
Aplicação CDC: USB para SPI/I2C
Este exemplo implementa um conversor USB para SPI/I2C que funciona sem um driver personalizado. Isto é possível identificando o microcontrolador como um dispositivo genérico da classe CDC. A maioria dos sistemas operativos possui um driver genérico para este tipo de comunicação, permitindo ao utilizador enviar e receber dados sem instalar um driver específico.
Para iniciar uma operação em série, o utilizador envia uma "frase" formatada especificamente para o microcontrolador. Os dados recebidos pelo microcontrolador são analisados e convertidos (se possível) numa operação de barramento SPI ou I2C. O microcontrolador reporta então erros de comando, erros de comunicação (apenas I2C) ou dados lidos durante a troca. Para o SPI, as "frases" têm o seguinte formato:
spi eeprom/dac/usd
Onde "eeprom", "dac" e "usd" se referem aos componentes do Curiosity Nano Explorer utilizados nesta aplicação. O seguinte excerto de código é um exemplo de um comando de utilizador para comunicar com um dispositivo EEPROM (25CSM04) na placa Explorer. Este comando lê o registo de identificação do chip de memória.
eeprom spi 9F 00 00 00 00 00
> FF 29 CC 00 01 00
O I2C tem três formatos semelhantes, mas diferentes, para "frases", uma vez que o barramento I2C é partilhado entre todos os dispositivos ligados.
i2c
i2c
i2c
Semelhante ao SPI, um teste rápido disto é ler o ID do fabricante de um sensor, neste caso, um sensor de temperatura MCP9808.
i2c 1c wr 06 02
> 00 54
Este exemplo está disponível no Github.
Aplicação HID: Teclado USB.
Um exemplo simples, mas facilmente adaptável, de comunicação USB é a implementação de um teclado. Normalmente, quando um teclado deteta o pressionar de uma tecla, envia um relatório ao host indicando a(s) tecla(s) pressionada(s) pelo utilizador. Quando a tecla é libertada, é enviado outro relatório para indicar que o utilizador a libertou.
Este exemplo está implementado de forma diferente. Em vez de reportar uma única tecla ou botão como um teclado padrão, este exemplo reporta múltiplas entradas de teclas para um único toque de botão, criando macros de função. Por exemplo, premir SW0 no AVR64DU32 Curiosity Nano envia um relatório com as teclas "AVR DU" para o computador anfitrião. O LED no Curiosity Nano indica o estado do Caps Lock no sistema anfitrião.
Além do Curiosity Nano, está também ligado um Click 2x2 através da placa adaptadora Curiosity. Os botões são atribuídos às macros: CTRL+C (copiar), CTRL+V (colar), CTRL+Z (desfazer) e CTRL+X (recortar). Um botão externo opcional também pode ser ligado para enviar ALT+F4 para o host. Este exemplo está disponível no GitHub.
Conclusão:
Embora o USB seja um dos tipos de comunicação série mais complexos encontrados em sistemas embebidos, a sua ubiquidade representa um valor acrescentado significativo para os projetos. O USB pode ser facilmente adicionado a um projeto utilizando um ASIC, com o custo de uma lista de materiais maior, ou, em alternativa, pode ser selecionado um microcontrolador com hardware USB integrado. A partir daí, terá de decidir se o seu projeto baseado em microcontrolador requer o poder de um dispositivo de 32 bits ou se um dispositivo de 8 bits mais simples, mas mais económico, como a família AVR DU, será suficiente para o projeto.
Sobre o autor:
Robert Perkel é Engenheiro de Aplicações na Microchip Technology. Nesta função, desenvolve conteúdos técnicos, como notas de aplicação, artigos e vídeos. É também responsável por analisar casos de utilização de periféricos e desenvolver exemplos de código e demonstrações. Perkel formou-se em Engenharia Informática pela Virginia Tech.
