collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: SPI Interface duvidas!  (Lida 7847 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
SPI Interface duvidas!
« em: 18 de Março de 2009, 21:49 »
Olá, estava  a estudar comunicação SPI e deparei-me com algumas duvidas.
Estava a seguir este tutorial que para já me parece bastante bom: http://www.arduino.cc/en/Tutorial/SPIEEPROM e até estava a ir todo lançado mas cheguei aqui a uma parte que não estou a perceber (é quase como quando estámos a desmontar algo e o ultimo parafuso não quer sair lool).

Para dar a introdução à duvida:
Citar
The SPI control register (SPCR) has 8 bits, each of which control a particular SPI setting.

SPCR
| 7    | 6    | 5    | 4    | 3    | 2    | 1    | 0    |
| SPIE | SPE  | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

SPIE - Enables the SPI interrupt when 1
SPE - Enables the SPI when 1
DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0
MSTR - Sets the Arduino in master mode when 1, slave mode when 0
CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0
CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0
SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)

Basicamente isto indica que há um registo para controlo da SPI em que se podem definir vários parametros.

Mais para a frente:
Citar
Now we set the SPI Control register (SPCR) to the binary value 01010000. In the control register each bit sets a different functionality. The eighth bit disables the SPI interrupt, the seventh bit enables the SPI, the sixth bit chooses transmission with the most significant bit going first, the fifth bit puts the Arduino in Master mode, the fourth bit sets the data clock idle when it is low, the third bit sets the SPI to sample data on the rising edge of the data clock, and the second and first bits set the speed of the SPI to system speed / 4 (the fastest). After setting our control register up we read the SPI status register (SPSR) and data register (SPDR) in to the junk clr variable to clear out any spurious data from past runs:

 
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  delay(10);
Aqui é a altura em que eles vão definir os tais parametros, percebo perfeitamente isto SPCR = 01010000 mas depois isto SPCR = (1<<SPE)|(1<<MSTR); é que não entendo como é com isto eles colocam esta informação no registo: SPCR = 01010000.

Agora vem a parte engraçada ;D Acabei de perceber aquilo!! É que eu agora até podia apagar este post e não gastar espaço ao LR mas não.
Então o que aquilo faz é simplesmente passar só o SPE para 1 e o MSTR para 1.

BUHHHH

Já agora tanto o SPE como o MSTR estão internamente declarados no Arduino? É que aqui é a unica vez de eles aparecem. E podem-me explicar o que isto faz realmente: 1<<SPE. Eu sei que passa o SPE para 1, mas queria algo um pouco mais aprofundado!


Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re:SPI Interface duvidas!
« Responder #1 em: 18 de Março de 2009, 23:29 »
Olá,

Aproveito para pedir uma ajudinha:

Pelo que percebi do SPI, existem 4 ligações, para a comunicação entre o master e vários slaves.

A ideia que gostava de fazer é: o arduino a interceptar todas as mensagens que são enviadas ao slave (admitimos que apenas temos um slave).

O arduino recebe os dados da linha MOSI num pin e envia-os através de outro pin para o slave.

Obrigado,
Delphi

É possível isto, ou existe algum problema de sincronismo, ou outro qualquer?
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:SPI Interface duvidas!
« Responder #2 em: 19 de Março de 2009, 22:41 »
Então vamos la responder a umas dúvidas :D! A dúvida do metRo_  calculo que esteja relaciona com operaçoes Bitwise, neste caso Bit Shifts.

Quando fazemos:

SPCR = (1<<SPE)|(1<<MSTR);
porque é que dá SPCR = 01010000?

Ok vamos então ver o que está a ser feito. Vamos por partes:

(1<<SPE), lê-se 1 "shiftado" para a esquerda SPE vezes. Se SPE for 6 (SPE = 6) o que irá ser feito é:

00000001 << SPE(=6)  ficando -> 01000000.  Podemos ver que o 1 "andou" seis casas para a esquerda!

De seguida é feito (1<<MSTR). Seguindo o mesmo raciocínio de cima e considerando SPCR=4, facilmente concluímos que o resultado desta operação será 00010000.

Agora temos um OR bit-a-bit entre estes dois valores, é OR bit-a-bit porque só se usa uma "barra"  ' | ' , se se usasse duas "barras"  '||', seria feito um OR lógico de onde resultaria um valor igual a zero se a condição não se verificar e um valor diferente de zero caso se verifique, calor que seguinda a tabela de verdade da operação OR.

