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);                                // функція затримки

Приклад використання:

//--------------------------------------------------------------
// Файл     : main.c
// Дата     : 07.03.2013
// Версія   : 1.0
// Автор    : UB
// EMail    : mc-4u(@)t-online.de
// Веб      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Модуль   : CMSIS_BOOT, M4_CMSIS_CORE
// Функція  : Демонстрація I2C-LoLevel-бібліотеки
// Примітка  : Ці два файли повинні бути на 8MHz
//              "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
  // Зберегти в реєстрі адресу 0x02
  wert=UB_I2C1_WriteByte(0xC0,0x02,0x12);
  if(wert<0) {
	 // помилка
  }

  UB_I2C1_Delay(400); // невелика затримка

  while(1)
  {

  }
}

У додатку проект CooCox і окрема бібліотека для використання в інших проектах. Автор оригіналу статті просить ставити запитання на його сайті німецькою або англійською мовами.

Оригінал статті

Прикріплені файли:

Top