STM32完成软件I2C通讯

这篇具有很好参考价值的文章主要介绍了STM32完成软件I2C通讯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天的重点是利用STM32的软件方案和MPU60506轴姿态传感器建立通讯,今天只完成了简单的发送地址和接收应答的部分,特此记录一下过程,以后忘记可以随时翻出来看看。

先介绍最基本的I2C通讯的最基本的6个时序:

一:起始条件:SCL高电平期间,SDA从高电平切换到低电平

时序图从左到右的顺序为1、2、3、4.

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

二:终止条件:SCL高电平期间,SDA从低电平切换到高电平

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

三:发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

四:接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

五:发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

六:接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

STM32完成软件I2C通讯,STM32,stm32,嵌入式硬件,单片机,F103C8T6

好了到此结束,整个I2C通讯的所有最基本的时序都理清了,和固定的芯片通讯都要建立在这6个基本时序的上层了。下面就是我写的六个时序的代码部分,可以结合着我画的图来理解,能很快的应用起来,刚开始的小伙伴估计不太会看这个时序图,我也是刚刚才有所感觉的,画的不好,理解的不够透彻,还望多多指正啊!

下面是MyIC.c文件

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "Delay.h"

void MyI2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIO_POART, MyI2C_SCL, (BitAction)BitValue);
	Delay_us(10);
}

void MyI2C_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GPIO_POART, MyI2C_SDA, (BitAction)BitValue);
	Delay_us(10);
}

uint8_t MyI2C_R_SDA(void)
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GPIO_POART, MyI2C_SDA);
	Delay_us(10);
	return BitValue;
}

void MyI2C_Init(void)
{
	RCC_APB2PeriphClockCmd(GPIO_CLOCK, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Pin = MyI2C_SCL | MyI2C_SDA;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_POART, &GPIO_InitStruct);
	
//	MyI2C_W_SCL(1);
//	MyI2C_W_SDA(1);
	GPIO_SetBits(GPIO_POART, MyI2C_SCL | MyI2C_SDA);
}

void MyI2C_Start(void)
{
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(0);
}

void MyI2C_Stop(void)
{
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(1);
}

void MyI2C_Send_Byte(uint8_t Byte)
{
	uint8_t i;
	for( i = 0; i < 8; i ++)
	{
		MyI2C_W_SDA(Byte & (0x80 >> i));
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
	}
}

uint8_t MyI2C_Receive_Byte(void)
{
	uint8_t i, Byte = 0x00;
	MyI2C_W_SDA(1);
	for( i = 0; i < 8; i ++)
	{
		MyI2C_W_SCL(1);
		if(MyI2C_R_SDA() == 1) { Byte |= (0x80 >> i);}
		MyI2C_W_SCL(0);
	}
	return Byte;
}

void MyI2C_Send_Ack(uint8_t BitAck)
{
	MyI2C_W_SDA(BitAck);
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);
}

uint8_t MyI2C_Receive_Ack(void)
{
	uint8_t BitAck;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	BitAck = MyI2C_R_SDA();
	MyI2C_W_SCL(0);
	return BitAck;
}

下面是MyIC.h文件

#ifndef __MYI2C_H
#define __MYI2C_H
// 需要更改端口的话只需要在这4个宏定义中更改就行了,其他的地方不用改
#define GPIO_CLOCK                                       RCC_APB2Periph_GPIOB
#define GPIO_POART                                       GPIOB
#define MyI2C_SCL                                        GPIO_Pin_10
#define MyI2C_SDA                                        GPIO_Pin_11


void MyI2C_Init(void);     //我的I2C初始化

void MyI2C_Start(void);  //我的I2C开始时序

void MyI2C_Stop(void);  //我的I2C结束时序

void MyI2C_Send_Byte(uint8_t Byte);   //我的I2C发送一个字节

uint8_t MyI2C_Receive_Byte(void);   //我的I2C接收一个字节

void MyI2C_Send_Ack(uint8_t BitAck);   // 我的I2C发送应答位

uint8_t MyI2C_Receive_Ack(void);          //我的I2C接收应答位


#endif




