/** * @file HW_I2C_ATY.h * * @param Project DEVICE_GENERAL_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2023 MZ-ATY * - This code follows: * - MZ-ATY Various Contents Joint Statement - * * https://mengze.top/MZ-ATY_VCJS * - CC 4.0 BY-NC-SA - * * https://creativecommons.org/licenses/by-nc-sa/4.0/ * - Your use will be deemed to have accepted the terms of this statement. * * @brief Familiar functions of I2C for all embedded device * * @version * - 1_01_220608 > ATY * -# Preliminary version, first Release * - 1_02_240108 > ATY * -# add multy addr and channel * - 1_01_240111 > ATY * -# add lock ******************************************************************************** */ #ifndef __HW_I2C_ATY_H #define __HW_I2C_ATY_H #include "INCLUDE_ATY.h" /******************************* For user *************************************/ /** * @brief Eliminate HAL_I2C bug * @warning Put "__HAL_RCC_I2C1_CLK_ENABLE();" before GPIO init */ //void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) //{ // GPIO_InitTypeDef GPIO_InitStruct = {0}; // if(hi2c->Instance==I2C1) // { // /* USER CODE BEGIN I2C1_MspInit 0 */ // __HAL_RCC_I2C1_CLK_ENABLE(); // /* USER CODE END I2C1_MspInit 0 */ // // __HAL_RCC_GPIOB_CLK_ENABLE(); // /**I2C1 GPIO Configuration // PB6 ------> I2C1_SCL // PB7 ------> I2C1_SDA // */ // GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; // GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // // /* Peripheral clock enable */ // //__HAL_RCC_I2C1_CLK_ENABLE(); // /* USER CODE BEGIN I2C1_MspInit 1 */ // // /* USER CODE END I2C1_MspInit 1 */ // } // //} #define I2C_WAIT_ACK_TIME 250 // us #define SHORT_DELAY 1 #define LONG_DELAY 1 /******************************************************************************/ struct HW_I2C_ATY_Dev { uint8_t hardwareEnable; void (*sclSet)(uint8_t level); void (*sdaSet)(uint8_t cmd, uint8_t param); uint8_t(*sdaGet)(); uint8_t(*i2cProcess)(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw); void (*delay)(uint32_t t); uint8_t lock; uint8_t debugEnable; void (*LOG)(const char*, ...); }; uint8_t I2C_Start(struct HW_I2C_ATY_Dev* dev); uint8_t I2C_Stop(struct HW_I2C_ATY_Dev* dev); uint8_t I2C_Ack(struct HW_I2C_ATY_Dev* dev); uint8_t I2C_NoAck(struct HW_I2C_ATY_Dev* dev); uint8_t I2C_WaitAck(uint16_t maxErrTime, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_WriteByte(uint8_t byte, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_ReadByte(uint8_t ack, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_Write(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_Write_NoStop(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_Read(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_WriteReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev); uint8_t I2C_ReadReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev); #endif /* __HW_I2C_ATY_H */ /******************************** End Of File *********************************/