EEPROM тачскрина I2C

fagci
Offline
Зарегистрирован: 12.01.2015

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

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

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

#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

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Для поиска устройств на шине загугли i2cscanner ;)

Для того, чтобы что-то прочитать, попробуй туда что-то записать для начала.

fagci
Offline
Зарегистрирован: 12.01.2015

Radjah, 

Загуглил, прогоню еще=)

Дело в том, что ЕЕПРОМ этот уже был прошит неверной прошивкой, от чего сам тач софтварно сдох.

Поэтому хотелось бы сделать дамп для начала того, что там есть..

Да, кажется, нужно сделать Wire.write туда тех битов, которые контроллеру нужны, а затем уже читать=)

В общем, буду пробовать=)

fagci
Offline
Зарегистрирован: 12.01.2015

Сделал так:

#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+

Radjah
Offline
Зарегистрирован: 06.08.2014

А точно с нулевого адреса чтение производить?

fagci
Offline
Зарегистрирован: 12.01.2015

Эм..по идее адресация же с нуля идет?

Можно попробовать и пройтись по адресам.

В даташите про адрес написано, что: Slave address A[6:0]: address bits are identical to those of I2CADDR [7:1] register.

Здесь даташит похожего чипа, рисунки не искажены: http://www.displayfuture.com/Display/datasheet/controller/FT6x06.pdf

Проверил сейчас правильность подключения SDA/SCL, все верно, только при текущем подключении находит устройство:

Scanning...
I2C device found at address 0x38  !
done
 
Присабачил подтягивающие резисторы в 1.2К на оба контакта, та же песня..
Тут нашел http://www.ladyada.net/wiki/tutorials/library/i2caddr.html адрес тачскрина (в самом низу), все верно..
Прописал значение адреса такое же, как и адрес I2C..все равно нули читаются после записи..
 
fagci
Offline
Зарегистрирован: 12.01.2015

Вывел дамп регистров после записи в них - одни нули, как и было..использовал внутренности библиотеки, что выложил выше..

fagci
Offline
Зарегистрирован: 12.01.2015

А есть ли способ замерить уровни сигнала с линии I2C, чтобы понять, достаточен ли он для общения с устройством в данном случае?

Возможно уровень низкий и не проскакивает как HIGH/LOW, поэтому и не происходит чтение/запись?

Не хочется верить в то, что попрощался с тачем..тач от смарта, восстановить хочется..

Radjah
Offline
Зарегистрирован: 06.08.2014

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

fagci
Offline
Зарегистрирован: 12.01.2015

Вот его нет к сожалению..можно конечно вторую arduino присабачить с дисплеем, замутить скетч с замером импульсов, только это же надо по длительности определяться как-то..

Заказал конвертер уровней с 5 до 3v3, попробую через него.

У меня pro mini аналог, номинальное 5v, поэтому использовать на поддержке 3.3 вольтами не есть гуд.

fagci
Offline
Зарегистрирован: 12.01.2015

Кстати, ACK же читает, значит согласовыватьать и не нужно=)

Только пока не понял, почему все-таки не выходит записать-прочитать записанные значения..

Сделал программное включение "по мануалу", история та же..

#include "Arduino.h"
#include <Wire.h>
#define DEV_ADDR 0x38

#define WAK_PIN 4
#define VCC_PIN 3
#define RST_PIN 2

void test(){
  Serial.print("I");
  //init before r/w
  Serial.print("-");
  digitalWrite(VCC_PIN, LOW);
  digitalWrite(RST_PIN, LOW);
  delay(200);
  digitalWrite(VCC_PIN, HIGH);
  Serial.print("+");
  delay(200);
  digitalWrite(RST_PIN, HIGH);
  Serial.print("R");
  delay(200);
  
  Wire.begin();
  Serial.print(": ");
  
  for (int16_t i=0; i<0xA8; i++) {
    digitalWrite(WAK_PIN, i%2==0?LOW:HIGH);
    wr(i,0xAA), delay(100);
    rr(i);
  }
  
  Serial.println(" ");
}

void setup(){
  Serial.begin(9600);
  pinMode(VCC_PIN, OUTPUT);
  pinMode(RST_PIN, OUTPUT);
  pinMode(WAK_PIN,OUTPUT);
  Serial.println("Begin");
  test();
}

void loop(){}

void assert(int e){
  if(e){ Serial.print("[E");Serial.print(e);Serial.print("]"); } 
}

void rr(uint8_t reg) {
  Wire.beginTransmission(DEV_ADDR);
  Wire.write((byte)reg);
  assert(Wire.endTransmission());
  Wire.beginTransmission(DEV_ADDR);
  Wire.requestFrom((byte)DEV_ADDR, (byte)1);
  if(Wire.available()) Serial.print(Wire.read(),HEX);
  else Serial.print("X");
  assert(Wire.endTransmission());
}

void wr(uint8_t reg, uint8_t val) {
  Wire.beginTransmission(DEV_ADDR);
  Wire.write((byte)reg);
  Wire.write((byte)val);
  assert(Wire.endTransmission());
}

Это я уже дергать пин WAKE начал..он оказывается работает как вход и как выход..думал уже, что необходимо ждать с этого пина сигнала на прерывание и читать с контроллера данные только в этот момент, но посмотрев мануалы по привязке контроля прерывания к пину понял, что нужно использовать пины 2 и 3, а у меня он на 4-м висит, перевтыкать не стал, пора было спать=)

Но не думаю, что реализация такой штуки помогла бы в решении проблемы, только появились бы новвые=)

Написал второй раз в FocalTech, может сейчас ответят..

fagci
Offline
Зарегистрирован: 12.01.2015

FocalTech молчат, у них мылоящик поломался =(

fagci
Offline
Зарегистрирован: 12.01.2015
fagci
Offline
Зарегистрирован: 12.01.2015

Некропост: решил описать, как всё было. https://mikhail-yudin.ru/blog/hardware/proshivka-touchscreen-ft5316