Ir ao conteúdo

Duvida SPI


Francisco. F

Posts recomendados

Postado

Boa tarde pessoal,

Gostaria de saber se é possivel configurar os pinos de de um bus SPI

Preciso usar I2C e SPI e tenho um pic16f690.

Os Pinos para SPI já estão a ser usados para I2C e o outro pino está ligado a um LCD.

Qualquer ajuda é bem vinda.

Abraço

Postado

Implemente um dos dois por Software.

Observe que quando um Micro tem alguns pinos que podem ser usados para algum hardware,não siginifica que voce tem que usá-los.

Eu não costumo implementar RS232 e I2C por Hardware,pois geralmente eles usam PORTs diferentes,e se eu quiser usar um PORT inteiro,fica comprometido,e além do mais,I2C e RS232 não é uma implementação crítica.

Postado

Para interfaces síncronas (como spi, i2c) é bem fácil desenvolver uma rotina para implementar essas comunicações via software.

Interfaces assíncronas, como RS232, são mais complicadas para se emular por software, já que exigem tempo crítico, e ocupam muito tempo do processador.

Postado

Fazer "bit-banging" de uma SPI é algo de certa forma simples, os tempos envolvidos não são tão críticos por ser uma interface sincrona.

Pensemos, a SPI envia 8bits ou 16 (vamos considerar 8 para ser mais simples) de dados seguidos de 8 pulsos de clock, e tem um estado de "Idle" para indicar quando o barramento está livre.

Um modo de se fazer o bit-banging SPI pode ser da seguinte forma em pseudo-código:



pino SCK bit
pino SDI bit
pino SDO bit
pino CS bit

bufferSPI byte

SCK := 1 %fica em idle state

transmitirSPI:
bufferSPI := dadode8bits

CS := 0
SCK := 0 %tira o bus de idle state

para I := 0 até I:= 7 faça
SDO := ((bufferSPI AND 0x80) >> 8) %cospe 1bit do dado em SDO
bufferSPI := bufferSPI << 1 %desloca o proximo bit
geraatrasodemeiotbit
SCK := 1
geraatrasodemeiotbit
SCK := 0
fimpara

SCK := 1 %bus livre
CS := 1 % libera o escravo
fimtransmistirSPI

Estou meio sem tempo de estruturar o bit-banging da recepção, use o mesmo raciocionio ai e tente estruturar, e qualquer problema da um toque.

Assim que eu folgar aqui no trampo estruturo a faltante ok, mas isso nao te insenta de pesquisar um pouquinho e tentar fazer o caminho inverso do algoritmo acima.

Abs.

Postado

agradeço as dicas mas ainda nao consegui comunicar.

Acho que já implementei o SPI por software mas nao encontro um codigo que me ajude, nunca trabalhei com este tipo de comunicaçao.

Quem tiver um codigo exemplo que possa postar aqui agradecia.

Para já o que fiz foi isto:

#define CS PIN_C3

#use spi(DI=PIN_A5, DO=PIN_A4, CLK=PIN_A1, ENABLE=PIN_A3, BITS=16)

void ad5231()

{

output_high(CS);

spi_xfer(0b00100000);

spi_xfer(0x02);

spi_xfer(0x00);

output_low(CS);

}

Sugestoes para o que fiz mal?!

Postado

Francisco, tomemos cuidado para não confundirl, ao usar as rotinas da SPI do CCS você forca que o microcontrolador use o modulo SPI via hardware, desse modo fica impossivel implementar um bit-bang (ou via software).

Da uma pensada naquele meu algoritmo no post anterior e tente converte-lo e testar em linguagem C, não é muito difícil.

Abs.

Postado

Filipe repare na ajuda do CCS,

Ao usar #use spi(DI=PIN_A5, DO=PIN_A4, CLK=PIN_A1, ENABLE=PIN_A3, BITS=16) eu estou a forçar o micro a usar o spi nos pinos que me interessam.

A usar #use spi(FORCE_HW, BITS=16, stream=SPI_STREAM) aí sim, estou a forçar o micro a usar o hardware. (force_hw= force hardware)

Pelo que li acho que estou correcto.

Mas vou tentar colocar o seu algoritmo em linguagem C depois se conseguir posto para veres.

Abraço

Postado
Filipe repare na ajuda do CCS,

Ao usar #use spi(DI=PIN_A5, DO=PIN_A4, CLK=PIN_A1, ENABLE=PIN_A3, BITS=16) eu estou a forçar o micro a usar o spi nos pinos que me interessam.

A usar #use spi(FORCE_HW, BITS=16, stream=SPI_STREAM) aí sim, estou a forçar o micro a usar o hardware. (force_hw= force hardware)

Pelo que li acho que estou correcto.

Mas vou tentar colocar o seu algoritmo em linguagem C depois se conseguir posto para veres.

Abraço

Está correto.

Com que hardware você está tentando se comunicar?

Uma coisa, tente definir o baudrate, em 100000


#use spi(DI=PIN_A5, DO=PIN_A4, CLK=PIN_A1, ENABLE=PIN_A3, BITS=16, BAUD=100000)

Postado

o hardware que estou a tentar comunicar é o AD5231, é um potenciometro digital.

O pic é o 16f690.

Já experimentei mudar o baudrate e continuo com os mesmos problemas.

Nao sei se será dos registos pois o potenciometro varia de resistencia sempre que altero os dados.

Mas para valores que nao seriam os esperados.

Acham que está a comunicar com o AD5231?

Postado

A comunicação deve estar ocorrendo, apenas pode ser algum problema no comando de escrita.

Estas a obedecer os comandos da tabela dada no datasheet do mesmo?

Da uma olhada na pagina 14:

http://www.analog.com/static/imported-files/data_sheets/AD5231.pdf

Veja que para escrever um dado você deve respeitar a seguinte ordem:

Bytedecomando | Bytededados1 | Bytededados0

Eu sugeriria a você para usar a SPI no modo 8bits, fica mais fácil de controlaor os bytes assim,

Exemplo para escrita do valor 0x100:



//escreve 0x100 no AD5231

spi_xfer (0x0B); //envia comando
spi_xfer (0x01); //envia high byte
spi_xfer(0x00); //envia low byte

Talvez o fato de usares a SPI em 16bits esteja causando o efeito indesejado no seu AD5231.

faça os testes e qualquer probleema da um toque.

Abs.

Postado

A comunicaçao está a ocorrer, confirmei isso no osciloscopio.

Tinha sinal de clock no clk, tinha pulsos no sdo do micro.

Na Sdi do micro vi uma coisa que nao sei se é estranha ou nao, Tinha 5 volts e dava os pulsos para baixo ??!

Alem disso desmontei e voltei a montar o hardware e continua igual.

alguma sugestão?

Tambem já tinha experimentado trabalhar a 8 bits como me sugeriu filipe e enviei a sequencia correcta como esta no datasheet mas continua sem funcionar.

Já nao sei de onde pode vir o problema.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...