Files
VK035_Template/MDK-ARM/Core/App/i2c.h

184 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
******************************************************************************
* @file i2c.h
* @author Разваляев Алексей
* @brief Драйвер I2C на основе PLIB035.
* Данный файл содержит определения типов, структур и прототипы функций
* для работы с I2C, включая:
* + Структуры и typedef для I2C
* + Прототипы функций для инициализации и API драйвера
*
******************************************************************************
*/
#ifndef __I2C_H
#define __I2C_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "plib035_i2c.h"
#include "retarget_conf.h"
//-- Defines -------------------------------------------------------------------
// Дефайны для пинов I2C
#define I2C_SCL_Pin GPIO_Pin_0 /**< PA0 — I2C SCL */
#define I2C_SDA_Pin GPIO_Pin_1 /**< PA1 — I2C SDA */
#define I2C_GPIO_Port GPIOA /**< GPIO порт I2C */
// Стандартные частоты I2C
#define I2C_STANDARD_MODE 100000 /**< 100 kHz */
#define I2C_FAST_MODE 400000 /**< 400 kHz */
#define I2C_FAST_MODE_PLUS 1000000 /**< 1 MHz */
#define I2C_HIGH_SPEED_MODE 3400000 /**< 3.4 MHz */
// Максимальное время ожидания по умолчанию (мс)
#define I2C_DEFAULT_TIMEOUT 1000
// Коды ошибок I2C
#define I2C_ERROR_NONE 0x00
#define I2C_ERROR_BUS_BUSY 0x01
#define I2C_ERROR_TIMEOUT 0x02
#define I2C_ERROR_NACK 0x03
#define I2C_ERROR_ARBITRATION_LOST 0x04
#define I2C_ERROR_BUS_ERROR 0x05
#define I2C_ERROR_PEC_FAIL 0x06
//-- Types ---------------------------------------------------------------------
/**
* @brief Типы callback-функций I2C
*/
typedef enum
{
I2C_Callback_Tx, /*!< Передача данных завершена */
I2C_Callback_Rx, /*!< Приём данных завершён */
I2C_Callback_Addr, /*!< Ведомый получил свой адрес */
I2C_Callback_Error, /*!< Ошибка I2C */
} I2C_CallbackTypeDef;
/**
* @brief Режимы работы I2C
*/
typedef enum
{
I2C_Mode_Master, /*!< Режим мастера */
I2C_Mode_Slave, /*!< Режим ведомого */
} I2C_ModeTypeDef;
/**
* @brief Направление передачи I2C
*/
typedef enum
{
I2C_Direction_Transmitter, /*!< Направление: передатчик */
I2C_Direction_Receiver, /*!< Направление: приемник */
} I2C_DirectionTypeDef;
/**
* @brief Размер регистра устройства
*/
typedef enum
{
I2C_RegSize_8bit, /*!< Размер регистра: 8 бит */
I2C_RegSize_16bit, /*!< Размер регистра: 16 бит */
} I2C_RegSizeTypeDef;
/**
* @brief Структура инициализации I2C
*/
typedef struct
{
I2C_ModeTypeDef Mode; /*!< Режим работы: I2C_Mode_Master или I2C_Mode_Slave */
FunctionalState HSMode; /*!< Высокоскоростной режим */
FunctionalState Addr10Bit; /*!< 10-битная адресация */
I2C_RegSizeTypeDef RegSize; /*!< Размер регистра: I2C_RegSize_8bit или I2C_RegSize_16bit */
uint16_t SlaveAddr; /*!< Адрес ведомого (для режима Slave) */
FunctionalState Timeout; /*!< Таймаут: */
I2C_TimeoutClkDiv_TypeDef TimeoutClkDiv; /*!< Делитель тактирования таймаута */
uint8_t TimeoutLoad; /*!< Значение загрузки счетчика таймаута */
FunctionalState AlertResponse; /*!< Ответ на тревогу */
FunctionalState GlobalCall; /*!< Общий вызов */
} I2C_Init_TypeDef;
/**
* @brief Расширенная конфигурация I2C
*/
typedef struct
{
I2C_Init_TypeDef I2C_Init; /*!< Базовая конфигурация I2C */
uint32_t I2CFreq; /*!< Частота тактирования I2C в Гц */
uint32_t FSFreq; /*!< Частота SCL в стандартном режиме в Гц */
uint32_t HSFreq; /*!< Частота SCL в высокоскоростном режиме в Гц */
/* Callback функции */
void (*TxCallback)(void); /*!< Вызывается при завершении передачи */
void (*RxCallback)(void); /*!< Вызывается при завершении приема */
void (*AddrCallback)(void); /*!< Вызывается когда ведомый получает свой адрес */
void (*ErrCallback)(uint8_t error); /*!< Вызывается при ошибке I2C с кодом ошибки */
} I2C_ExtInit_TypeDef;
/**
* @brief Хендл I2C
*/
typedef struct
{
I2C_TypeDef *Instance; /*!< Регистры I2C */
I2C_ExtInit_TypeDef *Config; /*!< Конфигурация I2C */
uint8_t LastError; /*!< Код последней ошибки */
} I2C_HandleTypeDef;
//-- External handles ----------------------------------------------------------
extern I2C_HandleTypeDef hi2c;
//-- Exported functions prototypes ---------------------------------------------
/* Init functions */
/* Первичная инициализация I2C */
void i2c_init_first(void);
/* Инициализация I2C */
OperationStatus i2c_init(I2C_HandleTypeDef *hi2c, I2C_ExtInit_TypeDef *NewConfig);
/* Инициализация GPIO для I2C */
void i2c_gpio_init(void);
/* Деинициализация GPIO для I2C */
void i2c_gpio_deinit(void);
/* API functions*/
/* Установка callback-функции I2C */
OperationStatus I2C_Set_Callback(I2C_HandleTypeDef *hi2c, I2C_CallbackTypeDef CallbackType, void (*Callback)());
/* Запуск I2C */
OperationStatus I2C_Start(I2C_HandleTypeDef *hi2c);
/* Остановка I2C */
OperationStatus I2C_Stop(I2C_HandleTypeDef *hi2c);
/* Получение кода последней ошибки */
uint8_t I2C_GetLastError(I2C_HandleTypeDef *hi2c);
/* Передача данных в режиме мастера (блокирующий режим) */
OperationStatus I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t addr, uint8_t *buf, uint16_t size, uint32_t timeout);
/* Прием данных в режиме мастера (блокирующий режим) */
OperationStatus I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t addr, uint8_t *buf, uint16_t size, uint32_t timeout);
/* Запись регистра устройства (блокирующий режим) */
OperationStatus I2C_Master_WriteReg(I2C_HandleTypeDef *hi2c, uint16_t addr, uint16_t reg, uint8_t value, uint32_t timeout);
/* Чтение регистра устройства (блокирующий режим) */
OperationStatus I2C_Master_ReadReg(I2C_HandleTypeDef *hi2c, uint16_t addr, uint16_t reg, uint8_t *buf, uint16_t size, uint32_t timeout);
/* Запись нескольких регистров (блокирующий режим) */
OperationStatus I2C_Master_WriteRegs(I2C_HandleTypeDef *hi2c, uint16_t addr, uint16_t reg, uint8_t *buf, uint16_t size, uint32_t timeout);
/* Чтение нескольких регистров (блокирующий режим) */
OperationStatus I2C_Master_ReadRegs(I2C_HandleTypeDef *hi2c, uint16_t addr, uint16_t reg, uint8_t *buf, uint16_t size, uint32_t timeout);
/* Проверка наличия устройства на шине */
OperationStatus I2C_Master_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t addr, uint32_t timeout);
#endif /*__I2C_H*/