2022-07-23 18:08:23 +08:00

84 lines
1.4 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 Delay1us(); //@20.000MHz
IIC_t IIC_1 = {
Start1,
Write1,
ACK1,
Stop1};
static void Start1(void)
{
SCL_1 = HIGH;
SDA_1 = HIGH;
Delay1us(); //@20.000MHz // 1微秒延时
SDA_1 = LOW; //时钟线高电平 拉低数据线以为传输开始
}
static void Write1(uint8_t Data)
{
uint8_t i = 0;
SCL_1 = LOW; //拉低时钟线 数据可以变化
Delay1us(); // 1微秒延时
for (i = 0; i < 8; i++)
{
if (Data & 0x80)
SDA_1 = HIGH;
else
SDA_1 = LOW;
Delay1us(); // 1微秒延时
SCL_1 = LOW;
Delay1us(); // 1微秒延时
SCL_1 = HIGH;
Delay1us(); // 1微秒延时
SCL_1 = LOW;
Data <<= 1;
}
}
static void ACK1(void)
{
// static uint8_t timeout = 0;
SCL_1 = 1;
Delay1us();
SCL_1 = 0;
// while ((SDA_1) || (timeout <= 10))
// {
// timeout++;
// }
Delay1us();
Delay1us();
SCL_1 = 0;
}
static void Stop1(void)
{
SCL_1 = 1;
SDA_1 = 0;
Delay1us();
SDA_1 = 1; //时钟线高电平时 拉高数据线为停止信号
}
static void Delay1us() //@20.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 5;
while (--i)
;
}