IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 软件模拟IIC -> 正文阅读

[嵌入式]STM32 软件模拟IIC

IIC时序的实现

I I C IIC IIC 是一种通信协议,是一种串行通信结构,由一根时钟线 S C L SCL SCL 以及一根数据线 S D A SDA SDA 组成,在 I 2 C I2C I2C 总线传输过程中,将两种特定的情况定义为开始和停止条件:当 S C L SCL SCL 保持“高”时, S D A SDA SDA 由“高”变为“低”为开始条件;当 S C L SCL SCL 保持“高”且 S D A SDA SDA 由“低”变为“高”时为停止条件。

开始和停止条件均由主控制器产生。使用硬件接口可以很容易地检测到开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对 S D A SDA SDA 取样,以检测这种变化。 S D A SDA SDA 线上的数据在时钟“高”期间必须是稳定的,只有当 S C L SCL SCL 线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到 S D A SDA SDA 线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答 A C K ACK ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线 S C L SCL SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟 S C L SCL SCL后,数据传输继续进行。 I 2 C I2C I2C数据总线传送时序。

数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉 S D A SDA SDA线。当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输。在传输的过程中,在用到主控接收器的情况下,主控接收器必须发出一数据结束信号给被控发送器,从而使被控发送器释放数据线,以允许主控器产生停止条件。

IIC时序通讯图

代码实现:

初始化模拟IIC的GPIO端口

void IIC_GPIO_Init() {
    //定义GPIO结构体
	GPIO_InitTypeDef GPIO_InitStruct;
    //打开GPIOB时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//设置时钟引脚和数据引脚
	GPIO_InitStruct.GPIO_Pin = SCL_PIN | SDA_PIN;
    //设置为推挽输出
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    //设置输出速率为50MHz
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //初始化
	GPIO_Init(GPIO_PORT,&GPIO_InitStruct);
}

配置IIC是读数据还是写数据

void IIC_SDA_Mode(u8 mode) {
	GPIO_InitTypeDef GPIO_InitStruct;
	if (mode) {//1、写数据
		GPIO_InitStruct.GPIO_Pin = SDA_PIN;
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIO_PORT,&GPIO_InitStruct);
	} else {//0、代表读数据
		GPIO_InitStruct.GPIO_Pin = SDA_PIN;
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_Init(GPIO_PORT,&GPIO_InitStruct);
	}
}

IIC起始信号:SCL在高电平期间,SDA由高电平向低电平的变化定义为起始信号

IIC起始信号

void IIC_start() {
    //设置为输出模式,输出
	IIC_SDA_Mode(OUT);
	//将时钟线SCK和数据线SDA拉高
	IIC_SDA_1;
	IIC_SCK_1;
	delay_us(5);	
	//SCK处于高电平的状态下SDA由高变低产生开始信号
	IIC_SDA_0;
	delay_us(5);
	//将SCK拉低准备传输数据
	IIC_SCK_0;      
}

停止信号:SCL在高电平期间,SDA由低电平向高电平的变化定义为停止信号

IIC停止信号

void IIC_stop() {
    //设置为输出模式,输出
	IIC_SDA_Mode(OUT);
	IIC_SDA_0;
	delay_us(5);
	IIC_SCK_1;
	delay_us(5);
	IIC_SDA_1;
}

应答信号:当SCL为高电平的时候,SDA为低电平则为应答信号,SDA为高电平则为非应答信号

IIC应答及非应答信号

u8 IIC_Wait_Ack(void) {
	u8 times = 0;
	IIC_SDA_Mode(INPUT);//设置为输入模式,主机要读取从机的应答信号
	IIC_SCK_1;
	delay_us(5);
    //等待应答,如果250次后没有应答则发送结束信号
	while (GPIO_ReadInputDataBit(GPIO_PORT,SDA_PIN)) {
		if (++times > 250) IIC_stop();
		return 1;
	}
	IIC_SCK_0;
	delay_us(5);
	return 0;
}

IIC写一字节数据:

void IIC_write(u8 date) {
	u8 i, temp;
	temp = date;	
	IIC_SCK_0;//将时钟线拉低,传输数据
	delay_us(5);
	for(i = 0; i < 8; i++) {	
		IIC_SDA_Mode(OUT);
        if (((temp << i) & 0x80) == 0 ) {//ox80 = 1000 0000
            IIC_SDA_0;//表示数据位是0
		} else {
			IIC_SDA_1;//表示数据位是1
		}
		IIC_SCK_1;//将SCK拉高
		delay_us(5);
		IIC_SCK_0;//将SCK拉低
		delay_us(5);
	}
}

IIC读一字节数据

u8 IIC_read(void) {
	u8 i, temp = 0;	
	for(i = 0; i < 8; i++) {	
		IIC_SDA_Mode(INPUT);
		IIC_SCK_1;//将时钟线拉高,只有SCL为高时数据有效
		delay_us(5);
        temp <<= 1;
		if(GPIO_ReadInputDataBit(GPIO_PORT,SDA_PIN) == 1) {
			temp |= 0x01;
		}
		IIC_SCK_0;//将SCK拉低
		delay_us(5);
	}
	return temp;
}

获取工程源码关注微信公众号:小张嵌入式
回复关键词:软件模拟IIC
微信公众号

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2022-01-03 16:16:35  更:2022-01-03 16:19:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:48:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码