реклама на сайте
подробности

 
 
> I2C, HAL, запись и чтение GT811
truppik
сообщение Jan 23 2017, 20:53
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 24-07-14
Из: NA
Пользователь №: 82 352



Привет!
Столкнулся с такой вот досадной проблемой, предполагаю, что она решается довольно легко, просто я не вижу или не так понимаю чего то "в-лоб"...
Есть контроллер тач - 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 ( 5.36 килобайт ) Кол-во скачиваний: 43



--------------------
never know best.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
A.Lex
сообщение Jan 24 2017, 04:24
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



Цитата(truppik @ Jan 23 2017, 22:53) *
* что у GT811 вроде как есть адреса 0xBA \ 0xBВ - разные для записи\чтения.
* если я проверяю кто на линии - то получаю ответ с адреса 0x5d, а в коде примера адрес - GT811_ADDRESS 0xBA ...


Если адрес 7-ми битный, то он сдвинут на 1 бит влево и младший бит будет "0", т.е. в вашем случае 0xBA.
При чтении адрес изменяется на "исходный + 1", т.е. 0xBВ.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 24 2017, 07:26
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



(1) Я перед работой с девайсом по I2C всегда проверяю его наличие на шине.
Нечто вроде ф-ии I2C_DeviceIsConnect(address);
В вызове ничего нет, кроме первого байта адресации шины, на который slave должен дать ACK.
(2) Посмотрите осцилографом, что идет в ответ на первый байт запроса, в котором адрес и режим R/~W
Есть ли ACK == 0 (по 9-му клоку)

(3) Кроме того, как указано выше, правильно ли выдается адрес на шину (clk 0...6).
(4) Если на шине есть еще устройства - проверьте, нет ли конфликта адресов - что вполне может быть
при "одноклассовых" девайсах, например EEPROM младших моделей и RTC

Go to the top of the page
 
+Quote Post
YAM
сообщение Jan 24 2017, 09:56
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



Я бы не искал китайские исходники.
Всегда использую исходники 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


--------------------
Go to the top of the page
 
+Quote Post
truppik
сообщение Jan 24 2017, 11:08
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 24-07-14
Из: NA
Пользователь №: 82 352



Спасибо за ответы!!
я пробовал делать опрос на шине 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):
Прикрепленное изображение

вообще не то!!
или я не правильно читаю даташит?..... wacko.gif

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

Даташит на всякий случай - Прикрепленный файл  GT811.pdf ( 1.11 мегабайт ) Кол-во скачиваний: 47


--------------------
never know best.
Go to the top of the page
 
+Quote Post
truppik
сообщение Jun 20 2017, 11:16
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 24-07-14
Из: NA
Пользователь №: 82 352



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

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

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


--------------------
never know best.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016