184 lines
7.9 KiB
C
184 lines
7.9 KiB
C
/**
|
||
******************************************************************************
|
||
* @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*/
|