作为初学者,我尝试在两个 pic18f4550 之间发送数据,其中主机发送数据,从机接收数据并在 LED(PORTD)上打印数据位。但我不知道问题出在哪里,从机没有确认并且数据没有传输。
//==================== Master I2C code=========================
bit I2C_Write(unsigned char address, unsigned char \*data, unsigned char datasize) {
SSPCON2bits.SEN = 1; // Initiate Start condition on SDA and SCL pins. Automatically cleared by hardware
while (!SSPIF);
PIR1bits.SSPIF = 0;
LED1 = 1;
SSPBUF = address;
while (!SSPIF);
PIR1bits.SSPIF = 0;
LED2 = 1; /// ---------------> This turns ON
if (SSPCON2bits.ACKSTAT) {
SSPCON2bits.PEN = 1;
while (PEN);
ACK = 1;
return WriteSuccessful = 0;
}
LED3 = 1; /// -----------------> but This remains off
int i;
for (i = 0; i < datasize; i++) {
SSPBUF = *data;
while (!SSPIF);
PIR1bits.SSPIF = 0;
if (SSPCON2bits.ACKSTAT) {
SSPCON2bits.PEN = 1;
while (PEN);
ERROR = 1;
return WriteSuccessful = 0;
}
LED = *data;
data++;
}
LED4 = 1;
PEN = 1; // I2C Stop
while (PEN);
PIR1bits.SSPIF = 0;
return WriteSuccessful = 1;
}
//-----here is i2c initalization---------
void I2C_INIT(void) {
SDA_dir = 1;
SCL_dir = 1;
ADCON1bits.PCFG = 0b1111;
SSPADD = _XTAL_FREQ / (4 * (Baud_Rate)) - 1;
SSPSTATbits.SMP = 0; // Slew rate control disabled for Standard Speed mode (100 kHz and 1 MHz)
SSPCON1bits.SSPEN = 1;
SSPCON1bits.SSPM = 0b1000; // I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))(2,3)
)
//------- i2c master call--------
unsigned char data\[5\] = {0xA1, 0xB1, 0xC1, 0xD1, 0xE1};
I2C_Write(0b00111100, data, 5);
在从机中我只使用ISR来读取SSPBUF:
//=======================Slave I2c code===========================
void __interrupt() ISR(void) {
if (PIR1bits.SSPIF) {
if (SSPSTATbits.D_NOT_A) {
// This means the received byte is data
Read_data = SSPBUF; // Read the received data
LED = Read_data; //-----------------------\> these remains blank!
} else if (!SSPSTATbits.D_NOT_A) {
MATCH = 1; //----------------------------\> This Turns On
}
PIR1bits.SSPIF = 0;
}
}
//--------slave init---------------------
void I2C_INIT(void) {
SDA_dir = 1; //
SCL_dir = 1; //
ADCON1bits.PCFG = 0b1111;
SSPADD = 0b00111100; // Writing address for slave mode
SSPSTATbits.SMP = 1; // Slew rate control disabled for Standard Speed mode (100 kHz and 1 MHz)
SSPCON1bits.SSPEN = 1; //
// SSPCON1bits.SSPM = 0b1000; // I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))(2,3)
SSPCON1bits.SSPM = 0b1110; //I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled(2)
SSPCON2bits.ACKEN = 1;
}
我尝试通过 I2C 协议在两个 pic18f4550 设备之间发送数据,但失败,即从设备未发送确认位。它会减慢地址匹配速度!
这个问题已经解决了
以下是已发现的问题及其解决方案:
致大师:
对于奴隶:
重要提示:
您可以在我的 GitHub 存储库中找到更新的代码 - AIZAZ588。
如果有人发现任何错误或有更多见解,请随时提供更正或建议,因为我是一名学生和初学者。您的反馈很有价值!