i2c为什么 io口切换_stm32模拟IIC(I2C)踩过的坑与总结,小白入

由于最近研究I2C,本来硬件I2C用的好好的,上网一看,好多人说STM32F1的硬件I2C不稳定,吓了我一跳,遂决定研究一下软件模拟I2C,免得以后突然出问题,到时候就尴尬了。还有一点,就是模拟的I2C以后移植方便啊,虽然速度不及硬件I2C,但是胜在稳定。好了,废话不多说,接下来开始我的总结吧,我会尽可能讲的细一点,方便小白也能看懂,别问为什么,因为我也一定意义上来说是一个小白吧,我只不过是想记录一下自己的学习遇到了哪些问题,如何解决的,从小白的视角来看,我应该是比较懂小白的吧。

为了让文章更加清楚一点,我还是把程序结合代码一起分析一下吧,有一点先说好了,我写这篇文章只是为了扫盲,让自己有更加深刻的理解,同时也能帮到一些同学理解,但是代码最好还是自己动手写一下,我会用尽量能让人理解的方式进行说明,如果有错误的地方,还请指正,不胜感激。

第一步:定义端口和初始化相关

  1. 第一步需要做到的是先新建.h文件和.c文件,我命名为I2C_A.hI2C_A.c ,接下来是定义模拟I2C需要的函数,相关注释在代码后面,方便你理解相关的应用。
#ifndef __I2C_A_H
#define __I2C_A_H
#include "stm32f10x.h"

#define I2CPORT GPIOB
#define I2C_SCL GPIO_Pin_6 //时钟通信端口
#define I2C_SDA GPIO_Pin_7 //数据通信端口


void I2C_Configuration(); //端口配置初始化
void I2C_START();//通讯信号开始函数
void I2C_STOP();//通讯信号结束函数
void I2C_Ack();//主机应答函数
void I2C_NAck();//主机非应答函数
u8   I2C_Wait_Ack();//主机等待应答函数
void I2C_SEND(u8 byte);//主机发送单个字节函数
u8	 I2C_READ();//主机读取单个字节函数
void I2C_SEND_BYTE(u8 slaveaddr,u8 registeraddr,u8 byte);//发送到具体从机地址及相关寄存器一个字节
void I2C_SEND_BYTES(u8 slaveaddr,u8 registeraddr,u8 *pbuffer,u16 num );//发送一串数据给具体从机的相关寄存器
void I2C_READ_BYTES(u8 slaveaddr,u8 registeraddr,u8 *pbuffer,u16 num );//读取具体从机的相关寄存器一串字节


#endif

2.端口和初始化

#define SCL_HIGH()   {PBout(6)=1;}//时钟线置高
#define SCL_LOW()   {PBout(6)=0;} //时钟线置低


#define SDA_HIGH()   {PBout(7)=1;}//数据线置高
#define SDA_LOW()   {PBout(7)=0;}//数据线置低
#define SDA_READ     PBin(7)    //读数据时的pin脚定义,输入PB7口

#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}//清零和设置输入模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}//清零和设置输出模式

这一段呢,你不想彻底搞懂也没关系,特别是最后两行,有的小伙伴跟我一样有相关疑问,我在这里说明一下,这个是对单片机引脚的设置跟初始化,你把他理解为引脚方向的改变就行了,里面涉及寄存器操作,需要查询寄存器手册,其实这是为后面的读与写做准备的。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值