2023-03-06 09:51:44 +08:00

110 lines
1.8 KiB
C

/*
* IIC.c
*
* Created on: 2022年03月12日
* Author: User
*/
#include <Main.h>
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--);
}