下面是main.c文件,测试基础的I2C代码的时序都有没有问题

回复显示0代表有这个地址,回复显示1代表没有这个地址文章来源地址https://www.toymoban.com/news/detail-849618.html

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "MyI2C.h"

int main(void)
{
	OLED_Init();       //oled  屏幕初始化
	MyI2C_Init();    //我的I2C初始化
	
	MyI2C_Start();   //我的I2C开始时序
	MyI2C_Send_Byte(0xD0);   //我的I2C发送地址           这里要是有个遍历就可以把所有的地址都发送一遍测试都有哪个地址
	uint8_t Ack = MyI2C_Receive_Ack();  //我的I2C接收应答位赋值给Ack
	MyI2C_Stop();        //我的I2C停止时序
	
	OLED_ShowNum(1, 1, Ack, 3);  //OLED显示应答结果
	
	while(1)
	{

	}
}

到了这里,关于STM32完成软件I2C通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32软件I2C驱动MPU6050

    这里没有什么复杂的地方,采用MPU6050的现成模块.模块的SCL接B10,SDA接B11,这里连接了一个OLED显示屏,用于显示获取到的数据. 注意:这里使用的模块自带上拉电阻 首先在工程目录里创建: \\\"MyI2C.h\\\"和\\\"MyI2C.c\\\"文件,用于软件驱动I2C. \\\"MPU6050.h\\\",\\\"MPU6050.c\\\"和\\\"MPU6050Reg.h\\\"文件,用于MPU6050的驱动. 在

    2024年02月15日
    浏览(55)
  • 【stm32】软件I2C读写MPU6050

    概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后,再建立MPU6050的.c和.h模块 基于I2C通信的模块,来实现指定地址读、指定地址写 再实现写寄存器对

    2024年04月26日
    浏览(54)
  • 【STM32】STM32学习笔记-软件I2C读写MPU6050(33)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月21日
    浏览(64)
  • STM32软件模拟I2C从机的实现方法

    在使用I2C通信时,一般会用到软件模拟I2C。目前网络上能搜索到的软件模拟I2C一般都是模拟I2C主机,很少有模拟I2C从机的例程。由于I2C主机在进行数据收发时,有明确的可预见性,也就是主机明确知道什么时候要进行数据的收发操作,而且I2C的同步时钟信号也是由主机产生的

    2024年02月01日
    浏览(65)
  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(56)
  • 【STM32】软件I2C的使用 —— 看这一篇就够了(附代码)

    欢迎来到我的博客。今天我想向大家介绍一下STM32软件I2C功能。 首先,让我们来了解一下I2C(Inter-Integrated Circuit)总线。I2C是一种串行通信总线,最初由Philips公司开发。它允许多个设备使用同一条总线进行通信,并且每个设备都有唯一的地址。I2C通常用于连接微控制器、传感

    2024年02月06日
    浏览(42)
  • 01_STM32软件+硬件I2C读取MPU6050(HAL库)

    目录 1、I2C简介 2、I2C时序单元 2.1 起始条件 2.2 终止条件 2.3 发送一个字节 2.4 接收一个字节 2.5 发送应答 2.6 接收应答 3、I2C完整时序 3.1 指定地址写一个字节 3.2 当前地址读一个字节 3.2 指定地址读一个字节 4、简单软件I2C代码(HAL) 4.1 软件I2C 4.2 软件I2C读MPU6050寄存器 5、ST

    2024年04月17日
    浏览(49)
  • 第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程

    本章将讲解stm32通讯协议中的IIC协议,利用cubeMX完成软件和硬件IIC的实现,并结合实验数据,给人更为深刻的体验。 我们结合IIC的具体协议和逻辑分析仪得到的具体实验数据理解IIC协议。 I2C通讯协议是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要

    2024年01月21日
    浏览(54)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(81)
  • STM32---I2C

    目录                                       一.I2C协议 1.什么是I2C协议?  2.物理层特性                                     二.协议层 1.I2C读写过程 2.I2C外设 3.I2C外设通讯过程              三.I2C库函数                       四.EEPROM 写操作: 读操作:      

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包