关于stm32f4xx的片上外设I2C模块用作主模式下BUSY位总是置1的解决方法

1. 假设

本文假设读者:

  1. 有使用stm32的经验
  2. 有使用stm32库函数编程的经验
  3. 了解IIC通讯协议

本文适合初学者参考

2. stm32f4xx系列的芯片的IIC接口
1. 模式选择

stm32f4xx的IIC模块有四种工作模式,默认的工作模式是从模式,在发送起始位会自动由从模式切换为主模式.
2
相关概念如下:

  1. 发送器:发送数据到总线的器件
  2. 接收器:从总线接收数据的器件
  3. 主机:发起/停止数据传输、提供时钟信号的器件
  4. 从机:被主机寻址的器件
  5. 多主机:可以有多个主机试图去控制总线,但是不会破坏数据
  6. 仲裁:当多个主机试图去控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不会被破坏
  7. 同步:多个器件同步时钟信号的过程
2. 通讯过程

1

尽管已经假设读者了解iic总线协议,但还是对iic通讯的一些概念做简单介绍.

  1. 开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,表示起始信号,开始传送数据
  2. 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,表示结束信号,结束传送数据
  3. 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平。即接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
  4. I2C总线进行数据传送时,
    4.1 SCL高电平期间,数据稳定(不允许变化),此时用于接收器读数据;
    4.2 SCL低电平期间,数据允许变化,此时用于发送器发(写)数据;

  5. stm32f4xx的IIC模块的通讯时序如下:
    5.1 模块默认工作在从模式, 发送起始位后自动由从模式切换为主模式. 在主模式下,I2C 接口会启动数据传输并生成时钟信号。串行数据传输始终是在出现起始位时开始,在出现停止位时结束。起始位和停止位均在主模式下由软件生成。
    5.2 IIC模块的应答位可以由软件使能或者禁止. 可以软件选择IIC模块的寻址方式( 7 位/10 位双寻址模式和/或广播呼叫地址)
    3
    5.3 IIC模块作为主发送器发送数据的过程如下(更加详细的说明请参考《stm32f4xx中文参考手册》654页,这里不再赘述)
    4
    5.4 IIC模块作为主接收器接收数据的过程如下(更加详细的说明请参考《stm32f4xx中文参考手册》655页,这里不再赘述)
    5

3.“BUSY位总是置1”的问题
1. 问题描述

在STM32F4xx的IIC模块的状态寄存器SR2有一个BUSY位用于指示IIC总线的占用状态。
6
然而在实际的应用中,使能了IIC模块的时钟之后,BUSY位就自动置位了,但是我们知道,事实上总线上并无数据在传输. 在主机发送停止位之后,也无法将BUSY位复位.

2. 问题解决

注意当IIC模块处于复位的状态的时候,BUSY位也是复位的. 有两种方法可以将IIC模块复位,一种是直接使用RCC模块的寄存器将IIC模块复位,另一种是方法是将IIC模块控制寄存器CR1中的SWRST置位,使IIC模块处于复位状态. 本文介绍的是第二种方法, 第一种方法也是类似第二种方法,只不过写的寄存器不一样而已.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值