Как использовать I2C на плате STM3241G-Eval с библиотекой stm32f4xx_hal_i2c - PullRequest
0 голосов
/ 24 марта 2019

Попытка выучить 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, возможно, я чего-то не знаю и не понимаю, поэтому я благодарен за все комментарии и помогаю в этом, спасибо.

...