2015-05-08 6 views
0

Я новичок в PIC. Я знаю, что в этом форуме на I2C много сообщений, и я пробовал все предоставленные методы, но до сих пор не решает проблему. Я использую pic16f1516 и внешний EEPROM CAT24C04TDI для хранения некоторых данных. Я использовал 4k7 Ом резисторы вырывать и мой код:PIC I2C связь с внешним EEPROM

void I2CWrite(void); 
void WaitMSSP(void); 
void I2CRead(void); 
void i2c_init(void); 
//void _delay_ms(unsigned int); 
void main() 
{ 
_delay_ms(100); // Give delay for power up 
i2c_init(); // Initialize I2C 
_delay_ms(20); 
I2CWrite(); // Sends the data to I2C EEPROM 
_delay_ms(50); 
while(1) 
{ 
I2CRead(); // Read back the data?s 
TXREG='\n'; 
while(TXIF==0); 
TXREG='\r'; 
_delay_ms(500); 
} 
} 
void I2CWrite() 
{ 
SSPCON2bits.SEN=1; 
WaitMSSP(); // wait for the operation to be finished 
SSPBUF=0xa0;//Send Slave address write command 
WaitMSSP(); 
SSPBUF=0x00; // Send the starting address to write 
WaitMSSP(); 
SSPBUF=0x34; // rough data to be written 
WaitMSSP(); 
} 
PEN=1; // Send stop bit 
WaitMSSP(); 
} 
void I2CRead() 
{ 
SEN=1; //Send start bit 
WaitMSSP(); //wait for the operation to be finished 
SSPBUF=0xa0;//Send Slave address write command 
WaitMSSP(); 
SSPBUF=0x00; // Send the starting address to write 
WaitMSSP(); 
RSEN=1; // Send re-start bit 
WaitMSSP(); 
SSPBUF=0xa1; // Slave address read command 
WaitMSSP(); 
RCEN=1; // Enable receive 
WaitMSSP(); 
ACKDT=1; // Acknowledge data 1: NACK, 0: ACK 
ACKEN=1; // Enable ACK to send 
PEN=1; // Stop condition 
WaitMSSP(); 
putch(SSPBUF); // Send the received data to PC 
_delay_ms(30); 
} 
PEN=1; 
WaitMSSP(); 
} 
void WaitMSSP() 
{ 
while(!SSPIF); // while SSPIF=0 stay here else exit the loop 
SSPIF=0; // operation completed clear the flag 
} 
void i2c_init() 
{ 
TRISCbits.TRISC3=1; // Set up I2C lines by setting as input 
TRISCbits.TRISC4=1; 
SSPCON1 = 0b00101000; 
// SSPADD=(FOSC/(4 * I2C_FREQ)) - 1; //clock 100khz 
SSPADD = 0x18 ; //clock 100khz 
SSPSTAT=80; // Slew rate control disabled 

PIR1bits.SSPIF = 0; // Clear MSSP interrupt request flag 
PIE1bits.SSPIE = 1; // Enable MSSP interrupt enable bit 

} 

Когда я подключить его к осциллографу, ничего не происходит SDA и SCL портов после отправки SEN = 1. Пожалуйста, помогите мне с этой проблемой. Я застрял с этим с давних времен.

+0

С быстрым взглядом вы включаете прерывания, но у вас нет обработчиков прерываний. Кажется, что ваш код работает, опросив флаг прерывания (это нормально), но если это так, вы не должны активировать прерывания в регистре INTCON. – Jon

+0

Я пробовал с удалением регистра INTCON, но все еще не работает. – PicFan57

+0

Ваш код не будет компилироваться из-за несоответствия брекетов. На строках 33 и 57 вы имеете код 'PEN = 1; WaitMSSP();} '(тот же самый раз), который находится за пределами предыдущих функций. –

ответ

0

SSPIF не регистр: лист данных показывает, что это будет бит 3 в регистре PIR1 так вместо линии

while(!SSPIF); // while SSPIF=0 stay here else exit the loop 
SSPIF = 0;  // operation completed clear the flag 

это означает, что вы должны проверить и очистить его с

while ((PIR1 & 0x08) == 0); 
PIR1 = 0; 

Инструкция ассемблера для сброса статуса:

BCF PIR1,SSPIF ;I2C done, clear flag 

и более подробная информация о коде in this forum также, пожалуйста, прочтите информационный лист для получения дополнительной информации.

+0

Я пробовал этот код, но, к сожалению, не помог. После того, как бит SEN установлен на высокий уровень, в SCL или SDA-контактах нет изменений. – PicFan57

Смежные вопросы