Como ler dados usando Arduino SPI

na folha de dados, afirma-se que devo aplicar 32 relógios seriais para obter os 32 bits de dados. Como posso Eu programo isso é Arduino?

Comentários

  • Sugiro que você abra os exemplos da biblioteca SPI e verifique-os. De qualquer forma, o código deve ser byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); e você encontrará em result os 32 bits de que você precisa
  • Já fiz isso. mas o chip de energia Estou usando o STPM10 e ele sugere que devo usar o SPI síncrono simplex onde o MOSI não está conectado. Há apenas um diagrama de tempo para alternar entre ler bytes e escrever bytes. Quando usei SPI.transfer (), os dados não estável e acho que não é confiável
  • Como se diz que não é confiável? O periférico é full duplex e, de acordo com a forma como funciona, a única maneira de receber dados é enviando dados fictícios. Se o MOSI for não conectado, bem, isso ‘ não importa ; observe, entretanto, que você não pode ‘ usar o pino MOSI para outras tarefas. A propósito, você se lembrou de configurar corretamente o pino de seleção de escravo do outro periférico? Você usou o pino SS na placa Arduino ou em outro?

Resposta

Você chama SPI.transfer() quatro vezes, cada vez salvando o valor retornado em uma variável após o deslocamento de bit adequado.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Presumo que seja o menos significativo byte é recebido primeiro. Certifique-se de que o modo SPI é o correto, conforme indicado em sua folha de dados.

Se o escravo não consegue lidar com a desativação entre bytes (que é o que SPI.transfer() fará no final da transação), então você pode tentar a abordagem SPI de hardware do st2000 ou usar SPI bitbanged com shiftIn().

Comentários

  • Não tenho certeza se isso vai funcionar. Realmente precisamos saber como funciona o escravo SPI antes de assumirmos como ele reagirá. Além disso, se a linha Chip Select for ativada e desativada com cada transação SPI de 8 bits, quão bem o escravo SPI foi projetado? Ou seja, tal escravo SPI poderia facilmente sair de sincronia com o mestre SPI. Especificamente, como você tem certeza de qual byte de 8 bits está realmente lendo?
  • @ st2000 O OP achou por bem não fornecer detalhes suficientes; nada além de suposições podem ser feitas até que isso mude.
  • Todos os exemplos que eu ‘ vi usam SPI, transfer (0) para ler dados em vez de SPI.transfer (0xff). Eles também usam SPI.transfer para escrever dados também. Eu ainda não ‘ descobri o que o SPI faz com o 0 ou 0xff quando você está realmente lendo dados. Isso é enviado ao escravo?
  • @ S.Imp Eles ‘ são bytes fictícios. Você pode enviar o que quiser, o dispositivo na outra extremidade ainda irá descartá-los, se é que se importa com os dados. SPI.transfer() é sempre usado em parte devido à natureza full-duplex intrínseca do SPI e (como resultado do primeiro fator), em parte devido à maneira como a maioria dos MCUs implementa seus periféricos SPI. Assim que o relógio começa a funcionar, há sempre ” dados ” nas linhas MOSI e MISO, ‘ cabe a cada participante no barramento lê-lo ou não, decidindo com base em qualquer protocolo predefinido de camada superior se os ” dados ” é significativo ou não.
  • Não seria ‘ totalmente incorreto dizer que você pode ‘ l verdadeiramente sem escrever em um barramento SPI e vice-versa também. Portanto, faz sentido simplesmente projetar um periférico que pega um byte em um registro e, 8 ciclos depois, retorna um byte em outro (ou até mesmo) registro, apenas para generalizar os casos de uso. Em seguida, ‘ cabe ao usuário ‘ aplicação decidir se ‘ é interessado apenas no byte que foi escrito em primeiro lugar (TX) ou aquele que foi lido (RX) ou ambos (TX e RX). Além disso, daí o nome ambíguo transfer(), uma vez que desempenha funções de leitura e escrita.

Resposta

Sparkfun tem uma boa explicação do que é SPI:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

O IDE do Arduino possui uma biblioteca SPI que vem com o IDE.
http://www.arduino.cc/en/Reference/SPI

A biblioteca vem com dois exemplos:
Usando SPI para ler um sensor de pressão barométrica
Controlando um potenciômetro digital usando SPI

Resposta

O objetivo é ler 32 bits usando a porta SPI do dispositivo (desconhecido).

Se o dispositivo tolerar a atividade da linha SPI Chip Select (passando de inativo para ativo para inativo para cada leitura de byte de 8 bits), você deve ser capaz de obter os 32 bits de dados desejados executando 4 8 consecutivos bit SPI lê.

No entanto, se o dispositivo não tolerar a atividade de linha SPI Chip Select acima (ou seja, se o dispositivo exigir que o SPI Chip Select esteja ativo para toda a transação SPI de 32 bits), você não pode separar a transação de 32 bits em 4 transações SPI individuais de 8 bits sem controlar a linha SPI Chip Select. O exemplo de código a seguir ilustra como isso é feito:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

O exemplo acima vem da biblioteca Arduino SPI página da web e é uma transferência de 16 bits (não de 32 bits). Para codificar uma transferência de 32 bits, continue chamando o método SPI.transfer usando o parâmetro SPI_CONTINUE.

adicionado posteriormente …

Parece que as pessoas estão desencorajando o uso dos métodos DueExtendedSPI . E SPISettings e SPI.beginTransaction () devem ser usados? Se for assim, esta página mostra um exemplo de código onde o código está controlando explicitamente a linha SPI Chip Select (procure slaveAPin & slaveBPin). Observe como o código está lendo 24 bits do escravo A e gravando 8 bits no escravo B. Para ler 32 em vez de 24 bits, precisamos alterar um segmento do código (junto com algumas outras alterações de suporte) desta maneira:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Comentários

  • Precisamos realmente ver as especificações do dispositivo SPI escravo para compor mais resposta específica.
  • Eu uso a placa de avaliação STPM10. A conexão é um SPI síncrono simplex, e o MOSI do Arduino não está conectado a nada. Há um diagrama de tempo para alternar entre somente leitura e somente gravação. Meu problema é como ler os dados dos registradores do chip. Usei SPI.transfer, mas não ‘ não acho que os dados sejam confiáveis.
  • O diagrama de tempo STPM10 encontrado na página 11 dele ‘ A especificação não parece uma transação SPI padrão. Estou inclinado a dizer que você não pode usar a biblioteca Arduino SPI. Em vez disso, você pode precisar fazer isso totalmente no software. Por exemplo, não acredito que haja uma linha ” SYN ” no barramento SPI padrão. E eu não ‘ não acredito que a linha Chip Select deva subir antes do final da transação SPI.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *