Sensor de pista óptica PMT9101 y PIC18f2xk22 - Comunicación SPI

0

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

}      

}***
    
pregunta Walid Amehri

1 respuesta

1

Sí, lo haces. No esperaría que este chip funcionara sin hacer estas cosas en la secuencia correcta.

Por lo tanto, necesitará los pines NCS, NRESET y SPI controlables desde su microprocesador. Escriba el código para realizar la sincronización correcta (tendrá que usar las funciones de espera en su código) y luego verifíquelo con un analizador lógico (puede obtener los más baratos de 8 bits en la actualidad)

Si el chip aún no funciona, verifique los niveles lógicos y la potencia y asegúrese de que sean los valores correctos de los que figuran en la hoja de datos.

En lo que respecta a SROM, la hoja de datos no está clara. Esto es lo que creo que es: el registro de habilitación SROM (0x13) debe habilitarse antes de escribir en registros R / W, y luego el valor permanecerá en el registro incluso después de un evento de apagado. O eso o puede sobrescribir todos los registros de RO que no son accesibles ya que probablemente querrá escribir esos valores en algún momento. Póngase en contacto con la empresa para ver qué significan.

    
respondido por el laptop2d

Lea otras preguntas en las etiquetas