教学课件单片机创新开发教程ch17 使用I2C总线.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《教学课件单片机创新开发教程ch17 使用I2C总线.pptx》由会员分享,可在线阅读,更多相关《教学课件单片机创新开发教程ch17 使用I2C总线.pptx(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教材配套PPT正版可修改课件教学课件单片机创新开发教程ch17 使用I2C总线单片机创新开发教程-基于STC8吴险峰第17章 使用I2C总线I2C总线是外围器件常用的接口格式。可以同时挂载多个设备,节省单片机IO资源。本章通过典型的I2C器件来演示I2C应用。1.情境导入2.学习目标3.相关知识4.项目设计5.项目实现6.知识拓展7.强化练习17.1情境导入小白:“上次说单片机和外围器件通信,除了UART,还有I2C模式,能否介绍一下?”小牛:“I2C是外围器件常用的接口格式之一,只需要两根线就可以挂载多个设备,非常方便。I2C总线协议相对复杂,但通过图形模块封装,大大降低了编程难度。”小白:
2、“嗯,我先学会如何使用I2C,再进一步了解协议内容”。17.2 学习目标【知识目标】1.学习I2C的理论知识。2.了解常用寄存器。3.掌握硬件I2C和软件I2C的区别。【能力目标】1.能使用I2C接口OLED屏。2.能使用I2C接口RTC模块。3.进行I2C图形化编程。17.3 相关知识l17.3.1.I2C简介l17.3.2.硬件I2Cl17.3.3.软件I2Cl17.3.4.图形化指令l17.3.5.I2C和UART区别l17.3.6.RTC实时时钟l17.3.7.OLED显示模块l17.3.8.QMA7981加速度模块17.3 相关知识17.3.1.I2C简介内部集成电路(Inter-I
3、ntegratedCircuit,I2C,IIC)总线是由飞利浦(Philips)公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。I2C总线包含SCL时钟线和SDA数据线。由于只有一根数据线,I2C只能进行半双工通信。如图17-1所示,总线通过线与方式连接多个器件。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据
4、,首先由主器件寻址从器件。然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据 传 送。协 议 规 定 了 4个 双 向 传 输 速 率:100kbit/s、400kbit/s、1Mbit/s、3.4Mbit/s,分别对应标准、快速、快速+、高速模式。如果是单向传输,对应超快速模式可以达到5Mbit/s。1.整体架构17.3 相关知识17.3.1.I2C简介I2C总线包含SCL时钟线和SDA数据线。由于只有一根数据线,I2C只能进行半双工通信。如图17-1所示,总线通过线与方式连接多个器件。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此
5、时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始信号S;当SCL为高电平的时候,SDA线上由低到高的跳变被定义为结束信号P。总线在起始信号之后才传输有效信号,在结束信号之后被视为空闲状态。如图17-2所示。2.起始和结束条件17.3 相关知识17.3.1.I2C简介发送起始信号后传送的第一字节数据非常重要,这就是I2C器件的地址码。地址码是由种类型号,及寻址码组成的,共7位。因此理论上I2C可以接入127个设备(加上单片机主机,一共27=128个)。器件地址格式如表17-1所示。3
6、.地址码(1)器件类型:B7-B4共4位。这是由飞利浦已经定义好了标准,也就是说这4位已是固定的。比如存储器件1010,A/D器件1001,显示器件0111等。(2)用户自定义地址码:B3-B1共3位。这是由用户自己设置的,通常的做法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。因此同一型号的IC只能最多共挂8片同种类芯片。(3)最低一位B0就是R/W读写位。当主控器对器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和读写位组成的从地址为主控器发送的第一字节。I2C总线地址码B7B6B5B4B3B2B1B
7、017.3 相关知识17.3.1.I2C简介I2C总线数据传送时,每传送一个字节数据后都必须有应答信号Ack。主控器接收数据时,如果要结束通信时,将在停止位之前发送非应答信号。每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,高电平1表示非应答。4.应答信号Ack在总线的一次数据传输过程中可以有以下几种格式(深色背景表示主机控制SDA,白色表示从机),如图17-3所示。5.数据帧格式(a)主机向从机发送数据(b)主机由从机读
8、取数据(c)主机读/写方式改变17.3 相关知识17.3.2.硬件I2CSTC8系列的单片机内部集成了一个I2C串行总线控制器。对于SCL和SDA的端口分配,STC8系列的单片机提供了切换模式,可将SCL和SDA切换到不同的I/O口上,以方便用户将一组I2C总线当作多组进行分时复用。STC8系列的I2C总线提供了两种操作模式:主机模式(SCL为输出口,发送同步时钟信号)和从机模式(SCL为输入口,接收同步时钟信号)。I2C的编程涉及9个寄存器,如表17-2所示,编程复杂。还好通过图形化模块编程,封装了相关寄存器设置。建议从实验入手,结合I2C数据帧格式,慢慢深入底层代码。图形化库默认使用P14
9、、P15两个硬件I2C引脚,使用代码编程可以自定义选择引脚。17.3 相关知识17.3.2.硬件I2C符号描述位地址与符号B7B6B5B4B3B2B1B0I2CCFGI2C配置寄存器ENI2CMSSLMSSPEED5:0I2CMSCRI2C主机控制寄存器EMSI-MSCMD3:0I2CMSSTI2C主机状态寄存器MSBUSYMSIF-MSACKIMSACKOI2CSLCRI2C从机控制寄存器-ESTAIERXIETXIESTOI-SLRSTI2CSLSTI2C从机状态寄存器SLBUSYSTAIFRXIFTXIFSTOIFTXINGSLACKISLACKOI2CSLADRI2C从机地址寄存器I2
10、CSLADR7:1MAI2CTXDI2C数据发送寄存器I2CRXDI2C数据接收寄存器I2CMSAUXI2C主机辅助控制寄存器-WDTA和UART串口涉及的寄存器相比,I2C的寄存器设置要复杂一些。17.3 相关知识17.3.3.软件I2C在单片机没有硬件I2C时,可以通过软件模拟I2C,用两个GPIO口来控制SDA和SCL两条线的电平状态,来产生信号,如起始信号、停止信号等,严格遵循I2C总线协议来实现通信。软件I2C性能不如硬件I2C,无法提供高速,并占用CPU资源。实际上经典51等老款单片机都是采用软件模拟I2C。17.3 相关知识17.3.4.图形化指令常用指令图形化指令实例1.I2C
11、总线初始化2.I2C读数据3.I2C写数据I2C的图形化指令如表17-3所示,目前只支持主机模式。17.3 相关知识17.3.5.I2C和UART区别两者主要区别如下。1.通信线路。都是两根线。UART一根发送一根接收,可以全双工通信。I2C接口也是两根线,一个时钟线,一个数据线,不能同时收发,只能半双工通信。2.通信对象。UART是一对一,I2C可以一对多。3.通信距离。UART不需要同步时钟,所以距离更远,通常单片机和电脑连接都是UART模式。而I2C距离短,一般就是在电路板内部器件之间。4.通信速度。UART速度较低,而且随着距离增加,传输速率下降。I2C速度较高,还有高速模式。鉴于I2
12、C可以一对多通信的优势,目前采用I2C接口的外设也非常普遍。结合本章任务介绍一下常用的外设RTC和OLED模块。17.3 相关知识17.3.6.RTC实时时钟BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。其图形化指令如表17-4所示。常用指令图形化指令实例1.RTC初始化2.RTC读取数据3.RTC读取时间选取,可选择年、月、日、周、时、分、秒4.RTC设置时间和日期17.3 相关知识17.3.7.OLE
13、D显示模块BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。其图形化指令如表17-4所示。常用指令图形化指令实例1.初始化OLED2.OLED关闭显示3.OLED更新显示4.OLED清屏5.OLED在坐标X,Y显示一个像素点6.OLED在坐标X,Y清除像素点7.OLED在坐标X,Y显示一个字符8.OLED在坐标X,Y显示一个字符串9.OLED在坐标X,Y显示一个数值10.OLED在坐标X,Y显示一个指定字体大
14、小的汉字11.OLED在一个范围内显示图片17.3 相关知识17.3.8.QMA7981加速度模块QMA7981是一个单芯片三轴加速度传感器,14-BitADC采样精度,内置常用运动算法,提供标准I2C/SPI接口,支持低功耗模式,广泛应用与手机、运动手表等设备。图形化指令如表17-6所示。常用指令图形化指令实例1.QMA7981初始化。2.QMA7981刷新数据3.QMA7981读X/Y/Z轴加速度4.QMA7981获取步数5.QMA7981启用运动检测算法中断6.QMA7981读中断7.QMA7981判断中断类型17.4 项目设计RTC模块如图17-4所示。I2C的时钟脚连P1_5,数据脚
15、连P1_4。OLEDQ和MA7981模块如图17-5所示。都采用相同的I2C总线,时钟脚连P1_5,数据脚连P1_4。17.4 项目设计任务1用OLED显示屏显示#includeuint32sys_clk=24000000;/设置PWM、定时器、串口、EEPROM频率参数#includelib/twen_board.h#includelib/oled.h#includelib/delay.hvoidsetup()twen_board_init();/天问51初始化oled_init();/OLED初始化voidloop()oled_clear();/OLED清屏oled_show_font12
16、(天问,40,0);oled_show_num(64,3,51);oled_show_string(0,15,0.91OLEDTEST);oled_display();/OLED更新显示delay(1000);oled_clear();/OLED清屏oled_show_string(32,3,TWen-51);oled_show_string(0,15,0.91OLEDTEST);oled_display();/OLED更新显示delay(1000);17.4 项目设计任务1用OLED显示屏显示#include#includedelay.h#includehardiic.h#include#i
17、nclude#includeoledfont.h#include#defineOLED_ADDR0 x78/写地址#defineOLED_CMD0/写命令#defineOLED_DATA1/写数据#defineOLED_MODE0#defineOLED_MAX_COLUMN128#defineOLED_MAX_ROW32staticuint8xdata_oled_disbuffer1284;显然显示函数都进行了封装,我们打开oled.h,对主要函数进行分析。voidoled_init();/初始化OLEDvoidoled_display_off();/关闭OLED显示voidoled_disp
18、lay_on();/开启OLED显示voidoled_display();/缓存显示voidoled_clear();/清屏voidoled_set_pixel(uint8x,uint8y,uint8pixel);/在指定位置显示一个点/X个像素点,y行voidoled_show_char(int8x,int8y,uint8chr);/在指定位置显示一个字符字符高8,宽5voidoled_show_string(int8x,int8y,uint8*chr);/在指定位置显示字符串字符高8,间距8voidoled_show_num(int8x,int8y,int16num);/在指定位置显示数字
19、字符高8,间距8voidoled_show_float(int8x,int8y,floatnum,uint8precision);/在指定位置显示小数voidoled_show_font12(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示12x12汉字voidoled_show_font16(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示16x16汉字voidoled_show_font24(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示24x24汉字voidoled_
20、show_font32(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示32x32汉字voidoled_fill(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/填充voidoled_show_line(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/绘制线段voidoled_show_rectangle(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/绘制矩形框voidoled_fill_rectangle(uint8x0,ui
21、nt8y0,uint8x1,uint8y1,uint8pixel);/填充矩形voidoled_show_circle(int16xc,int8yc,int8r,uint8pixel,uint8fill);/绘制圆voidoled_show_triangel(uint8x0,uint8y0,uint8x1,uint8y1,uint8x2,uint8y2,uint8pixel);/绘制三角形voidoled_fill_triangel(uint8x0,uint8y0,uint8x1,uint8y1,uint8x2,uint8y2,uint8pixel);/填充三角形voidoled_show_b
22、mp(uint8x0,uint8y0,uint8x1,uint8y1,uint8*BMP);/显示BMP图片#include hardiic.h说明OLED库包含了硬件I2C库,#include oledfont.h说明包含了OLED字符库。OLED的从机地址为啥是0 x78(0b01111000),因为Philip定义的I2C中,显 示 器 件 I2C地 址 是(01111XXX),而最后一位是0表示写地址。17.4 项目设计任务1用OLED显示屏显示#ifndef_HARDIIC_H#define_HARDIIC_H#include#includedelay.h#defineHARDIIC
23、_IICX0 x80/将IIC设置为P1_5,P1_4#defineHARDIIC_SCL_OUTP1M1|=0 x20;P1M0|=0 x20;/开漏输出#defineHARDIIC_SDA_OUTP1M1|=0 x10;P1M0|=0 x10;/开漏输出voidhardiic_init();voidhardiic_read_nbyte(uint8device_addr,uint8reg_addr,uint8*p,uint8number);voidhardiic_write_nbyte(uint8device_addr,uint8reg_addr,uint8*p,uint8number);/
24、=/描述:等待以及清除中断标志位./参数:none./返回:none./=voidhardiic_wait()while(!(I2CMSST&0 x40);I2CMSST&=0 x40;/=/描述:IIC初始化./参数:none./返回:none./=voidhardiic_init()HARDIIC_SCL_OUT;/开漏输出HARDIIC_SDA_OUT;/开漏输出P_SW2|=HARDIIC_IICX;/外设端口切换控制寄存器I2CCFG=0 xe0;/使能IIC主机模式I2CMSST=0 x00;/IIC主机状态寄存器清零由于OLED的库函数调用了硬件I2C库,我们打开hardiic.
25、h继续分析。17.4 项目设计任务1用OLED显示屏显示/=/描述:IIC发送start信号./参数:none./返回:none./=voidhardiic_start()I2CMSCR=0 x01;/发送START命令hardiic_wait();/=/描述:IIC发送stop信号./参数:none./返回:none./=voidhardiic_stop()I2CMSCR=0 x06;/发送stop命令hardiic_wait();/=/描述:IIC写n个字节数据./参数:设备地址(8位模式,7位地址需要左移一位),寄存器地址,缓存数据地址,数量/返回:none./=voidhardiic_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件单片机创新开发教程ch17 使用I2C总线 教学 课件 单片机 创新 开发 教程 ch17 使用 I2C 总线
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内