A_D 14 23 января, 2017 Опубликовано 23 января, 2017 · Жалоба Привет! Столкнулся с такой вот досадной проблемой, предполагаю, что она решается довольно легко, просто я не вижу или не так понимаю чего то "в-лоб"... Есть контроллер тач - 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба * что у GT811 вроде как есть адреса 0xBA \ 0xBВ - разные для записи\чтения. * если я проверяю кто на линии - то получаю ответ с адреса 0x5d, а в коде примера адрес - GT811_ADDRESS 0xBA ... Если адрес 7-ми битный, то он сдвинут на 1 бит влево и младший бит будет "0", т.е. в вашем случае 0xBA. При чтении адрес изменяется на "исходный + 1", т.е. 0xBВ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба (1) Я перед работой с девайсом по I2C всегда проверяю его наличие на шине. Нечто вроде ф-ии I2C_DeviceIsConnect(address); В вызове ничего нет, кроме первого байта адресации шины, на который slave должен дать ACK. (2) Посмотрите осцилографом, что идет в ответ на первый байт запроса, в котором адрес и режим R/~W Есть ли ACK == 0 (по 9-му клоку) (3) Кроме того, как указано выше, правильно ли выдается адрес на шину (clk 0...6). (4) Если на шине есть еще устройства - проверьте, нет ли конфликта адресов - что вполне может быть при "одноклассовых" девайсах, например EEPROM младших моделей и RTC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
YAM 0 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Я бы не искал китайские исходники. Всегда использую исходники 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A_D 14 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Спасибо за ответы!! я пробовал делать опрос на шине 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): вообще не то!! или я не правильно читаю даташит?..... И спасибо большое за ссылку!! Изучу подробнее вечером. Даташит на всякий случай - GT811.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A_D 14 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Вот тут разбор железной части - https://adelectronics.ru/2017/02/01/%d0%ba%...1%82-waveshare/ А вот тут разбор прошивки и рабочий драйвер GT811 под HAL - https://adelectronics.ru/2017/05/05/%d0%bf%...1%82-waveshare/ Может пригодится кому, кто будет использовать аналогичный тач. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться