1 #ifndef _IIC_H
2 #define _IIC_H
3
4 #include 'stdio.h'
5 #include 'stm32f1xx_hal.h'
6
7
8 /* 定义控制 SDA SCL 的宏 标准库版
9 #define I2C_SDA_UP GPIO_SetBits (GPIOC,GPIO_PIN_8) //SDA高电平
10 #define I2C_SDA_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_8) //SDA低电平
11 #define I2C_SCL_UP GPIO_SetBits (GPIOC,GPIO_PIN_9) //SCL高电平
12 #define I2C_SCL_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_9) //SCL低电平
13 */
14
15
16 /* 定义控制 SDA SCL 的宏 HAL库版 */
17
18 #define I2C_SDA_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET) //SDA高电平
19 #define I2C_SDA_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET) //SDA低电平
20 #define I2C_SCL_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET) //SCL高电平
21 #define I2C_SCL_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET) //SCL低电平
22
23
24
25 /* 获取 SDA SCL 引脚状态,标准库版也是用相同逻辑 */
26
27 #define I2C_SDA HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_8) //获取SDA引脚状态
28 #define I2C_SCL HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_9) //获取SCL引脚状态
29
30
31 void iic_stare(void); //* 开始信号
32 void i2c_ack(void); //* 应答信号
33 void I2C_No_ack(void); //* 非应答信号
34 void i2c_stop(void); //* 停止信号
35 char i2c_wit_ack(void); //* 等待应答
36 void i2c_send(uint8_t dat); //* 发送数据
37 uint8_t i2c_read(void); //* 接收数据
38
39 void SDA_OUT(void); //* SDA 设置为输出
40 void SDA_IN(void); //* SDA 设置为输入
41
42 void delay_us(uint32_t i); //*延时
43
44 #endif
/*****************************************************************************
* *
* File: 软件模拟IIC, HAL库版本,标准库也 *
* 可用,只需要做一些相对应修改即可 *
* *
*****************************************************************************/
#include 'iic.h'
/*******************************************************************************
* 函 数 名 : i2c_stare
* 函数功能 : iic开始信号,SCL高电平时,SDA出现一个下跳沿表示启动信号
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void i2c_stare(void)
{
SDA_OUT();
I2C_SDA_UP;
I2C_SCL_UP;
delay_us(4);
I2C_SDA_LOW; //启动开始信号
delay_us(4);
I2C_SCL_LOW; //钳住I2C总线,准备发送或接收数据
}
/*******************************************************************************
* 函 数 名 : i2c_stop
* 函数功能 : iic停止信号,SCL高电平时,SDA出现一个上跳沿表示停止信号
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void i2c_stop(void)
{
SDA_OUT(); //sda线输出
I2C_SDA_LOW; //发送结束条件的数据信号
I2C_SCL_UP;
delay_us(4); //结束条件建立时间大于4μ
I2C_SDA_UP; //发送I2C总线结束信号
delay_us(4);
I2C_SCL_LOW;
}
/*******************************************************************************
* 函 数 名 : i2c_send
* 函数功能 : iic发送数据
* 输 入 : uint8_t dat,要发送的数据
* 输 出 : 无
*******************************************************************************/
void i2c_send(uint8_t dat)
{
unsigned char temp;
SDA_OUT();
for(temp=0x80;temp!=0;temp>>=1)
{
if((temp & dat)== 0)
{
I2C_SDA_LOW;
}
else
{
I2C_SDA_UP;
}
delay_us(1);
I2C_SCL_UP;
delay_us(4);
I2C_SCL_LOW;
}
}
/*******************************************************************************
* 函 数 名 : i2c_read
* 函数功能 : iic接收数据
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
uint8_t i2c_read(void)
{
unsigned char temp;
unsigned char dat;
I2C_SDA_UP; //释放总线准备接收
SDA_IN();
for(temp=0x80;temp!=0;temp>>=1)
{
delay_us(1);
I2C_SCL_UP;
if(I2C_SDA==1)
{
dat|=temp;
}
else
{
dat&=~temp;
}
I2C_SCL_LOW;
}
return dat;
}
/*******************************************************************************
* 函 数 名 : i2c_wit_ack
* 函数功能 : iic等待应答
* 输 入 : 无
* 输 出 : 0/1,返回1表示无应答信号,返回0表示应答
*******************************************************************************/
char i2c_wit_ack(void)
{
uint8_t con=0;
I2C_SDA_UP; //释放数据线,准备接收应答
delay_us(1);
I2C_SCL_UP; //CPU驱动SCL = 1, 此时器件会返回ACK应答
SDA_IN();
delay_us(1);
while( I2C_SDA ) //CPU读取SDA口线状态
{
con++;
if(con>255)
{
i2c_stop();
return 1; //无应答信号
}
}
I2C_SCL_LOW;
delay_us(1);
return 0; //有应答
}
/*******************************************************************************
* 函 数 名 : i2c_ack
* 函数功能 : iic应答信号
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
上一篇:STM32 GPIO重映射
下一篇:STM32 抢占优先级和响应优先级
- 热门资源推荐
- 热门放大器推荐
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用



非常经典的关于LLC的杨波博士论文
CLC5612IMX

1-292148-8






京公网安备 11010802033920号