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
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.
byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00);
e você encontrará emresult
os 32 bits de que você precisa