Para um projeto, eu gostaria que três PICs (dois escravos PIC18F4620, um mestre PIC18F46K22) se comunicassem pelo barramento I2C. Posteriormente, mais escravos podem ser adicionados (como EEPROM, SRAM, ...). Estou escrevendo o código para esses PICs em C usando o compilador C18. Eu procurei muito na Internet, mas não consegui encontrar bibliotecas para lidar com o (M) SSP periférico. Eu li a folha de dados de ambos os PICs no (M) SSP periférico no modo I2C, mas não consegui descobrir como fazer interface com o barramento.
Então, eu preciso de bibliotecas mestres e escravas.
O que você recomenda? Você tem essa biblioteca em algum lugar? Ele está embutido no compilador e, se sim, onde? Existe um bom tutorial em algum lugar na rede?
Respostas:
Microchip escreveu notas de aplicação sobre isso:
As notas de aplicação estão funcionando com o ASM, mas podem ser portadas para C facilmente.
Os compiladores C18 e XC8 gratuitos da Microchip possuem funções I2C. Você pode ler mais sobre eles na documentação das bibliotecas do compilador , seção 2.4. Aqui estão algumas informações de início rápido:
Configurando
Você já possui o compilador C18 ou XC8 da Microchip. Ambos possuem funções I2C integradas. Para usá-los, você precisa incluir
i2c.h
:Se você quiser dar uma olhada no código fonte, você pode encontrá-lo aqui:
installation_path
/v
x.xx
/h/i2c.h
installation_path
/v
x.xx
/src/pmc_common/i2c/
installation_path
/v
x.xx
/include/plib/i2c.h
installation_path
/v
x.xx
/sources/pic18/plib/i2c/
Na documentação, você pode encontrar em qual arquivo da
/i2c/
pasta uma função está localizada.Abrindo a conexão
Se você estiver familiarizado com os módulos MSSP da Microchip, saberá que eles primeiro precisam ser inicializados. Você pode abrir uma conexão I2C em uma porta MSSP usando a
OpenI2C
função É assim que é definido:Com
sync_mode
, você pode selecionar se o dispositivo é mestre ou escravo e, se é escravo, se deve usar um endereço de 10 ou 7 bits. Na maioria das vezes, 7 bits são usados, especialmente em pequenas aplicações. As opções parasync_mode
são:SLAVE_7
- Modo escravo, endereço de 7 bitsSLAVE_10
- Modo escravo, endereço de 10 bitsMASTER
- modo mestreCom
slew
, você pode selecionar se o dispositivo deve usar a taxa de giro. Mais sobre o que está aqui: Qual é a taxa de variação para o I2C?Dois módulos MSSP
Há algo de especial nos dispositivos com dois módulos MSSP, como o PIC18F46K22 . Eles têm dois conjuntos de funções, um para o módulo 1 e outro para o módulo 2. Por exemplo, em vez de
OpenI2C()
, eles têmOpenI2C1()
eopenI2C2()
.Ok, então você configurou tudo e abriu a conexão. Agora vamos fazer alguns exemplos:
Exemplos
Exemplo de gravação mestre
Se você estiver familiarizado com o protocolo I2C, saberá que uma sequência de gravação principal típica se parece com isso:
Inicialmente, enviamos uma condição START. Considere isso pegando o telefone. Em seguida, o endereço com um bit de gravação - discando o número. Nesse ponto, o escravo com o endereço enviado sabe que está sendo chamado. Ele envia uma confirmação ("Olá"). Agora, o dispositivo mestre pode enviar dados - ele começa a falar. Ele envia qualquer quantidade de bytes. Após cada byte, o escravo deve aceitar os dados recebidos ("sim, eu ouvi você"). Quando o dispositivo mestre termina de falar, ele desliga com a condição STOP.
Em C, a sequência de gravação do mestre ficaria assim para o mestre:
Exemplo de leitura principal
A sequência de leitura principal é um pouco diferente da sequência de gravação:
Novamente, o mestre inicia a chamada e disca o número. No entanto, ele agora quer obter informações. O escravo primeiro atende a chamada e depois começa a falar (enviando dados). O mestre reconhece cada byte até que ele tenha informações suficientes. Então ele envia um Not-ACK e desliga com uma condição STOP.
Em C, isso seria assim para a parte principal:
Código escravo
Para o escravo, é melhor usar uma rotina de serviço de interrupção ou ISR. Você pode configurar seu microcontrolador para receber uma interrupção quando seu endereço for chamado. Dessa forma, você não precisa verificar o ônibus constantemente.
Primeiro, vamos configurar o básico para as interrupções. Você precisará ativar as interrupções e adicionar um ISR. É importante que os PIC18s tenham dois níveis de interrupção: alto e baixo. Vamos definir o I2C como uma interrupção de alta prioridade, porque é muito importante responder a uma chamada I2C. O que vamos fazer é o seguinte:
GOTO
instrução ao ISR geral no vetor de interrupção de alta prioridade. Não podemos colocar o ISR geral diretamente no vetor porque ele é muito grande em muitos casos.Aqui está um exemplo de código:
A próxima coisa a fazer é ativar a interrupção de alta prioridade quando o chip é inicializado. Isso pode ser feito com algumas manipulações simples de registro:
Agora, interrompemos o trabalho. Se você está implementando isso, eu verificaria agora. Escreva um básico
SSPISR()
para começar a piscar um LED quando ocorrer uma interrupção do SSP.Ok, então você tem suas interrupções funcionando. Agora vamos escrever um código real para a
SSPISR()
função. Mas primeiro alguma teoria. Distinguimos cinco tipos diferentes de interrupção I2C:Você pode verificar em que estado está verificando os bits no
SSPSTAT
registro. Este registro é o seguinte no modo I2C (os bits não utilizados ou irrelevantes são omitidos):Com esses dados, é fácil ver como ver em que estado o módulo I2C está:
No software, é melhor usar o estado 5 como padrão, assumido quando os requisitos para os outros estados não são atendidos. Dessa forma, você não responde quando não sabe o que está acontecendo, porque o escravo não responde a um NACK.
De qualquer forma, vamos dar uma olhada no código:
Você pode ver como pode verificar o
SSPSTAT
registro (primeiro ANDed0x2d
para que tenhamos apenas os bits úteis) usando máscaras de bits para ver que tipo de interrupção temos.É seu trabalho descobrir o que você deve enviar ou fazer quando responde a uma interrupção: depende da sua inscrição.
Referências
Mais uma vez, gostaria de mencionar as notas de aplicação que a Microchip escreveu sobre o I2C:
Há documentação para as bibliotecas do compilador: Documentação das bibliotecas do compilador
Ao configurar algo você mesmo, verifique a folha de dados do seu chip na seção (M) SSP para comunicação I2C. Usei o PIC18F46K22 para a parte principal e o PIC18F4620 para a parte escrava.
fonte
Em primeiro lugar, eu recomendaria mudar para o compilador XC8 simplesmente porque é o mais recente. Existem bibliotecas periféricas disponíveis, mas nunca as usei muito. Verifique no site da Microchips para obter detalhes e a documentação.
Ok, eu tenho algumas rotinas básicas muito antigas aqui para comunicações I2C eeprom que usei há muito tempo com um PIC16F e o antigo compilador Microhip de gama média (pode ter sido o Hi-Tech), mas acho que eles podem funcionar bem com o PIC18, pois acho que o periférico é o mesmo. De qualquer forma, você descobrirá muito rapidamente se tudo é diferente.
Eles faziam parte de um arquivo maior que foi usado em um projeto de registrador de temperatura, então eu rapidamente retirei todas as outras funções não relacionadas e salvei como os arquivos abaixo, então é possível que eu tenha feito uma bagunça, mas espero que você será capaz de ter uma idéia do que é necessário (pode até funcionar, você nunca sabe ;-))
Você precisará verificar se o arquivo principal do cabeçalho está correto e verificar / alterar os pinos para garantir que sejam os pinos periféricos I2C corretos e os nomes dos registros, se forem do compilador Hi-Tech, que fez as coisas de maneira um pouco diferente referente à convenção de nomenclatura de registros.
Arquivo I2C.c:
Arquivo de cabeçalho I2C.h:
fonte
SSP1ADD = ((_XTAL_FREQ/100000)/4)-1;
para 1KHz, etc.Os compiladores XC8 e XC16 incluem bibliotecas para I2C.
O problema que encontrei é que a documentação não é muito boa! Se você usar os exemplos da documentação do Microchip, estará sem sorte. Mesmo o suporte ao Microchip não pode ajudá-lo. Eu mesmo estava lá.
Há algum tempo, trabalhei com o microcontrolador da série PIC24EP512GP e a biblioteca não funcionou para mim, conforme documentado pelo Microchip.
fonte