LPC13xx SSP

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

LPC13xx SSP

Mensagempor styg » 30 Nov 2010 09:49

Alguém tá usando a spi desse CM3?

Pq to tentando fazer a comunicação e tá enchendo o saco, cheio de probleminha, as vezes lê as vezes não, as vezes dá resultado maluco, aí nao sei se é coisa com o mcu ou o periferico.

to usando um código que peguei de exemplo:

Código: Selecionar todos
LPC_SYSCON->PRESETCTRL |= 0x01;      // retira reset do ssp1
LPC_SYSCON->SSPCLKDIV = 10;         // clock = pclk/10
LPC_SSP->CR0 = 0x0787;            // 8-bit/spi/cpol=0/cpha=1/scr=15
LPC_SSP->CPSR = 0x28;            
LPC_SSP->CR1 = 0x02;            // spi enable

void lpc1xxx_ssp_envia(volatile unsigned char *p, unsigned int bytes)
{
unsigned int i;
for(i = 0; i < bytes; i++)
   {
   // só carrega se nao estiver ocupado e a FIFO do TX nao estiver cheia
   while((LPC_SSP->SR & (0x02|0x10)) != 0x02)   ;
   LPC_SSP->DR = *p;
   p++;
   }
}

void lpc1xxx_ssp_recebe(volatile unsigned char *p, unsigned int bytes)
{                           
unsigned int i;
for( i = 0; i < bytes; i++)
   {
   // aguarda enquanto a FIFO do RX está vazia
   while(!(LPC_SSP->SR & 0x04))   ;
   *p = LPC_SSP->DR;
   p++;
   }
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor fabim » 30 Nov 2010 10:00

cara, o problema da SPI é o clock do arm. Leva um tempinho até você entender. Quando eu mexi com SPI com o proex, batemos a cabeça até descobrir as manhas.
Mais pde ter certeza, o seu problema ai esta sendo o clock, pois as rotinas estão certinhas.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor styg » 30 Nov 2010 14:39

fabim, ce diz a configuração do clock? dá pra ser mais específico?
Pq demorou pra começar a fazer funcionar, mas com o scope da pra ver q agora ele ta gerando os pulsos no clk bunitinho (apesar de nao ter entendido a formula para calcular a frequencia).

Já vi outras rotinas que na própria rotina de envio, ele já faz a leitura se tiver alguma coisa no buffer, tipo essa aqui:

Código: Selecionar todos
unsigned char lpc1xxx_ssp_transfere(unsigned char byte)
{                           
unsigned char dado;
// carrega valor enviado, aguarda desocupar, e faz a leitura
LPC_SSP->DR = byte;
while((LPC_SSP->SR & 0x10)) ;
dado = LPC_SSP->DR;
return dado;
}


isso resolveu um problema que tava acontecendo, quando eu mandava ler muitos bytes (eu tinha que enviar 0xFF para cada byte que eu ia queria receber) acho que ocorria um overflow no buffer da ssp (que no user manual nao fala de quanto é, mas desconfio que seja 8 bytes).

e ainda tem rotinas baseadas em interrupção.

qual abordagem vocÊs usaram??
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 02 Dez 2010 10:42

Ow, da um help alguem, to patinando a uma semana nisso...
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor proex » 02 Dez 2010 11:25

Geralmente os chips com SPI possuem um pino chamado, CS (Chip Select)

Como vc esta manipulando esse pino no seu código? Não vi referencia a ele no seu exemplo.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor styg » 02 Dez 2010 11:59

Entao, o CS eu deixo sempre em nivel baixo.

O fabim falou desse negocio do clock e sumiu, to achando que pode ser isso.

Além disso, to depurando no keil, e aquela janela da ssp acho q ta bugada, por ex. eu escrevo 0x16 no data reg e aparece 0xFF (na janela do SSP).
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor fabim » 02 Dez 2010 12:12

vamos começar do inicio.

No startup desse cara, no wizzard, qual foi o fator de divisão qeu você colocou para alimentar a SSP, e qual o valor de CCLOCK que ta rodando nesse cara?
Me coloca aqui, como você inicializou o SSP pra eu dar uma olhada.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor styg » 02 Dez 2010 14:26

Essa é a sequencia de init:

Código: Selecionar todos
void lpc1xxx_init_ssp(void)
{
LPC_SYSCON->PRESETCTRL |= 0x01;      // retira reset do ssp1
LPC_SYSCON->SSPCLKDIV = 10;         // clock = pclk/10
LPC_SSP->CR0 = 0x0087;            // 8-bit/spi/cpol=0/cpha=1/scr=15
LPC_SSP->CPSR = 0x28;            
LPC_SSP->CR1 = 0x02;            // spi enable
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Nightcrawler » 02 Dez 2010 17:13

Dependendo do periférico SPI que tu usa, tem que colocar o CS em 1, pra ele aceitar os comandos.
Ta tentando comunicação com o que?
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor styg » 03 Dez 2010 08:28

Um ADC, ADS1247, cheio dos rolo pra falar com esse cara.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Rodrigo_P_A » 03 Dez 2010 09:01

styg escreveu:Entao, o CS eu deixo sempre em nivel baixo.

O fabim falou desse negocio do clock e sumiu, to achando que pode ser isso.

Além disso, to depurando no keil, e aquela janela da ssp acho q ta bugada, por ex. eu escrevo 0x16 no data reg e aparece 0xFF (na janela do SSP).


Uma dica, quando você for debugar periféricos, tome cuidado com aqueles periféricos que informam o dado e depois que o dado é lido ele zera os FLAGs, deixa eu tentar explicar.

Qdo vc deixa a janela de debug de periférico aberto, tenha em mente que o KEIL vai ficar lendo os registradores daquele periférico. No caso da SPI, se vc tentar debugar com a janela aberta, isso vai interferir no funcionamento, pois existem registros que retornam o dado 1 vez, por exemplo o registro de data da SPI e da SSP, retornam o valor 1 vez somente, se a sua janela de debug estiver aberta, ele vai ser lido pelo keil e no seu programa não vai ser lido, não lembro bem se é o registro de data, mas sei que interfere no funcionamento.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor styg » 03 Dez 2010 17:14

Rodrigo_P_A escreveu:
styg escreveu:Entao, o CS eu deixo sempre em nivel baixo.

O fabim falou desse negocio do clock e sumiu, to achando que pode ser isso.

Além disso, to depurando no keil, e aquela janela da ssp acho q ta bugada, por ex. eu escrevo 0x16 no data reg e aparece 0xFF (na janela do SSP).


Uma dica, quando você for debugar periféricos, tome cuidado com aqueles periféricos que informam o dado e depois que o dado é lido ele zera os FLAGs, deixa eu tentar explicar.

Qdo vc deixa a janela de debug de periférico aberto, tenha em mente que o KEIL vai ficar lendo os registradores daquele periférico. No caso da SPI, se vc tentar debugar com a janela aberta, isso vai interferir no funcionamento, pois existem registros que retornam o dado 1 vez, por exemplo o registro de data da SPI e da SSP, retornam o valor 1 vez somente, se a sua janela de debug estiver aberta, ele vai ser lido pelo keil e no seu programa não vai ser lido, não lembro bem se é o registro de data, mas sei que interfere no funcionamento.


putz rodrigo, isso é muito F*** hein??

eu tava debugando o ssp com a janela de debug aberta msm (geralmente), caramba nao acredito que possa ser isso meu.

vou testar isso, valeu a dica.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 06 Dez 2010 10:08

Agora to debugando com a janela da ssp fechada, mas continua com problemas, mas ja to achando que tá flatando é entendimento sobre o funcionamento do periférico.

Por curiosidade, desabilitem os resistores de pull-up dos pinos usados para spi, pois interferem:

Imagem

Imagem
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor proex » 06 Dez 2010 11:20

Bem, SPI nunca precisou de PULL UP.


.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Rodrigo_P_A » 06 Dez 2010 11:20

kra., coloca parte do seu código aqui para eu dar uma olhada e tentar ver o que está acontecendo, pode ser?
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Próximo

Voltar para ARM

Quem está online

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

x