STM32 IIC详解

STM32 IIC详解本文的程序是主控室STM32F207,读取的芯片是PCF8563。各种宏定义和文件会在末尾说明。1、IIC的定义:IIC即Inter-IntegratedCircuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS),IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同…

大家好,又见面了,我是你们的朋友全栈君。

目录

1、IIC定义

2、IIC协议规范

2.1 SDA和SCL信号

2.2 数据有效性​

2.3 开始和结束信号​

2.4 字节格式

2.5 从机地址和读写位​

3、计算IIC的频率

4、PCF8536

4.1 Acknowledge

4.2 Addressing

4.3 读写时序


1、IIC定义

IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司(后被NXP收购)在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。多主多从的通讯协议。

下文将结合NXP官方的IIC手册讲解IIC协议。下载链接见文末。

STM32 IIC详解

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。速率最高400Kbit/s。

STM32 IIC详解

在1998年的修订中增加了高速模式,速率高达3.4Mbit/s。(这里不讲,只说快速模式)。

STM32 IIC详解

2、IIC协议规范

2.1 SDA和SCL信号

STM32 IIC详解

连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能,当总线空

闲时这两条线路都是高电平。SDA 和SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压。一般情况下我们都采用上拉电阻的方式

2.2 数据有效性STM32 IIC详解

STM32 IIC详解

在SCL高电平的时候采样,也就是有效。低电平的时候切换数据

2.3 开始和结束信号STM32 IIC详解

起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。

停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。

STM32 IIC详解

动画展示启动信号STM32 IIC详解

STM32 IIC详解

代码实现

void I2C_Start(void)
{
  //IO输出
  SDA_OUT(); 
  SCL_OUT(); 
  I2C_DELAY();
  //IO置高
  SDA_SET();  
  SCL_SET(); 
  //延时
  I2C_DELAY();  
  //为低
  SDA_CLR();
  I2C_DELAY();
  I2C_DELAY();
  SCL_CLR();
}

结束信号时类似的方式(不是动图)STM32 IIC详解

STM32 IIC详解

代码实现

void I2C_Stop(void)
{
  //IO输出
  SDA_OUT(); 
  SCL_OUT();
  //IO置0
  SDA_CLR();  
  SCL_CLR(); 
  I2C_DELAY();
  SCL_SET();
  //延时
  I2C_DELAY();  
  I2C_DELAY();
  I2C_DELAY();
  //SDA置1
  SDA_SET();
  I2C_DELAY();
  I2C_DELAY();
}

2.4 字节格式

SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。

STM32 IIC详解

每一个字节后面跟着一个ACK,有ACK就可以继续写或读。NACK,就停止

ACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机拉低电平。

NACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机无响应,总线为高电平。

动画描述写入的过程STM32 IIC详解

STM32 IIC详解

代码实现

uint8_t I2C_Send_byte(uint8_t data)
{
  uint8_t k;
  //发送8bit数据
  for(k=0;k<8;k++){
    
    I2C_DELAY();
    if(data&0x80){
      SDA_SET();
    }
    else{
      SDA_CLR();
    }
    data=data<<1;
    I2C_DELAY();
    SCL_SET();
    I2C_DELAY();
    I2C_DELAY();
    SCL_CLR();
  }
  //延时读取ACK响应
  I2C_DELAY();
  SDA_SET();
  //置为输入线
  SDA_IN();
  I2C_DELAY();
  SCL_SET();   
  I2C_DELAY(); //这里出现了问题,延时变的无限大
  //读数据
  k=SDA_READ();
  if(k){ NACK响应
    return 0;
  }
  I2C_DELAY();
  SCL_CLR();
  I2C_DELAY();
  SDA_OUT();
  if(k){ NACK响应
    return 0;
  }
  return 1;
}

uint8_t I2C_Receive_byte(uint8_t flg)
{
  uint8_t k,data;
  //接收8bit数据
  //置为输入线
  
  SDA_IN();
  data=0;
  for(k=0;k<8;k++){
    I2C_DELAY();
    SCL_SET();
    I2C_DELAY();
    //读数据
    data=data |SDA_READ();
    data=data<<1;
    I2C_DELAY();
    SCL_CLR();
    I2C_DELAY(); 
  }
  data=data>>1; //往回移动1次
  //返回ACK响应
  //置为输出线
  SDA_OUT();
  if(flg){
    SDA_SET(); //输出1-NACK
  }else{
    SDA_CLR();//输出0-ACK
  }
  I2C_DELAY();
  SCL_SET();
  I2C_DELAY();
  I2C_DELAY();
  SCL_CLR();
  I2C_DELAY();
  SDA_OUT();
  //返回读取的数据
  return (uint8_t)data;
}

2.5 从机地址和读写位STM32 IIC详解

开始信号—>地址—>读写位—>ACK—>数据—>ACK………….—>停止位

STM32 IIC详解

这里只说7位地址,前7位为地址,最后一位为读写位,1表示读操作,0表示写操作

STM32 IIC详解

主机发给从机数据,也就是写,没有数据转向时

STM32 IIC详解

主机立即读从机数据,从第一个字节

STM32 IIC详解

(Combined)综合数据格式

STM32 IIC详解

3、计算IIC的频率

通信频率由主机掌控,也就是代码中的延时函数决定的

从上面,我们得知最高速为400Kbit/s。我们设计300Kbit/s。

STM32 IIC详解

速率300Kbit/s,对应周期1/300ms=10/3us≈3us,4分频就是3/4us。

我们使用的延时是,1/120MHZ*3*30 =3/4us

也就是频率是300Kbit/s

和SPI类似,时钟下降沿时,数据转换,时钟上升沿时,采样数据。也就是时钟高电平数据有效。

