/* * IIC.c * * Created on: 2022年03月12日 * Author: User */ #include static void Start1(void); static void Write1(uint8_t Data); static void ACK1(void); static void Stop1(void); static void Delay2us(uint8_t); //@16.000MHz 2us IIC_t IIC_1 = { Start1, Write1, ACK1, Stop1}; /* * @name Start1 * @brief IIC1启动命令 * @param None * @retval None */ static void Start1(void) { SCL_1 = HIGH; SDA_1 = HIGH; Delay2us(1); //@16.000MHz // 2微秒延时 SDA_1 = LOW; //时钟线高电平 拉低数据线以为传输开始 } /* * @name Write1 * @brief IIC1写命令 * @param Data * @retval None */ static void Write1(uint8_t Data) { uint8_t i = 0; SCL_1 = LOW; //拉低时钟线 数据可以变化 Delay2us(1); // 1微秒延时 for (i = 0; i < 8; i++) { if (Data & 0x80) SDA_1 = HIGH; else SDA_1 = LOW; Delay2us(1); // 1微秒延时 SCL_1 = LOW; Delay2us(1); // 1微秒延时 SCL_1 = HIGH; Delay2us(1); // 1微秒延时 SCL_1 = LOW; Data <<= 1; } } /* * @name ACK1 * @brief IIC1应答命令 * @param None * @retval None */ static void ACK1(void) { static uint8_t timeout = 1; SCL_1 = 1; Delay2us(1); SCL_1 = 0; Delay2us(1); while ((SDA_1) && (timeout <= 200)) { timeout++; } SCL_1 = 0; } /* * @name Stop1 * @brief IIC1停止命令 * @param None * @retval None */ static void Stop1(void) { SCL_1 = 1; SDA_1 = 0; Delay2us(1); SDA_1 = 1; //时钟线高电平时 拉高数据线为停止信号 } /* * @name Delay2us * @brief 延时2uS * @param None * @retval None */ static void Delay2us(uint8_t fui_i) //@16.000MHz 2us { // uint8_t fui_i =1; while(fui_i--); }