关注分享主机优惠活动
国内外VPS云服务器

[STM 3zhujipindaoCube MX] 0011 Hal库开发:I2C公交接入加速度传感器ADXL345

在本节中,我们将介绍总线,并使用总线来访问加速度传感器。在主循环中,可以看到数据输出改变了传感器的方向,可以看到测得的重力加速度的数值变化。

本节介绍I2C总线,并使用stm32的I2C总线访问加速度传感器ADXL345。

1)I2C基础知识I2C总线通信比较适合设备内部芯片之间的通信,它只需要两条信号线。

I2C可以安装多个主设备和从设备,并且通信总是由主设备发起。每个从机都有一个唯一的地址,主机通过地址决定访问哪个从机。

I2C总线两条线,SCL是时钟线,SDA是数据线;所有器件只能下拉这两条线的输出操作。当总线被释放时,电平被总线上的上拉电阻上拉。所以硬件连接需要上拉电阻,否则无法实现通信。

I2C空闲时,所有器件释放总线,SCL和SDA被上拉电阻拉高电平;

I2C的启动条件:SCL高时,SDA从高切换到低;表示数据传输的开始;一般由需要通信的主机发起。初始条件的图表如下:

I2C的停止条件:当SCL为高时,SDA会从低电平跳到高电平;表示数据传输结束;一般也是主机最后结束通信。停止条件的图表如下:

传输数据时,当SCL时钟线为高电平时,不允许修改SDA数据线上的电平;当SCL时钟线为低电平时,SDA数据线上的电平可以变为高/低电平,如下图所示:

I2C的ACK和NACK都是响应,ACK拉低SDA线,NACK释放SDA总线(拉高);ACK和NACK都是响应,可以是主机响应从机,也可以是从机响应主机。具体来说(以ADXL345芯片为例):

主机发起通信后,如果要向从机写入数据,需要等待从机对发送的每个字节都响应ACK,如下图所示。具体到实际操作中,即主机每发送一个字节的数据,就会释放总线,等待从机响应ACK(即等待从机将SDA线拉低)。最终通信完成后,主机发送停止条件:

主机发起通信后,如果要从从机读取数据,需要等待从机响应ACK发地址的时候。从机向主机回复数据时,主机要回应ACK,主机读完最后一个字节,会回应ACK。写入数据的过程如下:

上面的例子以加速度传感器的ADXL345芯片为例。其他芯片在使用I2C通信时可能略有不同,但它们基本上是这些状态的组合。

2)Stm32的i2c总线使用带硬件I2C的STM 32。让我们使用STM 32的硬件I2C来读取加速度传感器ADXL345的值。

我们还是基于串口项目在上面添加设置,如下图所示,选择I2C接口,其他都默认:

选择后,可以发现引脚PB6和PB7被占用为I2C引脚,其中PB6为SCL,PB7为SDA。

硬件连接方面,我们还需要将ADXL345芯片的SCL和SDA连接到PB6和PB7,SDA和SCL都要用电阻上拉至电源:

生成工程代码并在keil中打开。Stm32的Hal库已经将i2c初始化和i2c读写操作封装到函数中,我们可以直接调用。

这里需要先修改一个bug,如下所示:

_ _ HAL _ RCC _ I2C 1 _ CLK _ ENABLE();这个使能i2c时钟的语句,cubemx生成的代码是在GPIO初始化之后,所以不能成功设置,需要在GPIO初始化之前提前:

在Main函数中添加初始化ADXL345的代码:

简单来说,前四个值用来设置芯片的工作模式,后三个值是X、Y、Z方向的校准参数。因为ADXL345传感器有初始误差(网上有一种说法是X、Y方向误差不大,Z轴误差可能达到几个G;我的芯片X、Y、Z轴基本正常,Z轴有0.6g左右的误差)。可以写一组被测参数,让它在输出时自动减去这个值,从而达到去除初始误差的目的。这里Z轴我写了f0,校准后基本正常。

在主循环中添加循环读取ADXL345的代码:

编译、下载并运行,您可以看到数据输出:

通过改变传感器的方向,可以看到测得的重力加速度的数值变化。

stm32的硬件i2c问题备忘录在使用stm32的硬件i2c时,我发现很多信息说STM 32的硬件i2c有问题。我用得不多,但我总结了一些在线讨论作为备忘录,以防有一天我不得不使用硬件I2C。

a)cube MX生成的代码,初始化i2c的时钟要提到GPIO初始化之前;

B) I2c速度不能太高。据说50k以下基本没有问题,100k以上长时间运行就会出现问题;

c)部分带FSMC模块的stm32型号与I2C1模块共用PB7引脚,会使I2C1无法正常启动;即使你不使用FSMC,只要打开FSMC的时钟就会影响它。解决方法是切换到I2C或者将I2C的时钟线和数据线重新定义到PB8和9引脚。或者关掉FSMC的时钟;

d)硬件i2c不能被中断中断,否则会有问题;如果使用中断,建议将i2c中断设置为最高优先级。

针对一些确实很难验证的问题,我以后尽量用软件i2c,效率低一点但是更可靠,移植到其他芯片上也方便很多。

好了,这一节就讲到这里。

欢迎关注我的微信官方账号,可以留言“信息”获取相关信息和软件:

未经允许不得转载:主机频道 » [STM 3zhujipindaoCube MX] 0011 Hal库开发:I2C公交接入加速度传感器ADXL345

评论 抢沙发

评论前必须登录!