/*120Mhz时钟时,当ulCount为1时,函数耗时3个时钟,延时=3*1/120us=1/40us*/
/*
SystemCoreClock=120000000

us级延时,延时n微秒
SysCtlDelay(n*(SystemCoreClock/3000000));

ms级延时,延时n毫秒
SysCtlDelay(n*(SystemCoreClock/3000));

m级延时,延时n秒
SysCtlDelay(n*(SystemCoreClock/3));
*/

#if defined   (__CC_ARM) /*!< ARM Compiler */
__asm void
SysCtlDelay(unsigned long ulCount)
{
    subs    r0, #1;
    bne     SysCtlDelay;
    bx      lr;
}
#elif defined ( __ICCARM__ ) /*!< IAR Compiler */
void
SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
       "    bne.n   SysCtlDelay\n"
       "    bx      lr");
}

#elif defined (__GNUC__) /*!< GNU Compiler */
void __attribute__((naked))
SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
       "    bne     SysCtlDelay\n"
       "    bx      lr");
}

#elif defined  (__TASKING__) /*!< TASKING Compiler */                           
/*无*/
#endif /* __CC_ARM */


/*
 * @brief  SysCtlDelay
 * @param  ulCount 延时值,必须大于0
 * @retval None
 */
void SysCtlDelay_IIC(unsigned long ulCount)
{
	SysCtlDelay(ulCount);
}


/定义时钟频率,300KHz
#define I2C_DELAY()  SysCtlDelay_IIC(30)

4、PCF8536

4.1 Acknowledge

这个地方能看到关于2.4节关于ACK和NACk的说明STM32 IIC详解

STM32 IIC详解

4.2 Addressing

这里直接给出读地址和写地址,也就是最后一位的区别STM32 IIC详解

STM32 IIC详解

4.3 读写时序

其实就是按照IIC协议的

读指定器件的指定寄存器STM32 IIC详解

STM32 IIC详解

主机设置完寄存器地址之后,再去读写

注意:读取多个字节,最后一个字节的回包应该是NACKSTM32 IIC详解

STM32 IIC详解

主机立即从机第一个字节读取

注意:读取多个字节,最后一个字节的回包应该是NACKSTM32 IIC详解

STM32 IIC详解

开源地址:

https://github.com/strongercjd/STM32F207VCT6

点击查看本文所在的专辑,STM32F207教程

资料下载:

百度网盘-链接不存在   提取码:cwsx

如果链接失效,请关注微信公众号,找到下载专区->博客附件,编号0012的下载资源,免费获得。

12

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130563.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 流量宝刷流量怎么操作不会被搜索引擎惩罚

    流量宝刷流量怎么操作不会被搜索引擎惩罚流量宝刷流量是根据你提交的一个流量宝任务,服务器收到请求后,在推送给同样使用流量宝软件的用户,这些用户每人浏览一次你的网站,你的网站就会获得巨大的IP流量。同理流量宝可实现流量优化、刷人气、刷排名、刷Alexa、刷广告的功能。流量宝所有的流量都是真实来自真实的IP访问,跟正常的流量没有什么区别。流量宝刷流量怎么操作不会被搜索引擎惩罚需要注意以下几点:1、想要优化关键词其网页必须得先被搜索引擎…

    2022年9月1日
    5
  • mac pycharm 设置_pycharm配置conda环境

    mac pycharm 设置_pycharm配置conda环境MAC环境下pycharm调试Python代码@TOC安装从官网下载,社区版和专业版。和安装其他软件一样,不详细讲。需要配置解释器1.如图,打开配置页面2.如图,右边的框是解释器的位置,这个可以设置。因为项目的不同,经常会有使用不同的库的情况,不同版本放在一起很容易出问题,因此为避免此类问题,往往把不同的库装在不同的虚拟环境中。这样对于依赖于同样的库的项目就可以通过一个虚拟环境运行。安装包的时候最好在终端安装,pycharm直接安装容易出错。下图右面的框就是解释器的位置。3.点击右面的

    2022年8月28日
    6
  • 前端常见算法JS实现「建议收藏」

    前端常见算法JS实现「建议收藏」算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的。1.冒泡排序2.快速排序3.二路归并将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序字符串操作1.判断回

    2022年8月5日
    5
  • max31865C语言程序,max31865+pt100温度传感器实验代码

    max31865C语言程序,max31865+pt100温度传感器实验代码max31865+pt100温度传感器实验代码资源下载此资源下载价格为2D币,请先登录资源文件列表keilkilll.bat,399CORE/core_cm3.c,17273CORE/core_cm3.h,85714CORE/startup_stm32f10x_hd.s,15503FWLIB/inc/misc.h,8982FWLIB/inc/stm32f10x_adc.h,…

    2022年6月26日
    39
  • 如何Ping特定端口号

    如何Ping特定端口号ping端口是最有效的故障排除技术之一,以便查看服务是否正常运行。系统管理员每天都使用ping命令,它依靠ICMP协议来检索有关远程主机的操作信息。但是,仅对主机进行ping操作并不总是足够的:您可能需要对服务器上的特定端口执行ping操作。此特定端口可能与数据库,ApacheWeb服务器甚至网络上的代理服务器相关。在本教程中,我们将看到如何使用各种不同的命令来ping特定端口。使用telnetping特定端口ping特定端口的最简单方法是使用telnet命令,后跟要pin.

    2026年1月16日
    4
  • Kali Linux更新及配置更新源

    Kali Linux更新及配置更新源默认状态下查看更新源root@kali2019:~#cat/etc/apt/sources.list更改Kali的更新源root@kali2019:~#vim/etc/apt/sources.list若更新源不可用,在执行apt-getupdate之后如下所示:更改为中科大更新源执行获取更新命令执行安装更新命令apt-getupdradekali官方源以…

    2022年5月28日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号