83 lines
1.2 KiB
C
83 lines
1.2 KiB
C
/*
|
|
* IIC.c
|
|
*
|
|
* Created on: 2023年5月16日
|
|
* Author: User
|
|
*/
|
|
|
|
#include "IIC.h"
|
|
|
|
static void Start(void);
|
|
|
|
static void Write(u8 Data);
|
|
|
|
static void ACK(void);
|
|
|
|
static void Stop(void);
|
|
|
|
static void Delay1us();
|
|
|
|
#define DELAY Delay1us()
|
|
|
|
IIC_t IIC = {Start, Write, ACK, Stop};
|
|
|
|
static void Start(void) {
|
|
SCL = HIGH;
|
|
SDA = HIGH;
|
|
DELAY; //@20.000MHz // 1微秒延时
|
|
SDA = LOW; // 时钟线高电平 拉低数据线以为传输开始
|
|
}
|
|
|
|
static void Write(u8 Data) {
|
|
u8 i;
|
|
|
|
SCL = LOW; // 拉低时钟线 数据可以变化
|
|
DELAY; // 1微秒延时
|
|
for (i = 0; i < 8; i++) {
|
|
if (Data & 0x80)
|
|
SDA = HIGH;
|
|
else
|
|
SDA = LOW;
|
|
|
|
DELAY; // 1微秒延时
|
|
SCL = LOW;
|
|
DELAY; // 1微秒延时
|
|
SCL = HIGH;
|
|
DELAY; // 1微秒延时
|
|
SCL = LOW;
|
|
Data <<= 1;
|
|
}
|
|
}
|
|
|
|
static void ACK(void) {
|
|
// static uint8_t timeout = 0;
|
|
SCL = HIGH;
|
|
DELAY;
|
|
SCL = LOW;
|
|
// while ((SDA_1) || (timeout <= 10))
|
|
// {
|
|
|
|
// timeout++;
|
|
// }
|
|
DELAY;
|
|
DELAY;
|
|
SCL = LOW;
|
|
}
|
|
|
|
static void Stop(void) {
|
|
SCL = HIGH;
|
|
SDA = LOW;
|
|
DELAY;
|
|
SDA = HIGH; // 时钟线高电平时 拉高数据线为停止信号
|
|
}
|
|
|
|
static void Delay1us() { //@20.000MHz
|
|
unsigned char i;
|
|
|
|
_nop_();
|
|
_nop_();
|
|
i = 2;
|
|
while (--i)
|
|
;
|
|
}
|