Я работаю над университетским проектом, в котором мне нужно связать 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
}
С вашим кодом и схемой не может быть все в порядке, если 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;
для этого.
Вам необходимо настроить контакты, которые используются для интерфейса I2C для ввода/вывода. Входные контакты, которые используются совместно с аналоговыми входами, должны быть установлены как цифровые входы.
викатку
м_инженер
викатку
м_инженер
РДЦК