Módulo SPI

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Módulo SPI

Mensagempor alessandro » 29 Ago 2007 08:35

Assim como em I2C, no módulo SPI não é obrigatório o uso de interrupção para o funcionamento do mesmo?

Grato,


Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Fábio Pereira » 29 Ago 2007 09:11

Não
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor lrfad2 » 29 Ago 2007 10:13

mas se vc não utilizar a interrupção, vai ter que ficar esperando o término do evento (comunicação do device).
No caso se ele estiver danificado e vc não tratar, pode travar o programa e as vezes o device nem é fundamental para o funcionamento do equipamento
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor xultz » 29 Ago 2007 13:32

Irfad, desculpa o offtopic, mas esse teu avatar do Batman é muito engraçado :)
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor alessandro » 29 Ago 2007 14:07

Então, estou fazendo os testes aqui sem interrupção mesmo por equanto, mas surgiu outra duvida.

Depois de enviar os dados, como entro no modo de recebimento dos dados do escravo? Fico aguardando?

Estou realizando uma comunicação com uma eeprom, enviei o OPCODE e endreço, agora preciso receber a resposta da memoria.

Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor proex » 29 Ago 2007 14:56

Depois de enviar o endereçamento da memoria, vc deve continuar enviando pulsos de clock pela SPi para que o dispositivo possa te responde.

Envie 0xFF depois do endereçamento e leia o RXbuffer depois disso.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Fábio Pereira » 29 Ago 2007 16:02

O mais legal de tudo é que ninguém sabe de qual chip o autor do post está falando pois ele sequer informou ...