O OR bit-a-bit irá fazer a operação OR entre cada bit do mesmo peso dos dois valores, isto é:

       01000000
       00010000
--------------------
       01010000   = SPCR

E assim fica explicado de que modo SPCR fica com este valor.


Para o Delphi, o protocolo SPI é semelhante ao protocolo I2C sendo a diferença (além de usar mais fios) que esta comunicação é Full-duplex, isto é, é possível enviar dados ao mesmo tempo que se recebem dados. Neste caso, a cada clock dado pelo Master é enviado um bit para o slave e o slave envia um bit para o Master. Cabe ao Master decidir o que fazer com os bits que recebe, para certas situações é conveniente o Master consumir os bits que recebe enquanto que em outros casos pode ignora-los.

Agora não sei se percebi bem a ideia do delphi...
« Última modificação: 19 de Março de 2009, 22:43 por tr3s »
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:SPI Interface duvidas!
« Responder #3 em: 19 de Março de 2009, 23:30 »
Fantástico como sempre, agora só falta responderes a esta pequena duvida:
Citar
SPCR
| 7    | 6    | 5    | 4    | 3    | 2    | 1    | 0    |
| SPIE | SPE  | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

Tudo isto então já está incorporado na biblioteca da comunicação SPI?

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:SPI Interface duvidas!
« Responder #4 em: 20 de Março de 2009, 00:25 »
ainda n vi bem a biblioteca SPI do Arduino, mas calculo que sim ;)
Tr3s
Daniel Gonçalves

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Re:SPI Interface duvidas!
« Responder #5 em: 20 de Março de 2009, 09:32 »
A minha ideia tem a ver com um tópico que coloquei aqui há uns tempos: de ligar o arduino a uma moldura digital, e a um SDcard.

Interceptar todos os pedidos da moldura ao cartão, e alterar o nome do ficheiro pedido para enviarmos e mostrarmos o ficheiro que quisermos, por isso é que interceptavamos apenas o MOSI.
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re:SPI Interface duvidas!
« Responder #6 em: 29 de Março de 2009, 03:07 »
Fantástico como sempre, agora só falta responderes a esta pequena duvida:
Citar
SPCR
| 7    | 6    | 5    | 4    | 3    | 2    | 1    | 0    |
| SPIE | SPE  | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

Tudo isto então já está incorporado na biblioteca da comunicação SPI?

Essas constantes estão definidas nos ficheiros "include" que vêm com o AVR-GCC (compilador de C/C++ em que se baseia o ambiente de desenvolvimento do Arduino). Basicamente são os nomes dos bits tal e qual como aparecem na datasheet do AVR no core do Arduino.

A minha ideia tem a ver com um tópico que coloquei aqui há uns tempos: de ligar o arduino a uma moldura digital, e a um SDcard.

Interceptar todos os pedidos da moldura ao cartão, e alterar o nome do ficheiro pedido para enviarmos e mostrarmos o ficheiro que quisermos, por isso é que interceptavamos apenas o MOSI.

Os SDCard não funcionam necessariamente com SPI. Eles suportam uma outra interface mais rápida, que envolve várias linhas de dados.

Algumas observações

1) No bus SPI não é possível alterar os dados que estão a circular sem o "cortar" e meter qualquer coisa "inteligente" pelo meio (e têm que ser cortadas as várias linhas do bus).

2) Os dados que circulam no bus são "sectores" da FAT. O aparelho "interceptador" tem que saber "falar FAT", não há simplesmente um nome de ficheiro que é pedido ao cartão de uma forma directa. Mais, a moldura pode até nem saber "falar FAT" e limitar-se a pedir os sectores x, y, z, ... ao cartão.

Parece-me um projecto extremamente difícil e pouco gratificante...

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:SPI Interface duvidas!
« Responder #7 em: 29 de Março de 2009, 12:21 »
Fantástico como sempre, agora só falta responderes a esta pequena duvida:
Citar
SPCR
| 7    | 6    | 5    | 4    | 3    | 2    | 1    | 0    |
| SPIE | SPE  | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

Tudo isto então já está incorporado na biblioteca da comunicação SPI?

Essas constantes estão definidas nos ficheiros "include" que vêm com o AVR-GCC (compilador de C/C++ em que se baseia o ambiente de desenvolvimento do Arduino). Basicamente são os nomes dos bits tal e qual como aparecem na datasheet do AVR no core do Arduino.

obrigado :)