Взаимодействие PIC18F4550 с EEPROM I²C (24AA1025)

Введите описание изображения здесь

Я работаю над университетским проектом, в котором мне нужно связать PIC18F4550 с I²C EEPROM.

Я прочитал много кодов и видел много проектов на эту тему. И я написал образец кода из MPLAB C18 (да и кодов пробовал много), но со мной никто не работал.

Я не знаю, где проблема. С моим кодом и с моей схемой все в порядке, но сигнал SCK не генерировал сигнал CLK на запись и в EEPROM ничего не записывалось .

Вот код:

#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);
    }
}

Это код 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
    }
учитывая, что вы находитесь в университете, как насчет того, чтобы получить и опубликовать осциллограмму линий SDA и SCL... Я дал вам голос в надежде повысить ваши привилегии до такой степени, что вы сможете публиковать изображения
Я разместил изображение схемы :)
из какой программы захвачено ваше изображение, из любопытства?
из симулятора айсис
Это продукт Proteus для новичков в Isis.

Ответы (2)

С вашим кодом и схемой не может быть все в порядке, если SCK не генерирует часы ;-)

(Обратите внимание, что SCK предназначен для SPI. SCL — это имя для вывода I2C. Поэтому ниже ссылка на SCL — это то, что вы называете SCK)

Это может быть из-за того, что вы неправильно настроили контакты, как упоминает Леон, или, возможно, из-за того, что вы не добавили подтягивающие резисторы к своим линиям SDA/SCL.

Если вы покажете свою схему (или просто сообщите нам, присутствуют ли подтяжки) и любой код инициализации I2C (например, что происходит в OpenI2C), мы сможем подтвердить, в чем проблема.

РЕДАКТИРОВАТЬ. Глядя на вашу схему, похоже, что у вас нет подтяжки на SCL, из-за чего на ней ничего не видно. Линии I2C управляются с использованием выходов с открытым стоком, что означает, что контакт может только потреблять ток, а не его отдавать.
Если вы добавите резистор (скажем, от 2 кОм до 10 кОм) от SCL к Vdd, вы должны что-то увидеть.

РЕДАКТИРОВАТЬ 2. Я не уверен, где говорится, что на SCL не требуется подтягивания. Я только что просмотрел техническое описание и нашел это (стр. 207):

Выбор любого режима I 2 C с установленным битом SSPEN заставляет выводы SCL и SDA быть открытыми, при условии, что эти выводы запрограммированы как входы путем установки соответствующих битов TRISC или TRISD. Для обеспечения правильной работы модуля внешние подтягивающие резисторы должны быть подключены к выводам SCL и SDA.

Вы используете настоящую ПОС или симулируете вещи в ISIS? Если это симуляция, то это может быть связано с тем, как она настроена.
Вы установили биты TRIS соответствующим образом? (оба в 1)
Также для надежности установите биты 3:0 регистров ADCCON1 в 1, чтобы установить все выводы как цифровые. Вы можете сделать, например, ADCCON1 |= 0x0F;для этого.

Оли, я отредактировал свой пост и добавил изображение. пожалуйста, проверь это. Спасибо :)
Кроме того, я добавил функцию OpenI2C.
@m_engineer - Хорошо, смотрите правки - я не вижу подтягивания на SCK.
Согласно техпаспорту подтягивать SCK не нужно. Но я пробовал подтягиваться, и ничего не изменилось!
@m_engineer - Где ты это увидел?
Для scl я прочитал следующее из таблицы данных. 2.3 Последовательные данные (SDA) Это двунаправленный контакт, используемый для передачи адресов и данных в устройство и данных из него. Это клемма с открытым стоком, поэтому для шины SDA требуется подтягивающий резистор к VCC (обычно 10 кВт для 100 кГц, 2 кВт для 400 кГц и 1 МГц). Для нормальной передачи данных SDA разрешается изменять только при низком уровне SCL. Изменения во время высокого уровня SCL зарезервированы для указания условий запуска и остановки. 2.4 Последовательные часы (SCL) Этот вход используется для синхронизации передачи данных с устройства и на устройство.
@m_engineer - я не вижу, где написано, что подтягивание не требуется. I2C всегда использует открытый сток + подтяжки для обеих линий. Можете ли вы проверить, что PIC вообще работает, выполнив что-то вроде переключения булавки? Вы имитируете это или используете реальный PIC?
R1 помещается в текущую схему, но не имеет значения. Его по сути нет.

Вам необходимо настроить контакты, которые используются для интерфейса I2C для ввода/вывода. Входные контакты, которые используются совместно с аналоговыми входами, должны быть установлены как цифровые входы.

Спасибо, Леон :) Есть ли другие пины, которые я должен настроить помимо scl и sdl?
Это единственные два вывода, используемые I2C.