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
}
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;
.
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.
Vicatcu
m_ingenieur
Vicatcu
m_ingenieur
rdtsc