EEPROM тачскрина I2C
- Войдите на сайт для отправки комментариев
Пнд, 12/01/2015 - 10:00
У меня 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
Для поиска устройств на шине загугли i2cscanner ;)
Для того, чтобы что-то прочитать, попробуй туда что-то записать для начала.
Radjah,
Загуглил, прогоню еще=)
Дело в том, что ЕЕПРОМ этот уже был прошит неверной прошивкой, от чего сам тач софтварно сдох.
Поэтому хотелось бы сделать дамп для начала того, что там есть..
Да, кажется, нужно сделать Wire.write туда тех битов, которые контроллеру нужны, а затем уже читать=)
В общем, буду пробовать=)
Сделал так:
#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+
А точно с нулевого адреса чтение производить?
Эм..по идее адресация же с нуля идет?
Можно попробовать и пройтись по адресам.
В даташите про адрес написано, что: 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, все верно, только при текущем подключении находит устройство:
Вывел дамп регистров после записи в них - одни нули, как и было..использовал внутренности библиотеки, что выложил выше..
А есть ли способ замерить уровни сигнала с линии I2C, чтобы понять, достаточен ли он для общения с устройством в данном случае?
Возможно уровень низкий и не проскакивает как HIGH/LOW, поэтому и не происходит чтение/запись?
Не хочется верить в то, что попрощался с тачем..тач от смарта, восстановить хочется..
По уму надо осциллографом в линии потукать, чтобы убедиться, что устройство вообще что-то отвечает на запросы.
Вот его нет к сожалению..можно конечно вторую arduino присабачить с дисплеем, замутить скетч с замером импульсов, только это же надо по длительности определяться как-то..
Заказал конвертер уровней с 5 до 3v3, попробую через него.
У меня pro mini аналог, номинальное 5v, поэтому использовать на поддержке 3.3 вольтами не есть гуд.
Кстати, 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, может сейчас ответят..
FocalTech молчат, у них мылоящик поломался =(
Решение
http://pastebin.com/YFhxnZ2A
Некропост: решил описать, как всё было. https://mikhail-yudin.ru/blog/hardware/proshivka-touchscreen-ft5316