Share

O protocolo SPI

Continuando a série de artigos sobre acesso a dispositivos típicos de sistemas embarcados no Linux, vamos abordar nesse artigo, Comunicação SPI em Linux. Por enquanto apenas visando softwares em espaço de usuário.

O protocolo SPI (Serial Peripheral Interface bus) foi definido pela Motorola. É um protocolo serial sincrono semelhante ao protocolo I2C, mas que utiliza três fios para comunicação e pode alcançar velocidades superiores ao I2C. A interface física é composta pelos sinais MOSI, MISO e SCLK que ligam, em barramento, a todos os dispositivos. Pode existir também um quarto fio para seleção do dispositivo com o qual a comunicação será feita.

Assim como o I2C, o SPI apresenta o conceito de mestre e escravo da comunicação. O mestre inicia a transferência de dados e controla o sinal de clock para estabelecer o sincronismo. A transferência de dados processa-se em full-duplex sobre os sinais MOSI (Master Output Slave Input) e MISO (Master Input Slave Output). A taxa de transferência é definido pelo processador, no papel de master, através do sinal SCLK. A seleção do periférico é feita através do sinal SSn. Nessa configuração, pode haver um mestre e vários escravos no barramento SPI.

spi_01

O fluxo de dados é controlado pelo master através do sinal de clock SCLK. Só há transferência enquanto o master pulsar o sinal SCLK. Em repouso o sinal SCLK encontra-se estável com o valor lógico definido por CPOL.

Habilitando o driver SPI no Kernel Linux

Assim como para o I2C, o Linux disponibiliza um driver genérico para SPI. Este cria entradas no diretório /dev para que o usuário possa acessar o dispositivo SPI como um arquivo através da funções open(), close(), read() e write(). Por ser um driver genérico, ele pode não atender a todos os requisitos de seu projeto. Se você precisa usar, por exemplo, o chipset ENC28J60 para construir uma interface ethernet, você precisará de um driver específico. Para esse chipset já existe um driver no Linux. Se você precisa de um driver específico para um periférico que não tem suporte no Linux, você deverá escrever o driver.

Saiba que para se comunicar com um dispositivo SPI através do Linux, o processador da placa que você está usando, precisa ter o driver do controlador SPI presente no kernel. No artigo Linux Device Drivers – Diferenças entre Drivers de Plataforma e de Dispositivo, explico em detalhes o funcionamento geral dos drivers. Consulte as referências.

Agora, vamos habilitar driver no kernel. Selecione Device Driver:

driver_i2c_01

Habilite o suporte à SPI apertando ‘y’, depois aperte ENTER:

spi_driver_01

Habilite o suporte ao driver SPI como módulo apertando ‘m’ ou ‘y’ para deixar o driver embutido no kernel:

spi_driver_02

Agora basta compilar o kernel.

Comunicação SPI em Linux

Agora veremos um exemplo de software para escrever e ler um dispositivo qualquer que utiliza o protocolo SPI. O dispositivo mais simples para fazer um teste é uma memoria flash. Mas pode ser usado qualquer outro dispositivo, como um módulo RFID.

Exemplo de software para SPI:

Para que o código seja compilado, é necessário incluir o seguinte código de cabeçalho:

Referências:

http://www.embarcados.com.br/linux-device-drivers-diferencas-entre-drivers-de-plataforma-e-de-dispositivo/

http://www.embarcados.com.br/spi-parte-1/

https://www.kernel.org/doc/Documentation/spi/spidev

https://www.kernel.org/doc/Documentation/spi/spidev_test.c

[emailMarketingFoot]

Translate »