-
        

Ergebnis 1 bis 2 von 2

Thema: PIC 18F4550 mit EEPROM 24C32A via I2C

  1. #1

    PIC 18F4550 mit EEPROM 24C32A via I2C

    Anzeige

    Hallo,
    kann mir jemand helfen den I2C Bus zu konfigurieren.

    Mein PIC läuft mit eine Frequenz von 5 MHz.

    Ziel meiner Bemühungen ist und war es den EEPROM auszulesen.
    Doch leider klappt es leider nicht mit dem Hardware MSSP Module auf dem Chip.
    Daher habe ich es mit der Software variante probiert doch hier habe ich enorme Probleme meine Timing so einzustellen das der EEPROM alles schafft zu schreiben bzw. die Daten bereitzustellen und auf den I2C-Bus rauszuschieben.

    SDA und SCL Leitung haben bei pullup Widerstände von 20k.
    Wie berechen ich die zeit für schreiben, also einfag gefragt wie lang müssen die delays sein damit die kommunikation zwischen. Master (PIC) und Slave(EEPROM) klappt??

    Ich benutze den MPLAB C18 Compiler und ICD2 fürs Debugen.

    Der Code sieht bei mir so aus:

    //main.c

    //** I N C L U D E S ************************************************/
    #include <p18f4550.h>
    #include <sw_i2c.h>
    #include <delays.h>
    #include <sw_i2c.h>


    //** D E C L A R A T I O N S ******************************************/

    #pragma config CPUDIV = OSC4_PLL6
    #pragma config PLLDIV = 5
    #pragma config FOSC = HS
    #pragma config PWRT = ON
    #pragma config WDT = OFF


    #define control_IN 0b10100000
    #define control_OUT 0b10100001
    #define address_HI 0b00000000
    #define address_LO 0b00000000


    void init(void)
    {
    ADCON1 = 0b00001111; // Enable digital I/O
    TRISB = 0b11111111; // Configure PORTB I/O
    } // initializes the PICmicro


    void main (void)
    {


    //**********************************

    init();
    SWStartI2C(); // Generate bus start condition
    test = SWPutaI2C(p1 , 1); // write control_in byte
    Delay10TCY();
    test = SWPutaI2C(p2 , 1); // write address hi byte
    Delay10TCY();
    test = SWPutaI2C(p3 , 1); // write address lo byte
    SWStopI2C();
    Delay10TCY();

    SWRestartI2C(); // Generate bus restart condition
    test = SWPutaI2C(p4 , 1); // write control_OUT byte
    for (k=0;k<dlength;k++)
    {
    Delay10TCY();
    data[k] = SWReadI2C(); //read in a single byte
    SWAckI2C();
    Delay10TCY();
    }

    SWStopI2C(); // Generate bus stop condition





    } // end main function

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    Servus,

    wieso denn 20k Pullups? 1,8k langen vollkommen aus. Schau mal ins Datenblatt, von wegen Geschwindigkeit des EEPROMs und des Timings.

    Ich programmiere vorwiegend in Assembler... dabei habe ich mit dem MSSP Modul keine Probleme, daher kann ich dir nur schwer bei deinem Code helfen.
    Gruß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •