Forum: Mikrocontroller und Digitale Elektronik Timing PIC 18F4550, I2C Softwaremodus mit EEPROM 24C32A


von Hans Rüdiger (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.