Я очень новичок в использовании STM CUBE и HAL_libraries. Я использую микроконтроллер STM32F0 с 32 контактами. Схема для I2C верна. Поэтому мне нужна небольшая помощь здесь.
У меня есть емкостный датчик ( FDC1004 ), который использует связь I2C. Я должен написать эти регистры, чтобы прочитать данные.
Как правильно отправить мастер формы запроса START на подчиненное устройство (адрес ведомого устройства A0)?
Как установить указатель на регистр 0x0C?
- Лист данных видит (Регистр 0x0C: бит [7: 4]) в 1.) Я не знаю, как это сделать? И наконец, как ЧИТАТЬ с того же регистра?
- Кроме того, я должен подождать поле DONE_x (регистр 0x0C: биты [3: 0]), прежде чем я его прочту?
Но я не знаю, правильно ли я обращаюсь к регистрам! Потому что я не получаю никаких данных от датчика!
Вот мой код:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
источник
источник
Ответы:
Давайте начнем с
HAL_I2C_Master_Transmit()
функции. Если вы проверите свою декларацию:Незначительная проблема со вторым параметром, адрес подчиненного устройства. Адрес ведомого устройства:
b1010000
если мы заполним его до 8-битного формата, он будет0xA0
, как вы сказали. Теперь при передаче этогоHAL_I2C_Master_Transmit()
вам не нужно устанавливать бит R / W вручную, HAL сделает это за вас. Таким образом, при вызовеHAL_I2C_Master_Transmit()
переданный бит R / W будет автоматически равен 0, что означает операцию записи, а при вызовеHAL_I2C_Master_Receive()
переданный бит R / W будет автоматически равен 1, что означает операцию записи . Вы смешали значения R / W, но я думаю, что это не важен для функции, так что это не фактическая ошибка в вашем коде.Третий параметр (
uint8_t *pData
) представляет собой указатель на буфер , который содержит данные , которые должны быть отправлено . Теперь в вашем вызове третий параметр -0x0C
это ваши фактические данные, адрес регистра. Проблема в том, что он будет интерпретироваться как указатель (наHAL_I2C_Master_Transmit()
) на область памяти, где можно найти некоторые неопределенные данные.Четвёртый параметр является размером буфера , количество байт , которые должны быть отправлено. Если вы хотите отправить один байт, тогда этот параметр должен быть 1, а не 10.
Пишите регистры
Вот соответствующая схема из таблицы.
Таким образом , после отправки адреса ведомого к шине, еще три байта должен быть передан: регистр указателя , MSB байт , LSB байт . Общая реализация с записью 16-битных регистров HAL:
Пример с вашими ценностями:
write_register(0x0C, 0x0054);
В качестве альтернативы также может использоваться определенная HAL функция записи в регистр, которая имеет дополнительные параметры для передачи адреса регистра и размера адреса.
Теперь
HAL_I2C_Master_Receive()
функция почти такая же, как и у других.Разница лишь в том, что третий параметр является указателем на буфер, в котором будут храниться полученные данные . это
0x02
в вашем коде, и я не знаю, с какой целью вы его использовали, но он будет интерпретирован как указатель (к сожалению, на случайную ячейку памяти).Читать регистры
Пример:
Существует также HAL-определенная функция чтения регистров, которая имеет.
Прочитайте раздел 8.5 Программирование таблицы данных для более подробной информации.
источник