84 lines
1.4 KiB
C
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)
|
|
;
|
|
}
|