Estou desde antonti, me batendo com um chip dedicado para touch screem, ADS7843.
Pois bem, a porqueira não estava funcionando ai depois descobri que era por causa do maldito FIO4MASK, que o bit do P4.19 tinha que estar a zero pra eu poder usar a la vontré.
Fora que estava testando o bit busy de forma incorreta, e estava atropelando os bytes.
Resolvi tudo, e agora to me batendo com o seguinte.
- Código: Selecionar todos
ADS7843 ------- LPC2478
DOUT MISO "SSP1"
DIN MOSI "SSP1"
DCLK SCK "SSP1"
CS P4.19
O PCLK ta rodando a 36mhz.
E estão aqui as configurações.
- Código: Selecionar todos
SSP1Init( void ){
//liga clock SSP1
PCONP |= (1 << 10);
//configura pinos P4-20.SCK-22.MISO-23.MOSI para função SPI
PINSEL9 |= (1<<15 |1<<14 |1<<13 |1<<12 |1<<9 |1<<8) ;
//configura pino P4-19-21 para função pino para CS do touch screem e memoria AT45.
PINSEL9 &= ~(1<<6|1<<7|1<<10|1<<11);
//configura direção IO dos pinos
//pinos P4-19=CS.touch,20=SCK,21=CS.at45,23=MOSI como saida
FIO4DIR |= (1<<19|1<<20|1<<21|1<<23);
//pino P4-22=MISO como entrada
FIO4DIR &= ~(1<<22);
FIO4MASK &= ~(1<<19|1<<21|1<<22);
//coloca CS do touch como 1
desel_tch;
FIO4SET = 1<<21; //CS.AT45 = 1 desel
/* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 */
SSP1CR0 = 0x0707;
/* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */
SSP1CPSR = 0x0C;
/* Device select as master, SSP Enabled, loopback operational mode */
SSP1CR1 = SSPCR1_LBM | SSPCR1_SSE;
/* Set SSPINMS registers to enable interrupts */
/* enable all error related interrupts */
SSP1IMSC = 0x00;
}
e aqui esta a forma que eu estou fazendo para ler o ADS7843.
- Código: Selecionar todos
char touch_H, touch_L;
FIO4PIN &= ~(1<<19);//CS.ADS7843 = 0
for(i=0;i<4;i++){;}
SSP1DR = read_x;//envia comando para ler X
while ( (SSP1SR & SSPSR_BSY) );
for(i=0;i<100;i++){;}
dummy = SSP1DR;// limpa lixo
SSP1DR = 0x00;//envia bummy para gerar clock
while ( (SSP1SR & SSPSR_BSY) );
for(i=0;i<10;i++){;}
touch_H = SSP1DR;//pega high
SSP1DR = 0x00;//envia dummy para gerar clock
while ( (SSP1SR & SSPSR_BSY) );
for(i=0;i<10;i++){;}
touch_L = SSP1DR; //pega low
FIO4PIN |= 1<<19;
contador = 0; //CS.ADS7843 = 1
O que ocorre é que:
O ADS esta respondendo ao comando, tudo bunitinho pois estou aferindo com o osciloscopio, só que o arm. Seja qual for o valor que eu mando como dummy, ele não pega o byte que o ads responde, ele simplesmente pega o ultimo valor que ele escreveu no DR ou seja, o dummy.
Alguém ja passou por isto ? tem alguma sugestão ?