STM32F4. Урок 18 — Низкоуровневый I2C

Эта библиотека предназначена для использования интерфейса I2C в режиме Master. Выбранные выводы I2C должны быть записаны в C-файле (в H-файле можно регулировать частоту тактирования). К линиям SCL и SDA необходимо подключить подтягивающие вверх резисторы по 4,7кОм, иначе интерфейс работать не будет. Данная библиотека позволяет использовать низкоуровневые функции для отправки и получения байтов от устройства Slave.В библиотеке есть функции для приема/отправки как одиночных байтов, так и последовательности. Для приема/отправки нескольких байт используется массив. Также предусмотрена функция паузы, необходимая для работы с медленными устройствами. В примере приведено три одинаковые библиотеки — I2C1, I2C2 и I2C3. Для работы с библиотекой I2C1 SCL подключается к PB6, а SDA — к PB7.

Требования:

   Подключаемые модули CooCox-IDE: GPIO, I2C.
   Поддерживаемые библиотеки: отсутствуют.

Функции:

 void UB_I2C1_Init(void);                                                     // инициализация интерфейса I2C int16_t UB_I2C1_ReadByte(uint8_t slave_adr, uint8_t adr);                    // прочтение байта int16_t UB_I2C1_WriteByte(uint8_t slave_adr, uint8_t adr, uint8_t wert);     // запись байта int16_t UB_I2C1_ReadMultiByte(uint8_t slave_adr, uint8_t adr, uint8_t cnt);  // чтение нескольких байт int16_t UB_I2C1_WriteMultiByte(uint8_t slave_adr, uint8_t adr, uint8_t cnt); // запись нескольких байт void UB_I2C1_Delay(volatile uint32_t nCount);                                // функция паузы

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 07.03.2013 // Version  : 1.0 // Autor    : UB // EMail    : mc-4u(@)t-online.de // Web      : www.mikrocontroller-4u.de // CPU      : STM32F4 // IDE      : CooCox CoIDE 1.7.0 // Module   : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der I2C-LoLevel-Library // Hinweis  : Diese zwei Files muessen auf 8MHz stehen //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_i2c1.h"  int main(void) {   int16_t wert;    SystemInit(); // Инициализация кварца    UB_I2C1_Init(); // Инициализация I2C1    // Байт ведомого устройства I2C с адресом 0xA0   // Читать адрес 0x01 из регистра   wert=UB_I2C1_ReadByte(0xA0,0x01);   if(wert<0) { 	 // ошибка   }    // Байт 0x12  ведомого устройства I2C с адресом 0xC0   // Сохранить в регистре адрес 0х02   wert=UB_I2C1_WriteByte(0xC0,0x02,0x12);   if(wert<0) { 	 // ошибка   }    UB_I2C1_Delay(400); // небольшая пауза    while(1)   {    } }

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.