Estoy tratando de leer el registro de estado de la EEPROM siguiendo las instrucciones de esta nota de aplicación. Quería tener la opinión de la comunidad sobre las señales que estoy recibiendo. No me parecen normales.
http://ww1.microchip.com/downloads/en/AppNotes/01073A.pdf
Diagrama de cableado: estoy usando exactamente el mismo pinout recomendado en la nota de aplicación.
Cuando leo MISO, tengo un comportamiento extraño.
Señales MOSI y CS:
Obtengo la señal MOSI como se esperaba en el borde ascendente.
Configuré el reloj para marcar @ 1MHz
Código de inicialización de SPI y código de ejecución en mi main.c. (de eewiki, adaptado a mis necesidades)
#define eepromCS LATBbits.LATB15
void initSPI(void)
{
// Add GPIO config on pin RB15
eepromCS = 1; //GND
IEC0bits.SPI1EIE = 0;
IEC0bits.SPI1RXIE = 0;
IEC0bits.SPI1TXIE = 0;
SPI2CONbits.ON = 0;
SPI2BUF = 0;
SPI2BRG = 0; // 1MHZ
SPI2STATbits.SPIROV = 0;
/* SPI2CON Settings */
SPI2CONbits.FRMEN = 0;
SPI2CONbits.SIDL = 0;
SPI2CONbits.DISSDO = 0;
// 8 bits !
SPI2CONbits.MODE16 = 0;
SPI2CONbits.MODE32 = 0;
SPI2CONbits.CKP = 0; // Active state is high
SPI2CONbits.CKE = 0; // sampling from idle to active
SPI2CONbits.SSEN = 0;
SPI2CONbits.MSTEN = 1;
SPI2CONbits.SMP = 0; // sample during transmission
SPI2CONbits.ON = 1;
}
int main(void)
{
TRISBbits.TRISB15 = 0;
CSEEPROM = 1;
initSPI(); //EEPROM as a slave
unsigned char status;
unsigned char tmp;
//First READ
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x05;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
SPI2BUF = 0;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
eepromCS = 1;
write_char(status);
//Enable write LATCH
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x06;
while (!SPI2STATbits.SPIRBF);
tmp = SPI2BUF;
eepromCS = 1;
//Read Status register
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x05;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
SPI2BUF = 0;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
eepromCS = 1;
//write_char(status);
while (42);
return 0;
}
Hice capturas de pantalla solo para las dos últimas operaciones (habilitación de pestillo de escritura y lectura del registro de estado). Tengo exactamente las mismas señales cuando leo el registro de estado antes de enviar el comando de bloqueo de escritura.
Estoy usando la placa de prototipos PIC32MX Olimex, debajo de la documentación de la placa de prototipos y la hoja de datos de EEPROM.
https://www.olimex.com/Products/PIC/Proto/PIC-32MX/resources/PIC-32MX.pdf http://ww1.microchip.com/downloads/en/DeviceDoc/22064B.pdf
Como de costumbre, el diablo está en los detalles, sería genial si pudiera tener una nueva perspectiva de mi problema. Tal vez me perdí algo.
Gracias por su ayuda !
PD: aumentar el baudio para que coincida con 20 MHz hace que la señal sea plana pero no resuelve mi problema.
No parece nada relacionado con el código. Parece que un pin está en cortocircuito con otro pin de salida que está configurado en cero (u otro esclavo que no establece su MISO). Desconecte el chip de memoria, configure PIC MISO en salida e intente cambiarlo escribiendo 1 y 0 en el bit de puerto correspondiente.
Otro sospechoso es la fuente de alimentación del chip de memoria. Asegúrese de que reciba VCC y tenga un capacitor de VCC a tierra.
Mehdi Sabwat
Oleg Mazúrov
Mehdi Sabwat
Mehdi Sabwat