Schnittstelle PIC18F4550 mit I²C EEPROM (24AA1025)

Geben Sie hier die Bildbeschreibung ein

Ich arbeite an einem Universitätsprojekt, bei dem ich einen PIC18F4550 mit einem I²C-EEPROM verbinden muss.

Ich habe viele Codes gelesen und viele Projekte zu diesem Thema gesehen. Und ich habe einen Beispielcode von MPLAB C18 geschrieben (und ich habe auch viele Codes ausprobiert), aber niemand hat mit mir gearbeitet.

Ich weiß nicht, wo das Problem ist. Mit meinem Code und meiner Schaltung ist alles in Ordnung, aber das SCK-Signal hat das CLK-Signal zum Schreiben nicht generiert und es wurde nichts in das EEPROM geschrieben .

Hier ist der Code:

#include "p18f4550.h"
#include "i2c.h"
#pragma config FOSC = HS
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config ICPRT = OFF
#pragma config LVP = OFF
#pragma config WDT = OFF,DEBUG=OFF

unsigned char arraywr[] = {1,2,3,4,5,6,7,8,0};
unsigned char arrayrd[20];
//***************************************************
void main(void)
{
    OpenI2C(MASTER, SLEW_ON);// Initialize I²C module
    SSPADD = 10; //400 kHz Baud clock(10) @20 MHz
    while(1)
    {
        EEByteWrite(0xA0, 0x30, 0xA5);
        EEAckPolling(0xA0);
        EECurrentAddRead(0xA0);
        EEPageWrite(0xA0, 0x70, arraywr);
        EEAckPolling(0xA0);
        EESequentialRead(0xA0, 0x70, arrayrd, 20);
        EERandomRead(0xA0,0x30);
    }
}

Dies ist der Code von OpenI2C:

    /* $Id: i2c_open.c,v 1.1 2004/10/06 23:16:42 curtiss Exp $ */

    #include <p18cxxx.h>
    #include <i2c.h>


    /********************************************************************
    *   Function Name:  OpenI2C                                         *
    *   Return Value:   void                                            *
    *   Parameters:     SSP peripheral setup bytes                      *
    *   Description:    This function sets up the SSP module on a       *
    *                   PIC18CXXX device for use with a Microchip I²C   *
    *                   EEPROM device or I²C bus device.                *
    *********************************************************************/
    void OpenI2C( unsigned char sync_mode, unsigned char slew )
    {
        SSPSTAT &= 0x3F;                // Power on state
        SSPCON1 = 0x00;                 // Power on state
        SSPCON2 = 0x00;                 // Power on state
        SSPCON1 |= sync_mode;           // Select serial mode
        SSPSTAT |= slew;                // Slew rate on/off

        #if defined(__18F2455) || defined(__18F2550) || \
            defined(__18F4455) || defined(__18F4550)

            DDRBbits.RB1 = 1;           // Set SCL (PORTB,1) pin to input
            DDRBbits.RB0 = 1;           // Set SDA (PORTB,0) pin to input

        #else

            DDRCbits.RC3 = 1;           // Set SCL (PORTC,3) pin to input
            DDRCbits.RC4 = 1;           // Set SDA (PORTC,4) pin to input

        #endif

        SSPCON1 |= SSPENB;              // Enable synchronous serial port
    }
Da Sie an einer Universität sind, wie wäre es, wenn Sie eine Oszilloskop-Spur der SDA- und SCL-Leitungen erhalten und posten ... Ich habe Ihnen eine positive Stimme gegeben, in der Hoffnung, Ihr Privileg so weit zu erhöhen, dass Sie Bilder posten können
Ich habe das Bild der Schaltung gepostet :)
Mit welchem ​​Programm wurde Ihr Bild aus Neugier aufgenommen?
vom Isis-Simulator
Das ist ein Proteus - Produkt für diejenigen, die neu bei Isis sind.

Antworten (2)

Mit Ihrem Code und Ihrer Schaltung kann nicht alles in Ordnung sein, wenn SCK keine Uhr generiert ;-)

(Beachten Sie, dass SCK für SPI steht. SCL ist der Name für den I2C-Pin. Unter dem Verweis auf SCL ist also das, was Sie SCK nennen.)

Dies könnte daran liegen, dass Sie die Pins nicht richtig konfiguriert haben, wie Leon erwähnt, oder dass Sie möglicherweise keine Pullup-Widerstände zu Ihren SDA / SCL-Leitungen hinzugefügt haben.

