Assim como em I2C, no módulo SPI não é obrigatório o uso de interrupção para o funcionamento do mesmo?
Grato,
Alessandro
Moderadores: 51, guest2003, Renie, gpenga
/*************************************************************************
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
**************************************************************************/
/*************************************************************************
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
**************************************************************************/
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante