Ich versuche, das Statusregister für das EEPROM gemäß den Anweisungen in diesem Anwendungshinweis auszulesen. Ich wollte die Meinung der Community zu den Signalen haben, die ich bekomme. Sie erscheinen mir nicht normal.
http://ww1.microchip.com/downloads/en/AppNotes/01073A.pdf
Schaltplan: Ich verwende genau die gleiche Pinbelegung, die im Anwendungshinweis empfohlen wird.
Wenn ich MISO lese, bekomme ich ein seltsames Verhalten.
MOSI- und CS-Signale:
Ich bekomme das MOSI-Signal wie erwartet bei steigender Flanke.
Ich habe die Uhr so eingestellt, dass sie bei 1 MHz tickt
SPI-Initialisierungscode und Laufcode in meiner main.c. (aus eewiki, angepasst an meine Bedürfnisse)
#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;
}
Ich habe Screenshots nur für die letzten beiden Operationen gemacht (Latch-Aktivierung schreiben und Statusregister lesen). Ich habe genau die gleichen Signale, wenn ich das Statusregister lese, bevor ich den Write-Latch-Befehl sende.
Ich verwende das PIC32MX Olimex-Prototyping-Board, unterhalb der Protoboard-Dokumentation und des EEPROM-Datenblatts.
https://www.olimex.com/Products/PIC/Proto/PIC-32MX/resources/PIC-32MX.pdf http://ww1.microchip.com/downloads/en/DeviceDoc/22064B.pdf
Wie immer steckt der Teufel im Detail, es wäre toll, wenn ich einen neuen Blick auf mein Thema werfen könnte. Vielleicht habe ich etwas verpasst.
Ich danke Ihnen für Ihre Hilfe !
PS: Das Erhöhen der Baudrate auf 20 MHz macht das Signal flach, löst aber mein Problem nicht.
Es sieht nicht nach etwas Codebezogenem aus. Es sieht so aus, als ob entweder ein Pin mit einem anderen Ausgangspin kurzgeschlossen ist, der auf Null gesetzt ist (oder ein anderer Slave, der sein MISO nicht dreifach angibt). Trennen Sie den Speicherchip, stellen Sie PIC MISO auf Ausgang und versuchen Sie, ihn umzuschalten, indem Sie 1 und 0 in das entsprechende Portbit schreiben.
Ein weiterer Verdächtiger ist die Stromversorgung des Speicherchips. Stellen Sie sicher, dass es VCC empfängt und einen Kondensator von VCC nach Masse hat.
Mehdi Sabwat
Oleg Masurow
Mehdi Sabwat
Mehdi Sabwat