Vuelvo con nuevas preguntas, intenté comunicarme con mi sensor (esclavo) pero él no responde en absoluto.
Mi primera pregunta es: ¿Debo hacer la secuencia de encendido que se explica en la hoja de datos o no?
En segundo lugar, hay una parte llamada Descarga de SROM y dijeron que hay un firmware suministrado, pero no recibí nada con el sensor, excepto la hoja de datos completa
Mi código funciona porque logré enviar datos y generar un reloj, pero el sensor no respondió.
Hola chicos, Regreso con una buena noticia, recibimos el firmware, aquí está mi código actualizado, pero tengo un problema, es que cuando verifiqué la comunicación en el osciloscopio noté que el sensor no respondió. Por favor ayuda Y gracias de antemano.
Aquí está mi código:
void Init(void)
{
// Master initialisation
OSCCON = 0b00111000; // 1MHz : default value also
TRISB = 0b01000100;
ANSELB = 0b00000001;
SSP2STAT = 0b10000000;
SSP2ADD = 0b11111111; //
SSP2CON1 = 0b00101010; /
IPR3bits.SSP2IP=1; // MSSP interrupt high priority
PIR3bits.SSP2IF=0; // MSSP interrupt flag cleared
PIE3bits.SSP2IE=0; // MSSP interrupt enable
}
void SROM_Download(void)
{
unsigned char c;
int i;
SPI_WritetoRegister(Config2, 0x00); //2 : bit5 = 0, others
SPI_WritetoRegister(SROM_Enable, 0x1D); //3
delayms(10); //4
SPI_WritetoRegister(SROM_Enable, 0x18); //5
// 6 : write the SROM file (=firmware data)
SPI_CS = 0;
SSP2BUF = SROM_Load_Burst | 0x80; // write burst ion a
while(!SSP2STATbits.BF);
delay10microsec(2);
// 6 : send all bytes of the firmware
for( i = 0; i < firmware_length; i++)
{
c = firmware_data[i];
SSP2BUF = c;
while(!SSP2STATbits.BF);
delay10microsec(2);
}
SPI_CS = 1;
}
void PowerUpSequence(void)
{
SPI_CS = 1; // 2
SPI_CS = 0; // 2
SPI_CS = 1; // 2
SPI_WritetoRegister(Power_Up_Reset, 0x5A); // 3 : force
delayms(50); // 4
SPI_ReadfromRegister(Motion); // 5
SPI_ReadfromRegister(Dx_L);
SPI_ReadfromRegister(Dx_H);
SPI_ReadfromRegister(Dy_L);
SPI_ReadfromRegister(Dy_H); // 5
SROM_Download(); //6
delayms(10);
SPI_ReadfromRegister(Motion); // 7 : Read
delay100microsec(10);
}
unsigned char SPI_ReadfromRegister(unsigned char addr) //Verified
{
SPI_CS = 0; // Set CS low
// send adress of the register, with MSBit = 0 to indicate it's a read
SSP2BUF = addr & 0x7f;
while(!SSP2STATbits.BF); // wait until the all bits sended
delay100microsec(2); // wait tsrad (160us)
// read data
SSP2BUF = 0x00;
while(!SSP2STATbits.BF); // wait until the all bits sended
delaymicrosec(1); // tSCLK-NCS for read operation
SPI_CS = 1; // Set CS High
delay10microsec(2); // tSRW&tSRR (=20us)
return(SSP2BUF);
}
void SPI_WritetoRegister(unsigned char addr, unsigned char data)
{
SPI_CS = 0; // Set CS low
//send adress of the register, with MSBit = 1 to indicate it's a write
SSP2BUF = addr | 0x80;
while(!SSP2STATbits.BF); // wait until the all bits
SSP2BUF = data; // put the data in the SSPBUF
while(!SSP2STATbits.BF); // wait until the all bits
delay10microsec(4); // wait tSCLK-NCS for writeop
SPI_CS = 1; // Set CS High
delay100microsec(2); // tSWW&tSWR (= 180us)
}
void main (void)
{
unsigned char value;
Init();
PowerUpSequence();
while(1)
{
//SPI_ReadfromRegister(Product_ID); // Read
//SPI_ReadfromRegister(inv_Product_ID); // Read
SPI_ReadfromRegister(SROM_ID); // Read
}
}***