Fica tão difícil ajudar assim ... :(

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor alessandro » 29 Ago 2007 16:33

LPC2148, desculpe o detalhe.

Na realidade o buffer (registrador) que recebe é o mesmo que é enviado (S0SPDR), certo?

Neste caso, envio o sinal de clock carregando 0xFF em S0SPDR, logo em seguida leio S0SPDR, é isso?


Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor jeanfernandes » 09 Set 2007 07:13

Quem sabe isto não funciona ?


Código: Selecionar todos
/*************************************************************************
   Arquivo                  :   SSP.C
   Data de Criação      :   15 de Dezembro de 2006
   Revisão                  :   1.0
   Processador            : ARM - LPC2148
   Ambiente               : KEIL - UVISION 3.0 (V3.21)
   Compilador            : (CA.EXE V2.4a)
   Autor                     :   ENG. JEAN PEREIRA FERNANDES
      Kernel de controle da SSP (SPI1)
   Histórico               :
**************************************************************************/

/*************************************************************************
   DEFINE DO MODULO
**************************************************************************/

#define _SSP_

/*************************************************************************
   INCLUDE - GERAL
**************************************************************************/

#include <LPC214X.H>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <GERAL.H>

/*************************************************************************
   INCLUDE - LOCAL
**************************************************************************/

#include <SSP.H>

/*************************************************************************
   FUNCOES
**************************************************************************/

/*************************************************************************
   FUNCAO            : SSP_SETUP
   PARAMETROS      : NENHUM
   RETORNO            : NENHUM
   DESCRICAO         : INICIALIZA A SSP (8 bits, Master, SCK,MISO,MOSI,SSEL)
**************************************************************************/
void ssp_setup(void)
{
   dword   pconfig;

   /*
      Dados Atuais :



      PCLK       = CCLK = 60 Mhz (VPBDIV = 0x01)
      SCR       = 0x00    (valor minimo)
      SSPCPSR = 0x04   (valor minimo)
      FMC : Freq. Master Clock
      FMC         = PCLK/(SSPCPSR*(SCR+1)
      FMC         = 60/(4*(0 + 1)) = 15 MHz

   */

   ssp_bus_speed(LOW_SPEED);

   /* Inicializa os pinos da SSP, SCK,MISO,MOSI,SSEL */
   pconfig      = PINSEL1;
   PINSEL1      = pconfig |
                     PINSEL1_SSP_SCK    |
                     PINSEL1_SSP_MISO   |
                     PINSEL1_SSP_MOSI;


}


/*************************************************************************
   FUNCAO            : SSP_BUS_SPEED
   PARAMETROS      : SPEED -
   RETORNO            : NENHUM
   DESCRICAO         : AJUSTA A VELOCIDADE DO BUS
**************************************************************************/
void ssp_bus_speed(byte speed)
{
   byte    conta, dado;

   /* SSPCR1:SSE = 0 - Desabilita a SSP para alteracao de parametros */
   SSPCR1      = 0x00;    /*
   /*
      Habilita a SSP : 8 bits, SPI, CPOL = CPHA = 0   
      CPOL = CPHA = 0, Dado na subida do clock, com LSB ja no primeiro clock
      SCK com estado de espera em "0"
   */
   SSPCR0       = 0x0007;

   SSPCPSR      =   speed;      //   divisor do preescaler, para PCLK = VPB = 60 Mhz

   /* Habilita a SSP no modo master SSPCR1:SEL = 1 */
   SSPCR1      = 0x02;

   
   /* Limpa a FIFO RX da SSP */
   if ((SSPSR & SSPSR_RNE)) {
      for (conta = 0; conta < 8; conta++) {
         while ((SSPSR & SSPSR_RNE))
            dado = SSPDR;
      }
   }

}


/*************************************************************************
   FUNCAO            : SSP_ESVAZIA_PILHA_RX
   PARAMETROS      : NENHUM
   RETORNO            : NENHUM
   DESCRICAO         : ESVAZIA A PILHA DE RECEPCAO
**************************************************************************/
void ssp_esvazia_pilha_rx(void)
{
   word dado = 0x0000;

   while ((SSPSR & SSPSR_RNE)) {
      dado = SSPDR;
   }
}

/*************************************************************************
   FUNCAO            : SSP_ENVIAR_BYTE
   PARAMETROS      : DADO
   RETORNO            : RETORNO DO DISPOSITIVO (WORD)
   DESCRICAO         : ENVIA UM BYTE PARA SSP
**************************************************************************/
byte ssp_enviar_byte(const byte dado)
{
   /* Aguarda a fifo TX ficar vazia */
   while (!(SSPSR & SSPSR_TFE));

   /* Envia o byte */
   SSPDR = dado;

   /* Aguarda a fifo TX ficar vazia */
   while (!(SSPSR & SSPSR_TFE));

   /* Aguarda a SSP desocupar para pode realizar a leitura */
   while((SSPSR & SSPSR_BSY));

   /* Testa se chegou um byte na FIFO de Entrada */
   if (SSPSR & SSPSR_RNE) {
      return (byte) SSPDR;
   }

   return 0xFF;

}


/*************************************************************************
   FUNCAO            : SSP_LER BYTE
   PARAMETROS      : NENHUM
   RETORNO            : DADO LIDO (8-bits)
   DESCRICAO         : RECEBE UM BYTE DA FIFO DA SSP
**************************************************************************/
byte ssp_ler_byte(void)
{
   word dado = 0;

   /* Aguarda a fifo TX ficar vazia */
   while (!(SSPSR & SSPSR_TFE));

   /* Escreve um dado no MOSI para gerar o clock */
   SSPDR = 0xFF;

   /* Aguarda a fifo TX ficar vazia */
   while (!(SSPSR & SSPSR_TFE));

   /* Aguarda a SSP desocupar para pode realizar a leitura */
   while((SSPSR & SSPSR_BSY));

   /* Aguarda a chegada de um byte na FIFO de Entrada */
   while(!(SSPSR & SSPSR_RNE));

   dado = SSPDR;   /* Leitura do dado que chegou */

   return (byte)dado;
}

/*************************************************************************
   FUNCAO            : SSP_LER RESPOSTA
   PARAMETROS      : RESPOSTA A SER LIDA
   RETORNO            : 0 - RESPOSTA CORRETA, 1 - RESPOSTA ERRADA
   DESCRICAO         : SOLICITA RESPOSTA CORRETA DO DISPOSITIVO
**************************************************************************/
byte ssp_ler_resposta(const byte dado)
{   
   word
      contador = 0xFF;

   while(--contador) {
      if (ssp_ler_byte() == dado) {
         return 0;
      }
   }
   return 1;
}







/*************************************************************************
   Fim de Arquivo
**************************************************************************/



Código: Selecionar todos
/*************************************************************************
   ARQUIVO                  :   SSP.H
   DATA DE CRIACAO      :   07 DE JANEIRO DE 2006
   REVISAO                  :   1.0
   DATA                     :   07 DE JANEIRO DE 2006
   EQUIPAMENTO            :   DIVERSOS
   MICROCONTROLADOR   : ARM - LPC21XX
   COMPILADOR            : KEIL - UVISION 3.0 (VERSAO 7.2)
   HISTORICO               :

**************************************************************************/

/*************************************************************************
   INFORMACOES
**************************************************************************/

   /***

      A) PINOUT   

      SCK1      P0.17   O      CLOCK   LPC      >   SLAVE
      MISO1      P0.18   I      DADO    SLAVE > LPC
      MOSI1      P0.19   O      DADO    LPC      > SLAVE
      SSEL1      P0.21   O      CS      LPC      > SLAVE      = SD_HAB
      SSEL2      P0.28   O      CS      LPC      > SLAVE      = SD_EXHAB


      B) REGISTROS

      Nome            Acesso   Tam(bits)      Reset      Descricao
      ----------------------------------------------------------------------
      SSPCR0          E/L         16               0x0000   Registro de Controle 0
      SSPCR1          E/L         8                  0x00      Registro de Controle 1
      SSPDR            E/L         16               0x0000   Registro de Dados
      SSPSR            L            8                  0x03      Status do Dispositivo
      SSPCPSR         E/L         8                  0x00      Registo de Config. do Prescaler
                                                                  do Clock
      SSPIMSC         E/L         8                  0x00      Registro de Mascara de
                                                                  Interrupcao (Set/Clear)
      SSPRIS         E/L         8                  0x04      Registro de Status de
                                                                  Interrupcao (RAW)
      SSPMIS         L            8                  0x00      Registro de Status de
                                                                  Interrupcao Mascarada
      SSPICR         E            8                  NA         Registro de Interrupcao
                                                                  (Clear Flags)

      ----------------------------------------------------------------------
      SSPCR0 - Registro de Controle
      ----------------------------------------------------------------------
      Bit               Simbolo         Valor      Reset      Descricao
      ----------------------------------------------------------------------
      3:0               DSS                           0000      Tamanho (bits) dados a serem
                                                                  transmitidos em cada frame
                                          0011                  4 bits
                                          0100                  5 bits
                                          0101                  6 bits
                                          0110                  7   bits
                                          0111                  8 bits
                                          ....
                                          1111                  16 bits
      ----------------------------------------------------------------------
      5:4               FRF                           00         Formato do Frame
                                          00                     SPI
                                          01                     SSI
                                          10                     MICROWAVE
                                          11                     Não Aplicavel
      ----------------------------------------------------------------------
      6                  CPOL                        0            Polaridade do Clock
                                                                  (Usado apenas no Modo SPI)      
                                          0                        Dado na subida do clock
                                          1                        Dado na descida do clock
      ----------------------------------------------------------------------
      7                  CPHA                        0            Estado de espera do Clock
                                          0                        SCLK1 = 0 (estado de espera)
                                          1                        SCLK1 = 1 (estado de espera)
      ----------------------------------------------------------------------
      15:8            SCR                           0x00      



   ***/

/*************************************************************************
   DEFINES
**************************************************************************/

   /*** SSP ***/

   #define   SSPSR_TFE      BIT(0)   //   1   : FIFO TX Vazia,    0 : Dado pedente
   #define   SSPSR_TNF      BIT(1)   //   0   : Fifo Tx Full,    1 : Pode mandar dado   
   #define SSPSR_RNE      BIT(2)   //   0   : Fifo Rx Vazia,    1 : Tem dado
   #define SSPSR_RFF      BIT(3)   //  1   : Fifo Rx Full,      0 : Pode receber
   #define SSPSR_BSY      BIT(4)   //   0 : SSP Idle,            1 : Tx/Rx Data

   #define PINSEL1_SSP_SCK         0x00000008   //    (bits 3:2 = 10)
   #define PINSEL1_SSP_MISO      0x00000020   //   (bits 5:4 = 10)
   #define PINSEL1_SSP_MOSI      0x00000080   //   (bits 7:6 = 10)

/*************************************************************************
   PROTOTIPOS - FUNCOES EXTERNAS
**************************************************************************/


/*************************************************************************
   VARIAVEIS GLOBAIS EXTERNAS
**************************************************************************/


/*************************************************************************
   PROTOTIPOS - FUNCOES APENAS DISPONIVEIS NO MODULO
**************************************************************************/

#ifdef _SSP_


#endif

/*************************************************************************
   PROTOTIPOS - FUNCOES DO MODULO DISPONIVEIS APENAS PARA OUTROS MODULOS
**************************************************************************/

#ifndef _SSP_


#endif

/*************************************************************************
   PROTOTIPOS - FUNCOES DISPONIVEIS PARA TODOS OS MODULOS
**************************************************************************/

   void    ssp_setup                     (void);
   byte   ssp_enviar_byte            (const byte dado);
   byte   ssp_ler_byte               (void);
   byte    ssp_ler_resposta         (const byte dado);
   void    ssp_esvazia_pilha_rx   (void);
   void    ssp_bus_speed               (byte speed);


/*************************************************************************
   VARIAVEIS GLOBAIS - DISPONIVEIS APENAS PARA O MODULO
**************************************************************************/

#ifdef _SSP_

#endif

/*************************************************************************
   VARIAVEIS GLOBAIS - DISPONIVEIS APENAS PARA OUTROS MODULOS
**************************************************************************/

#ifndef _SSP_

#endif

/*************************************************************************
   VARIAVEIS GLOBAIS - DISPONIVEIS PARA TODOS OS MODULOS
**************************************************************************/


/*************************************************************************
   Fim de Arquivo
**************************************************************************/


Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor alessandro » 09 Set 2007 19:33

Valeu Jean,

Ja ta funcionado, e melhorei mais um pouco baseado no codigo que você mensionou.



Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32


Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x