你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32之学习I2C

[复制链接]
pwdzsj 发布时间:2015-10-17 17:54
stm32 i2c通信 [操作寄存器+库函数]
作者:Changing发表时间:07-12 22:01分类:电子相关No Comments

I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下:
  • 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;
  • 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
  • 它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
  • 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
  • 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
其典型的接口连线如下:





I2C的协议很简单:

数据的有效性
  在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。

起始和停止条件
  SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;
  SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。

字节格式
  发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须处理一个响应位。

应答响应   
       数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA 线(高)。   
       在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。
       也就是说主器件发送完一字节数据后要接收一个应答位(低电平),从器件接收完一个字节后要发送一个低电平。

寻址方式(7位地址方式)

  第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的  普通的和带重复开始条件的7位地址格式方向。第一个字节的最低位是
    “0”,表示主机会写信息到被选中的从机;
    “1”表示主机会向从机读信息。
当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定。

仲裁

    I2C是所主机总线,每个设备都可以成为主机,但任一时刻只能有一个主机。

    stm32至少有一个I2C接口,提供多主机功能,可以实现所有I2C总线的时序、协议、仲裁和定时功能,支持标准和快速传输两种模式,同时与SMBus 2.0兼容。


    本实验直接操作寄存器实现对I2C总线结构的EEPROM AT24c02的写入和读取。AT24c02相关操作详见 单片机读取EEPROM(AT24C02)

    库函数实现使用stm32的两个I2C模拟I2C设备间的数据收发,并通过串口查看数据交换情况。

直接操作寄存器

首先需要配置I2C接口的时钟,相关寄存器如下:

I2C_CR2寄存器低五位:
    FREQ[5:0]:I2C模块时钟频率 ,必须设置正确的输入时钟频率以产生正确的时序,允许的范围在2~36MHz之间:
    000000:禁用       000001:禁用       000010:2MHz       ...       100100:36MHz       大于100100:禁用。

用于设置I2C设备的输入时钟,本例使用的是PLCK1总线上的时钟所以为36Mhz;

时钟控制寄存器(I2C_CCR)低12位:
CCR[11:0]:快速/标准模式下的时钟控制分频系数(主模式),该分频系数用于设置主模式下的SCL时钟。
在I2C标准模式或SMBus模式下:
        Thigh = CCR ×TPCLK1
        Tlow = CCR ×TPCLK1

        时钟周期为 T = Thigh + Tlow;

例如:在标准模式下,FREQR = 36 即36Mhz,产生200kHz的SCL的频率

            时钟控制分频系数  = Freqr /2/f    f 为想得到的频率

配置好时钟,还需要配置本机地址,I2C支持7位地址和10位地址,这里用的是7位地址:
自身地址寄存器1(I2C_OAR1)[7:1]:接口地址,地址的7~1位。

其他相关操作参见代码,有详细注释:(system.h 和 stm32f10x_it.h 等相关代码参照 stm32 直接操作寄存器开发环境配置

User/main.c
01#include <stm32f10x_lib.h>   

02#include "system.h"

03#include "usart.h"

04#include "i2c.h"

05  

06#define LED1 PAout(4)

07#define LED2 PAout(5)

08#define LED3 PAout(6)

09#define LED4 PAout(7)

10  

11void Gpio_Init(void);

12  

13int main(void)

14{            

15  

16    Rcc_Init(9);                          //系统时钟设置

17  

18    Usart1_Init(72,9600);

19  

20    Nvic_Init(1,0,I2C1_EV_IRQChannel,4);      //设置抢占优先级为1,响应优先级为0,中断分组为4

21  

22    Nvic_Init(0,0,I2C1_ER_IRQChannel,4);      //设置I2C错误中断抢占优先级为0

23  

24    Gpio_Init();

25  

26    I2c_Init(0x30);                           //设置I2C1地址为0x30                    

27  

28    I2c_Start();

29  

30    while(1);      

31}










收藏 2 评论9 发布时间:2015-10-17 17:54

举报

9个回答
bimax 回答时间:2015-10-17 21:50:15
挺详细的,谢谢分享 1.jpg 2.jpg 4.jpg st.jpg
anger0925 回答时间:2015-10-17 22:38:14
谢谢分享
lkl0305 回答时间:2015-10-18 08:08:56
学习了
disheng4688 回答时间:2015-10-18 09:22:56
谢谢                           
党国特派员 回答时间:2015-10-18 09:26:52
楼主好好排下版。
你好我好大家好! 回答时间:2015-10-18 18:22:44
:):)
peter001 回答时间:2015-10-19 09:23:20
用起i2c 我最头大
ruilimeng 回答时间:2015-10-20 23:49:35
谢谢分享!


futu.png
钊钊 回答时间:2015-10-21 00:34:34

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版