STM32 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协议。下载链接见文末。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。速率最高400Kbit/s。
在1998年的修订中增加了高速模式,速率高达3.4Mbit/s。(这里不讲,只说快速模式)。
2、IIC协议规范
2.1 SDA和SCL信号
连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能,当总线空
闲时这两条线路都是高电平。SDA 和SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压。一般情况下我们都采用上拉电阻的方式
2.2 数据有效性
在SCL高电平的时候采样,也就是有效。低电平的时候切换数据
2.3 开始和结束信号
起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。
停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。
动画展示启动信号
代码实现
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();
}
结束信号时类似的方式(不是动图)
代码实现
void I2C_Stop(void)
{//IO输出SDA_OUT(); SCL_OUT();//IO置0SDA_CLR(); SCL_CLR(); I2C_DELAY();SCL_SET();//延时I2C_DELAY(); I2C_DELAY();I2C_DELAY();//SDA置1SDA_SET();I2C_DELAY();I2C_DELAY();
}
2.4 字节格式
SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。
每一个字节后面跟着一个ACK,有ACK就可以继续写或读。NACK,就停止
ACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机拉低电平。
NACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机无响应,总线为高电平。
动画描述写入的过程
代码实现
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 从机地址和读写位
开始信号—>地址—>读写位—>ACK—>数据—>ACK.............—>停止位
这里只说7位地址,前7位为地址,最后一位为读写位,1表示读操作,0表示写操作
主机发给从机数据,也就是写,没有数据转向时
主机立即读从机数据,从第一个字节
(Combined)综合数据格式
3、计算IIC的频率
通信频率由主机掌控,也就是代码中的延时函数决定的
从上面,我们得知最高速为400Kbit/s。我们设计300Kbit/s。
速率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=120000000us级延时,延时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的说明。
4.2 Addressing
这里直接给出读地址和写地址,也就是最后一位的区别
4.3 读写时序
其实就是按照IIC协议的
读指定器件的指定寄存器
主机设置完寄存器地址之后,再去读写
注意:读取多个字节,最后一个字节的回包应该是NACK
主机立即从机第一个字节读取
注意:读取多个字节,最后一个字节的回包应该是NACK
开源地址:
https://github.com/strongercjd/STM32F207VCT6
点击查看本文所在的专辑,STM32F207教程
资料下载:
百度网盘-链接不存在 提取码:cwsx
如果链接失效,请关注微信公众号,找到下载专区->博客附件,编号0012的下载资源,免费获得。
STM32 IIC详解相关推荐
- 【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC
STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC 一 .I2C物理层 二.协议层 1.I2C基本读写过程 (1)主机写数据到从机 (2)主机由从机中读数据 (3)I2C 通讯复合 ...
- stm32位操作详解
stm32位操作详解 STM32位操作原理 思想:把一个比特分成32位,每位都分配一个地址,这样就有32个地址,通过地址直接访问. 位操作基础 位运算 位运算的运算分量只能是整型或字符型数据,位运算把 ...
- STM32 定时器详解
STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...
- STM32 SPI详解
目录 1.SPI简介 2.SPI特点 2.1.SPI控制方式 2.2.SPI传输方式 2.3.SPI数据交换 2.4.SPI传输模式 3.工作机制 3.1.相关缩写 3.2.CPOL极性 3.3.CP ...
- STM32 GPIO 详解
0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...
- STM32 DAC详解
目录 01.DAC简介 02.DAC转换 03.功能说明 04.DAC输出电压 05.代码配置 上一篇介绍了<STM32ADC详解>,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的 ...
- STM32 ADC详解
目录 01.ADC简介 02.STM32的ADC外设 03.STM32ADC框图讲解 04.触发源 05.转换周期 06.数据寄存器 07.中断 08.电压转换 09.电路图设计 10.代码设计 01 ...
- STM32 串口详解
目录 01.USART的特点 02.USART简介 2.1.数据传输模型 2.2.帧结构 2.3.波特率 03.STM32的USART 04.代码配置 01.USART的特点 USART是通用异步收发 ...
- STM32 SDIO详解
目录 01.SDIO简介 02.SDIO特点 03.SDIO时钟 04.SDIO的命令与响应 05.SDIO块数据传输 06.代码 1.SDIO简介 SDIO,全称:Secure Digital In ...
最新文章
- 实践--课程表(仿超级课程表展示课表)
- Java课程设计——坦克大战
- python工程师月薪多少-Python工程师的薪资到底有多高
- findContours函数
- linux字符设备移动硬盘,Red Hat Enterprise Linux 7.5挂载NTFS移动硬盘
- Java_数组练习答案_Java数组练习题带答案.doc
- Mind+上传模式的第三方Arduino用户库实现 -DHT11温湿度模块
- Django:MySQL查询结果为datetime.date无法转换为JSON
- PDFlib+PDI图像和超文本元素提供了许多有用的功能
- java 7下载_java7下载 v7.0 官方最新版
- SQL service 数据库 某工厂的物料管理系统数据库设计与实现
- 关于ssh整合后struts2拦截器不起作用(blog-1)
- 计算机考试二级搜题软件,计算机二级搜题库-可以帮助计算机二级备考生进行备考的刷题软件...
- ionic ionc-item去掉下划线
- ios 内存深度优化_iPhone 6要用1GB内存 优化太好还是另有玄机?
- 计算机无法连接蓝牙键盘,电脑如何连接无线键盘_电脑上怎么连接蓝牙键盘-win7之家...
- openoffice将word转pdf中文乱码或消失的坑
- C# Format详解
- 为了反击爬虫,前端工程师的脑洞可以有多大?
- C#语言实例源码系列-仿360安全卫士界面
热门文章
- word 2007如何插入参考文献引用
- java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解
- ahb总线协议主机_IIC协议学习笔记
- MCGS 无限配方数据存储及U盘导入导出-第一集
- 制作漫画风图片(无需下载APP无需PS无需电脑)
- php pdo 预处理删除,PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理
- sklearn模型使用贝叶斯优化调参(以随机森林为例)
- svn服务器的搭建过程 主要为服务端
- Python自学----- while if 列表结合,购物车程序
- mysql 命令行参数