Página 1 de 2
LPC13xx SSP

Enviado:
30 Nov 2010 09:49
por styg
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++;
}
}

Enviado:
30 Nov 2010 10:00
por fabim
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.

Enviado:
30 Nov 2010 14:39
por styg
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??

Enviado:
02 Dez 2010 10:42
por styg
Ow, da um help alguem, to patinando a uma semana nisso...

Enviado:
02 Dez 2010 11:25
por proex
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.

Enviado:
02 Dez 2010 11:59
por styg
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).

Enviado:
02 Dez 2010 12:12
por fabim
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

Enviado:
02 Dez 2010 14:26
por styg
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
}

Enviado:
02 Dez 2010 17:13
por Nightcrawler
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?

Enviado:
03 Dez 2010 08:28
por styg
Um ADC, ADS1247, cheio dos rolo pra falar com esse cara.

Enviado:
03 Dez 2010 09:01
por Rodrigo_P_A
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.

Enviado:
03 Dez 2010 17:14
por styg
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.

Enviado:
06 Dez 2010 10:08
por styg
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:


Enviado:
06 Dez 2010 11:20
por proex
Bem, SPI nunca precisou de PULL UP.
.

Enviado:
06 Dez 2010 11:20
por Rodrigo_P_A
kra., coloca parte do seu código aqui para eu dar uma olhada e tentar ver o que está acontecendo, pode ser?