Wenn Sie Ihre Schaltung zeigen (oder uns einfach mitteilen, ob Pullups vorhanden sind) und einen I2C-Initialisierungscode (z. B. was in OpenI2C passiert) können wir bestätigen, was das Problem ist.

BEARBEITEN - Wenn Sie sich Ihren Schaltplan ansehen, sieht es so aus, als hätten Sie keinen Pullup auf SCL, was dazu führen würde, dass nichts darauf zu sehen ist. Die I2C-Leitungen werden über Open-Drain-Ausgänge angesteuert, was bedeutet, dass der Pin nur Strom aufnehmen, nicht liefern kann.
Wenn Sie einen Widerstand (z. B. 2k bis 10k) von SCL zu Vdd hinzufügen, sollten Sie etwas sehen.

BEARBEITEN 2 - Ich bin mir nicht sicher, wo steht, dass für SCL kein Pullup erforderlich ist. Ich habe gerade in das Datenblatt geschaut und folgendes gefunden (Seite 207):

Die Auswahl eines beliebigen I 2 C-Modus mit gesetztem SSPEN-Bit zwingt die SCL- und SDA-Pins dazu, Open-Drain zu sein, vorausgesetzt, diese Pins sind durch Setzen der entsprechenden TRISC- oder TRISD-Bits als Eingänge programmiert. Um einen ordnungsgemäßen Betrieb des Moduls sicherzustellen, müssen Pull-up-Widerstände extern zu den SCL- und SDA-Pins bereitgestellt werden.

Verwenden Sie hier einen echten PIC oder simulieren Sie Dinge in ISIS? Wenn es sich um eine Simulation handelt, kann es an der Einrichtung liegen.
Hast du die TRIS-Bits entsprechend gesetzt? (beide auf 1)
Setzen Sie auch die ADCCON1-Registerbits 3:0 alle auf 1, um alle Pins als digital einzustellen. Dafür können Sie zB ADCCON1 |= 0x0F;.

Oli, ich habe meinen Beitrag bearbeitet und das Bild hinzugefügt. Überprüfen Sie bitte das. Danke :)
Außerdem habe ich jetzt die OpenI2C-Funktion hinzugefügt.
@m_engineer - Okay, siehe Änderungen - Ich kann keinen Pullup auf SCK sehen.
Laut Datenblatt muss SCK nicht hochgezogen werden. Aber ich habe versucht, Pullup zu haben, und es wurde nichts geändert!
@m_engineer - Wo hast du das gesehen?
Für den scl habe ich folgendes aus dem Datenblatt gelesen 2.3 Serielle Daten (SDA) Dies ist ein bidirektionaler Pin, mit dem Adressen und Daten in das Gerät und Daten aus dem Gerät übertragen werden. Es ist ein Open-Drain-Anschluss, daher erfordert der SDA-Bus einen Pullup-Widerstand gegen VCC (typisch 10 kW für 100 kHz, 2 kW für 400 kHz und 1 MHz). Für eine normale Datenübertragung darf sich SDA nur ändern, während SCL niedrig ist. Änderungen während SCL hoch sind für die Anzeige der Start- und Stoppbedingungen reserviert. 2.4 Serial Clock (SCL) Über diesen Eingang wird die Datenübertragung von und zum Gerät synchronisiert.
@m_engineer - Ich kann nicht sehen, wo steht, dass dort kein Pullup benötigt wird. I2C verwendet immer Open Drain + Pullups für beide Leitungen. Können Sie testen, ob der PIC überhaupt funktioniert, indem Sie so etwas wie das Umschalten einer Stecknadel tun? Simulieren Sie das oder verwenden Sie ein echtes PIC?
R1 wird im aktuellen Schaltplan platziert, hat aber keinen Wert. Es ist im Wesentlichen nicht da.

Sie müssen die Pins konfigurieren, die für die I2C-Schnittstelle für die Ein-/Ausgabe verwendet werden. Eingangspins, die mit analogen Eingängen geteilt werden, müssen als digitale Eingänge eingestellt werden.

Danke Leon :) Gibt es noch andere Pins, die ich zusätzlich zu scl und sdl konfigurieren muss?
Dies sind die einzigen zwei Pins, die von I2C verwendet werden.