/**
* @file HW_I2C_ATY.h
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2025 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 *********************************/