EEPROM тачскрина I2C

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем fagci, 12 янв 2015.

  1. fagci

    fagci Нуб

    У меня EEPROM контроллер FT5316 с интерфейсом i2c slave mode.

    По спецификации, я должен отправить 6бит адреса, затем еще бит - флаг чтения/записи.

    Нашел простой способ читать с девайса данные:

    Код (Text):
    #include <Wire.h>

    void setup()
    {
      Wire.begin();        // join i2c bus (address optional for master)
      Serial.begin(9600);  // start serial for output
    }
    int i=56;
    void loop()
    {
      //Serial.print(i);
      //Serial.print(": ");
      Wire.requestFrom(i, 64);    // request 64 bytes from slave device
      int r=0;
      while(Wire.available())    // slave may send less than requested
      {
        r++;
        char c = Wire.read(); // receive a byte as character
        Serial.print(c,HEX);        // print the character
      }
      if(r>0)Serial.println(" ");
      delay(1000);
    }
    Где 56 - адрес, найденный перебором.

    Этот код выдает 16 нулевых байт. Вот мне не понятно, реальные ли это данные..

    Даташит здесь: http://wenku.baidu.com/view/51ad225c69eae009581becb8.html
     
  2. fagci

    fagci Нуб

    У меня EEPROM контроллер FT5316 с интерфейсом i2c slave mode.

    По спецификации, я должен отправить 6бит адреса, затем еще бит - флаг чтения/записи.

    Нашел простой способ читать с девайса данные:

    Код (Text):
    #include <Wire.h>

    void setup()
    {
      Wire.begin();        // join i2c bus (address optional for master)
      Serial.begin(9600);  // start serial for output
    }
    int i=56;
    void loop()
    {
      //Serial.print(i);
      //Serial.print(": ");
      Wire.requestFrom(i, 64);    // request 64 bytes from slave device
      int r=0;
      while(Wire.available())    // slave may send less than requested
      {
        r++;
        char c = Wire.read(); // receive a byte as character
        Serial.print(c,HEX);        // print the character
      }
      if(r>0)Serial.println(" ");
      delay(1000);
    }
    Где 56 - адрес, найденный перебором.

    Этот код выдает 16 нулевых байт. Вот мне не понятно, реальные ли это данные..

    Даташит здесь: http://wenku.baidu.com/view/51ad225c69eae009581becb8.html
     
  3. Unixon

    Unixon Оракул Модератор

    А где Wire.beginTransmission() и Wire.endTransmission() ?
     
  4. fagci

    fagci Нуб

    Да, по идее вообще лучше использовать Wire.write(), чтобы передать управляющие биты, а затем что-то читать.
    Насколько понимаю, мне нужно подключиться к EEPROM по адресу, который нашел, а затем передать (записать) адрес например 0x0, затем флаг и потом сразу читать (чтобы сдампить определенный кусок или байт)?

    Нашел пример подходящий, попробую вечерком
    https://www.pjrc.com/teensy/td_libs_Wire.html

    Только непонятно, как можно передать именно 7 бит :confused: Или просто писать байт, а контроллер сожрет сколько надо?
     
    Последнее редактирование: 12 янв 2015
  5. Unixon

    Unixon Оракул Модератор

    Добавьте в setup() вызов Wire.begin() и Wire.beginTransmission(), Wire.endTransmission() в начале и конце обмена данными с устройством. В противном случае библиотека Wire не будет работать корректно.
     
    fagci нравится это.
  6. fagci

    fagci Нуб

    Теперь делаю так:
    Код (Text):
    #include <Wire.h>
    #define DEV_ADDR 0x38
    void setup()
    {
      Wire.begin();
      Serial.begin(9600);
    }

    void loop()
    {
      byte num;
      Wire.beginTransmission(DEV_ADDR);
      Wire.write(0);  // address byte
      Wire.endTransmission();
     
      // read 1 byte, from address 0
      Wire.requestFrom(DEV_ADDR, 1);
      while(Wire.available()) {
        num = Wire.read();
      }
      Serial.print("num = ");
      Serial.println(num, DEC);
     
      // increment num
      num = num + 1;
     
      // write "num" to 24C256 eeprom at address zero
      Wire.beginTransmission(DEV_ADDR);
      Wire.write(0);    // address byte
      Wire.write(num);  // any more send starts writing
      Wire.endTransmission();
     
      // next time loop runs, it should retrieve the
      // same number it wrote last time... even if you
      // shut off the power
      delay(1000);
    }
    И все равно не пишется, при чем WAKE пин замыкал как на землю, так и на V+
     
  7. fagci

    fagci Нуб

  8. fagci

    fagci Нуб