Попытка выучить I2C на плате STM32 Eval. У меня есть плата STM3241G-Eval, и я пытаюсь заставить IO Expander работать, используя I2C. Я новичок в плате и новичок в I2C.
Ссылка на бортовое руководство:
https://www.st.com/content/ccc/resource/technical/document/user_manual/f6/38/77/c2/9f/01/4a/26/DM00036744.pdf/files/DM00036744.pdf/jcr:content/translations/en.DM00036744.pdf
Ссылка на руководство по IO-расширителям:
https://datasheet.lcsc.com/szlcsc/STMicroelectronics-STMPE811QTR_C118017.pdf
Я создал проект с STM32CubeMX для платы. Все, что я сделал, это включил FREERTOS и I2C1. Хотите использовать FreeRTOS, потому что это может понадобиться позже. С CubeMX я подключил SDA и SCL к PB9 и PB6. Затем сгенерировал код TrueStudio и открыл его с помощью TrueStudio.
В TrueStudio я преобразовал проект в проект C ++.
На плате eval есть джойстик, состояние которого я хотел бы прочитать, используя I2C.
Джойстик подключен к расширителю ввода-вывода.
Я создал задачу для запуска в RTOS, и задача выполняется в режиме отладки, но я просто не могу ничего прочитать с I2C.
Чем больше я пытаюсь найти решение, тем больше я запутываюсь. Я пытался использовать HAL_I2C_Master_Receive для чтения состояния джойстика, но также я видел один пост, в котором говорится, что я должен использовать HAL_I2C_Mem_Read. Теперь я не уверен, что мне следует использовать? Или я должен использовать какой-то другой метод из библиотеки HAL I2C?
Адрес расширителя ввода-вывода 0x88, и я пытаюсь использовать функцию «Состояние контакта монитора GPIO»
регистр ", который имеет адрес 0x12.
Я определил адрес I2C
#define I2C_ADDRESS (0x88)
У меня есть буфер, где я могу установить адрес и где прочитать результат
unsigned char buffer1[3];
Я читаю состояние и состояние I2C, используя эти
HAL_I2C_StateTypeDef state;
HAL_StatusTypeDef status;
Я использую задержку в 20 мс, хотя я не уверен, что это необходимо
TickType_t xDelay = 20 / portTICK_PERIOD_MS;
Я задаю адрес, с которого хочу прочитать, и затем читаю его в цикле
buffer1[0] = 0x12
HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, buffer1,1, 100);
for(;;)
{
vTaskDelay(xDelay);
buffer1[0] = 0x00;
buffer1[1] = 0x00;
buffer1[2] = 0x00;
HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, buffer1,3, 100);
b1 = buffer1[0]; //this stays zero
b2 = buffer1[1]; //this stays zero
b3 = buffer1[2]; //this stays zero
state = HAL_I2C_GetState(&hi2c1); //HAL_I2C_STATE_READY
status = HAL_I2C_IsDeviceReady(&hi2c1, I2C_ADDRESS, 1, 100); //HAL_ERROR when using 0x88<<1 and HAL_OK when using 0x88
}
В библиотеке HAL I2C говорится, что адрес должен быть смещен влево, но когда я это делаю, я получаю HAL_ERROR, когда я использую 0x88 напрямую, я получаю HAL_OK в качестве статуса I2C. Любой комментарий по этому поводу?
Я не уверен, насколько большим должен быть буфер при чтении результата. А при чтении буфера он содержит только нули.
С I2C, возможно, я чего-то не знаю и не понимаю, поэтому я благодарен за все комментарии и помогаю в этом, спасибо.