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