Autor Tema: Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.  (Leído 2275 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado andres6969

  • PIC10
  • *
  • Mensajes: 14
Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« en: 04 de Abril de 2021, 18:04:48 »
Estimados amigos del foro todopic.
Ante la desesperación, he decidido enviar este post al foro para solicitar ayuda en la lectura de un byte por SPI con C18. Entre un PIC 18F97j60 (100pines) y la memoria 25LC256.

Por el momento, he podido leer sin problemas el registro STATUS de la memoria. Con esta operación entiendo que a nivel del HW y configuración de los registros del PIC están correctos.   :lol: :lol: :lol:

void config_SPI(void)
{
    TRISDbits.RD5=1;// Configuración pin SDI como Entrada
    TRISDbits.RD4=0;// Configuración pic SDO como Salida
    TRISDbits.RD6=0;// Configuración pin SCK como Salida
    TRISJbits.RJ6=0;// Configuración pin CS como Salida.
    SSP2STAT=0x40;      
    SSP2CON1=0x20;
OpenSPI2(SPI_FOSC_16, MODE_00, SMPMID);   
}

// #################  Función:
void Read_Status_Register_RDSR_SPI()
{
PORTJbits.RJ6 = 0;   // Activate the SS SPI Select pin// assert chip select
WriteSPI2(SPI_WREN);
PORTJbits.RJ6 = 1;   // OFF the SS SPI Select pin// assert chip select

PORTJbits.RJ6 = 0;       // Activate the SS SPI Select pin// assert chip select
WriteSPI2(SPI_RDSR);    // Send READ STATUS REGISTER (RDSR)
ReadSPI2();
PORTJbits.RJ6 = 1;       // OFF the SS SPI Select pin// assert chip select
}

// ############### Llamada a la función desde el main.
Read_Status_Register_RDSR_SPI();
Analizando las señales. Obtenemos que funciona OK. Imagen adjunta.  Read_Status_Register_RDSR.jpg


Ahora intento leer un byte de la posición de memoria (0x03, 0x05). 8+8 bit:
Llamada a la función:
byte_read_SPI(0x03,0x05);

Función de lectura, aquí creo que es donde falta algo o no está correcto el contenido de la función.

// ******************** BYTE READ ***************************************
unsigned char byte_read_SPI (unsigned char addhigh,unsigned char addlow)
{
PORTJbits.RJ6 = 0;
WriteSPI2(SPI_WREN);
PORTJbits.RJ6 = 1;
///////////////////////////////////////////////////
PORTJbits.RJ6 = 0;          // Activate the SS SPI Select pin// assert chip select
WriteSPI2(SPI_READ);      // Send Read Command // Read data to memory 0x0003
WriteSPI2(addhigh);
WriteSPI2(addlow);
putcSPI2(0x00);    // send dummy 0x00   /* getsSPI2   * Write string to SSP2BUF  */
ReadSPI2();
PORTJbits.RJ6 = 1;       // OFF the SS SPI Select pin// assert chip select
return(SSP2BUF);
}
Analizando las señales, no hay ninguna respuesta de la memoria por su pin SO (salida de datos) Al solicitarle la lectura del Byte situado en la posición (0x03, 0x05) 16 bit.  Imagen adjunta: byte_read_SPI(0x03,0x05).jpg

Espero vuestra ayuda.  Gracias.
Saludos. Andrés.





Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #1 en: 04 de Abril de 2021, 20:53:51 »
No es necesario enviar el 0x06 ( WREN ) antes de leer, es solo para escribir, y se debe hacer siempre antes de cada escritura.

Por lo tanto para leer el registro STATUS necesitas:
Código: [Seleccionar]
Bajar CS
Enviar 0x05
leer el SPI 1 byte. (Enviar 0x00)
Levantar CS

Imagino que la segunda y tercera imagen que pasaste es lo mismo...

Para escribir necesitas dos cosas, la primera habilitar el latch, y la segunda escribir:

-Habilitar el latch de escritura
Código: [Seleccionar]
Bajar el CS
Enviar 0x06
Levantar CS

Esperar al menos 50ns con CS en alto (por las dudas si no lo respetas al tiempo)

- Escribir
Código: [Seleccionar]
Bajar CS
Enviar 0x02 (WRITE)
Enviar direccion (16 bytes) podes enviar 0x0000
Enviar dato a escribir 0xAB por ejemplo.
Levantar CS




Corroborando que se grabo... Ahora a leer:

Código: [Seleccionar]
Bajar CS
Enviar 0x03 (READ)
Enviar dirección (16 bytes) donde grabamos antes 0x0000
Leer 1 byte
Levantar CS



Proba escribir algo y luego leerlo. Para ver que realmente lo estas escribiendo bien...
Yo no veo nada malo en las imagenes, solo que devuelve 0xFF (que pienso que deberia devolver 0x00)
Por eso mismo mejor escribirlo y luego leelo. Recorda que el ciclo de escritura es de 5ms como maximo.
« Última modificación: 04 de Abril de 2021, 21:02:58 por KILLERJC »

Desconectado andres6969

  • PIC10
  • *
  • Mensajes: 14
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #2 en: 05 de Abril de 2021, 03:32:49 »
Hola KILLERJC, gracias por tu respuesta. 
La lectura del registro STATUS, está OK. Como he indicado anteriormente. El problema continua en la lectura de 1 Byte.

He realizado los pasos que indicas en tu respuesta con estas 2 funciones:

void byte_write_SPI_test (unsigned char address,unsigned char data)
{
PORTJbits.RJ6 = 0;
WriteSPI2(SPI_WREN);   // Habilitar el latch OK, 0x06
PORTJbits.RJ6 = 1;
Delay10TCYx(2);      // Espero 2uS en alto para asegurar que está Ok


PORTJbits.RJ6 = 0;                // Activate the SS SPI Select pin// assert chip select.
WriteSPI2(SPI_WRITE);             // Send Write Command  // Write data to memory  0x0002
WriteSPI2(address);               // Send address.
WriteSPI2(data);                // Send data byte
PORTJbits.RJ6 = 1;                // OFF the SS SPI Select pin// assert chip select.
}

void byte_read_SPI_test (unsigned char address)
{
PORTJbits.RJ6 = 0;                // Activate the SS SPI Select pin// assert chip select
WriteSPI2(SPI_READ);             // Send Read Command // Read data to memory 0x0003
WriteSPI2(address);               // Send address.
ReadSPI2();                     // Leer 1 Byte
PORTJbits.RJ6 = 1;                // OFF the SS SPI Select pin// assert chip select.
}

Y he obtenido las siguientes imágenes con las señales del SPI.  Write_and_Read.jpg   

No Funciona.  Algo no está del todo bien ya que en la lectura no obtengo los datos grabados.  La linea SO, salida de datos de la memoria no cambia, siempre está a nivel alto y entiendo que en la operación de lectura, después de indicarle la dirección a leer tendría que tirar la linea SO a abajo y con los siguientes pulsos de reloj leer estos datos. Pero esto no lo hace y no lo entiendo.   Leer el registro de STATUS lo hace perfecto, pero leer un byte no lo hace bien.   Directamente NO LO HACE.

Espero vuestra ayuda. Gracias.
Saludos. Andrés.

 

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #3 en: 05 de Abril de 2021, 03:44:06 »
WriteSPI2(address);     ¿Estás seguro de que esta función admite el envío de un long y ella se encarga de enviar a la memoria los dos bytes uno después del otro?. 

  ¿O por el contrario tienes que enviar la dirección de 16 bits por ejemplo así?:

WriteSPI2(address \ 256);    // Send the high byte of address.
WriteSPI2(address % 256);  // Send the low byte of address.


   Pruébalo. 

 Un saludo.







Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #4 en: 05 de Abril de 2021, 07:36:11 »
Si parece que le falta 1 byte mas en la lectura, pero lo raro es que en la escritura lo envio, y en la lectura no.

Desconectado andres6969

  • PIC10
  • *
  • Mensajes: 14
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #5 en: 05 de Abril de 2021, 09:10:39 »
Hola, ok gracias por las respuestas.
Problema localizado y solucionado.  Toda una tontería.  Estaba intentado escribir y leer sin dar tiempo entre cada una de las operaciones.  Con un delay de 10ms entre estas 2 operaciones escritura y lectura para estas pruebas iniciales. Todo perfecto. 
Desde un principio leer el registro STATUS ha sido OK, pero no podía leer un 1 byte de una dirección de la memoria.
Intentaba escribir 1byte y acto seguido leer esa dirección, al no dar tiempo pues obtenía 0xFF.  Y por otro lado si solo leía una dirección de memoria que no estaba anteriormente escrita, por defecto la memoria está a 0xFF, pues obtenía el mismo resultado. Un mosqueo de narices, buscando por todos los sitios y la solución es ir un poco más despacio. ;-).
Gracias por vuestra ayuda. Adjunto captura de la lectura de una dirección de memoria previamente escrita. ;-)
Saludos. Andrés.


Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ayuda para Leer 1Byte por SPI en la Memoria 25LC256.
« Respuesta #6 en: 05 de Abril de 2021, 15:49:39 »
Hola, ok gracias por las respuestas.
Problema localizado y solucionado.  Toda una tontería.  Estaba intentado escribir y leer sin dar tiempo entre cada una de las operaciones.  Con un delay de 10ms entre estas 2 operaciones escritura y lectura para estas pruebas iniciales. Todo perfecto. 
Desde un principio leer el registro STATUS ha sido OK, pero no podía leer un 1 byte de una dirección de la memoria.
Intentaba escribir 1byte y acto seguido leer esa dirección, al no dar tiempo pues obtenía 0xFF.  Y por otro lado si solo leía una dirección de memoria que no estaba anteriormente escrita, por defecto la memoria está a 0xFF, pues obtenía el mismo resultado. Un mosqueo de narices, buscando por todos los sitios y la solución es ir un poco más despacio. ;-).
Gracias por vuestra ayuda. Adjunto captura de la lectura de una dirección de memoria previamente escrita. ;-)
Saludos. Andrés.

 Aún así, aparte de eso, te ha funcionado por que me estás enviando un valor address que de momento cabe en una variable de 8 bits aunque uses una de 16.  Pero en cuanto le des una dirección a address de por ejemplo 0x800  no creo que te funcione por que el registro de desplazamiento del SPI es de 8 bits y si le envías una valor de más de 8 bits tendrás desbordamiento en la variable.  Solo podrías grabar los primeros 256 bytes. Si le  mandas un 256 te va a sobreescribir el byte 0, 257 te sobreescribe el byte 1, sucesivamente de nuevo hasta 255.

  Tendrías que enviar dos bytes de address.  Primero MSB y después LSB.  Si no , te pasaría lo que te he descrito arriba.


 

anything