I2C Связь с EEPROM - PullRequest
       41

I2C Связь с EEPROM

0 голосов
/ 17 февраля 2019

У меня, по сути, есть эта проблема, которая меня давно беспокоила.У меня есть процессор PIC32MX128L128H и базовый экран ввода / вывода.Пины и все сделано правильно, за исключением моего общения с EEPROM с I2C.Я скопирую свой код ниже, но до этого у меня есть элементы управления:

I2C1CON: бит 0 SEN: условие запуска, бит разрешения 2 PEN: условие включения, бит включения 3, RCEN: бит разрешения приема, бит 4 ACKEN: Бит подтверждения последовательности подтверждения, бит 5 ACKDT: бит подтверждения данных

I2C1STAT: бит 15 ACKSTAT: бит состояния подтверждения (1 = не получено, 0 = получено), бит 14 TRSTAT: бит состояния передачи, бит 6 I2COV: получение I2CБит состояния переполнения

Спасибо!

void EEPROM_wait(){
  while(I2C1STAT & (1 << 15)){

    I2C1CON |= 0x1;
    while(I2C1CON & 0x1);

    I2C1TRN = 0xa0;
    while(I2C1STAT & (1 << 14));

  }
}

void i2c_wait(){
  while(I2C1CON & 0x1f || I2C1STAT & (1 << 14));
}




void writeByte(uint8_t lowByte, uint8_t highByte, uint8_t data){


  //Start Procedure
  do{
  I2C1CON |= 0x1;
  i2c_wait();
  I2C1TRN = 0xa0;
  i2c_wait();
  } while(I2C1STAT & (1 << 15));
  //Send the adress of the EEPROM and also R/W bit

  //Send highByte
  I2C1TRN = highByte;
  i2c_wait();

  //Send lowByte
  I2C1TRN = lowByte;
  i2c_wait();

  //Send actual data
  I2C1TRN = data;
  i2c_wait();

  //Stop the procedure
  I2C1CON |= 0x4;
  i2c_wait();

  EEPROM_wait();



}


uint8_t readByte(uint8_t lowByte, uint8_t highByte)
{



  //Initialize Procedure
  do{
  I2C1CON |= 0x1;
  i2c_wait();
  I2C1TRN = 0xa0;
  i2c_wait();
  }while(I2C1STAT & (1 << 15));

  //Send the address of the EEPROM
  //I2C1TRN = 0xa0;
  //i2c_wait();

  //Send highByte
  I2C1TRN = highByte;
  i2c_wait();

  //Send lowByte

  I2C1TRN = lowByte;
  i2c_wait();

  //Initialize Procedure Read
  do{
  I2C1CON |= 0x1;
  i2c_wait();
  I2C1TRN = 0xa1;
  i2c_wait();
  } while (I2C1STAT & (1 << 15));

  //Send the address of the EEPROM with Read bit
  //I2C1TRN = 0xa1;
  //i2c_wait();

  //Enable Receive Procedure
  I2C1CON |= 1 << 3;
  i2c_wait();
  I2C1STATCLR = 1 << 6;

  //Read from the EEPROM
  uint8_t rtn = I2C1RCV;

  //Acknowledge
  I2C1CON &= ~(1 << 5);
  I2C1CON |= 1 << 4;

  //Stop Procedure
  I2C1CON |= 1 << 2;
  i2c_wait();

  return rtn;

}

1 Ответ

0 голосов
/ 18 февраля 2019

Я понял, в чем проблема.Тактовая частота шины чипкита не была установлена ​​так же, как тактовая частота шины i2c, что приводило к переписыванию или неправильному прочтению.

...