Перейти к содержанию
    

I2C, HAL, запись и чтение GT811

Привет!

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

Есть контроллер тач - GT811. Использую STM32F1 и осваиваю HAL, так вот простые датчики на i2c, такие как MPU-6050 или HMC5883L запустились с пол пинка и работают стабильно. В них адреса регистров 8-битные и данные тоже - потому вопросов не возникло что и как делать. К примеру запись на HMC5883L выглядит так:

Код:

void HMC5883L_I2C_ByteWrite(uint8_t slaveAddr, uint8_t *pBuffer, uint8_t WriteAddr)
{
   HAL_StatusTypeDef status;
   status = HAL_I2C_Mem_Write(&hi2c2, slaveAddr << 1, WriteAddr, I2C_MEMADD_SIZE_8BIT, pBuffer, 1, 1000);
}

А чтение горсти регистров на нем же выглядит так (If можно выкинуть, в нем кода никакого не вставлял):

Код:

void HMC5883L_I2C_BufferRead(uint8_t slaveAddr, uint8_t *pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)
{
   HAL_I2C_Master_Transmit(&hi2c2, slaveAddr << 1, &ReadAddr, 1, HMC5883L_I2C_TIMEOUT);
   if (HAL_I2C_Master_Receive(&hi2c2, slaveAddr << 1, pBuffer, NumByteToRead, HMC5883L_I2C_TIMEOUT) == HAL_OK) 
   {
   }
}

 

А вот с GT811 трудности..

Нашел пример для контроллера GD32F103C8T6 - https://github.com/pysco68/waveshare-hid/bl...ter/src/gt811.c но там понятное дело HAL не используется.

Попробовал сделать вот так - запись:

Код:

void GT811_RegWrite(uint16_t reg, uint8_t size, uint8_t *data)
{
   HAL_StatusTypeDef status;
   status = HAL_I2C_Mem_Write(&hi2c2, GT811_ADDR << 1, reg, I2C_MEMADD_SIZE_16BIT, data, size, GT811_I2C_TIMEOUT);
}

и чтение:

Код:

void GT811_RegRead(uint16_t reg, uint8_t size, uint8_t *data)
{
     HAL_StatusTypeDef status;
     status = HAL_I2C_Mem_Read(&hi2c2, GT811_ADDR << 1, reg, I2C_MEMADD_SIZE_16BIT, data, size, GT811_I2C_TIMEOUT);   
}

но что то меня терзают смутные сомнения что это правильно работает... оно то нули считывает, то вроде бы что то (но никак не повторяющееся, для одного и того же касания пальца)...

+ смущает несколько моментов:

* что у GT811 вроде как есть адреса 0xBA \ 0xBВ - разные для записи\чтения.

* если я проверяю кто на линии - то получаю ответ с адреса 0x5d, а в коде примера адрес - GT811_ADDRESS 0xBA ...

* контроллер GT811 дергает линию INT с частотой 0,5-0,8Гц постоянно, вне зависимости от того, есть ли касание или нет - не понятное поведение, такое чувство, что он просто не инициализирован (т.к. не работает запись).

 

Может у кого есть мысли что не так или может даже кто работал с таким тачем?

 

 

Зы. нашел еще исходники с какой то отладочной платы на stm32, но тут вообще треш - софтварный i2c и не очень хорошо написан сам драйвер GT811. Все комментарии на Китайском так же особо не помогают...

CTOUCH.rar

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

* что у GT811 вроде как есть адреса 0xBA \ 0xBВ - разные для записи\чтения.

* если я проверяю кто на линии - то получаю ответ с адреса 0x5d, а в коде примера адрес - GT811_ADDRESS 0xBA ...

 

Если адрес 7-ми битный, то он сдвинут на 1 бит влево и младший бит будет "0", т.е. в вашем случае 0xBA.

При чтении адрес изменяется на "исходный + 1", т.е. 0xBВ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(1) Я перед работой с девайсом по I2C всегда проверяю его наличие на шине.

Нечто вроде ф-ии I2C_DeviceIsConnect(address);

В вызове ничего нет, кроме первого байта адресации шины, на который slave должен дать ACK.

(2) Посмотрите осцилографом, что идет в ответ на первый байт запроса, в котором адрес и режим R/~W

Есть ли ACK == 0 (по 9-му клоку)

 

(3) Кроме того, как указано выше, правильно ли выдается адрес на шину (clk 0...6).

(4) Если на шине есть еще устройства - проверьте, нет ли конфликта адресов - что вполне может быть

при "одноклассовых" девайсах, например EEPROM младших моделей и RTC

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы не искал китайские исходники.

Всегда использую исходники linux для привязки любых тачей по I2C.

Конкретно у GT811 есть несколько ревизий которые имеют разные адреса:

#define TPD_CHIP_VERSION_C_FIRMWARE_BASE 0x5A

#define TPD_CHIP_VERSION_D1_FIRMWARE_BASE 0x7A

#define TPD_CHIP_VERSION_E_FIRMWARE_BASE 0x9A

#define TPD_CHIP_VERSION_D2_FIRMWARE_BASE 0xBA

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы!!

я пробовал делать опрос на шине i2c - кто есть таким кодом:

for(x=0;x<128;x++)
    {
         if(HAL_I2C_IsDeviceReady(&hi2c2, x << 1, 10, 100) == HAL_OK)
         {
                ST7735_PutDec(x,3,y,120,4555,0);
                y+=14;
         }
    }

на экран просто тупо выводится адрес отозвавшегося slave. Для датчиков MPU-6050 \ HMC5883L адреса одинаковы: на какой отозвались такой же и в библиотеке для каждого из них прописан. А вот для GT811 странность - он отзывается на 0x5D. Это какая то ревизия новая что ли...

 

Про сдвиг адреса для HAL тоже знаю, у себя это учел.

 

Конфликтов на шине нет, вначале было все 3 устройства подключены - MPU-6050 \ HMC5883L \ GT811 (на макетке), все отзываются на разные адреса и первые два прекрасно работают с остальными.

Сейчас отключил всё, кроме GT811. Уже и понизил скорость до 100кГц на всякий случай.

 

Хм.... а с адресами засада какая то.. в китай-даташите о ревизиях я не нашел ничего такого. Более того, в более-менее нормальных исходниках отсюда https://github.com/pysco68/waveshare-hid/bl...ter/src/gt811.h прописано, что:

#define GT811_REGISTERS_CONFIGURATION 0x6A2
#define GT811_REGISTERS_READ 0x721

В даташите же я вижу следующее (к примеру для GT811_REGISTERS_CONFIGURATION):

post-82352-1485255978_thumb.png

вообще не то!!

или я не правильно читаю даташит?..... :wacko:

 

И спасибо большое за ссылку!! Изучу подробнее вечером.

 

Даташит на всякий случай - GT811.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тут разбор железной части - https://adelectronics.ru/2017/02/01/%d0%ba%...1%82-waveshare/

 

А вот тут разбор прошивки и рабочий драйвер GT811 под HAL - https://adelectronics.ru/2017/05/05/%d0%bf%...1%82-waveshare/

 

Может пригодится кому, кто будет использовать аналогичный тач.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...