串口通信之————IIC(软件驱动)

本文介绍了STM32嵌入式系统中I2C通信的基本原理,包括半双工、同步特性和接口配置。详细解析了驱动编写过程,涉及IIC初始化、发送/接收操作函数,如启动/停止信号、数据帧传输及ACK/NACK处理。适合初学者理解并实践IIC通信技术。

B站账号:小光学嵌入式


  • ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大二学生。
  • ⏩最近开始系统性补习STM32基础知识,规划有:串口通信,Github,Ucos等等。
  • ⏩今天总结一下串口通信之stm32-IIC。

一.原理讲解

请跳转->串口通信————UART、I2C、SPI详解(总结篇
从上面的文章中,我们知道IIC的通信方式是:半双工、同步、串口通信。
接线有两根:
SDA–数据线
SCL–时钟线

二.驱动编写

在编写驱动之前大家可以先了解一下IIC传输数据的步骤:
传输步骤
1.在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。
2.主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位
3.每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。
4.主机发送或接收数据帧;
5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧;
6.随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。

1.接口定义与初始化

//IO方向设置
 
#define SDA_IN()  {
     
     GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {
     
     GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

//IO操作函数	 
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA	 
#define READ_SDA   PBin(7)  //输入SDA 

首先让我们在和STM32F1中文参考手册找到下面的资料:
请添加图片描述
请添加图片描述
这两张图可以帮助我们解释:#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}为什么要这样配置,因为我们的SDA是需要双向的,需要输入和输出随时切换所以这样配置更加方便的调整输入和输出模式:
请添加图片描述

GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL&=0X0FFFFFFF;

我们要配置的是PB7所以用的是GPIOB->CRL,然后再将我们需要配置的位也就是3:2位和1:0位 置为0;然后方便我们下一步配置:

GPIOB->CRL|=(u32)8<<28;//0b1000 3:2位置为1:0:输出模式最大10MHZ,1:0位置为0:0:通用推挽输出模式
GPIOB->CRL|=(u32)3<<28;//0b0011 3:2位置为0:0:输入模式         , 1:0位置为1:1;保留
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小光学嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值