当前位置: 首页 > news >正文

做智能家居网站做网站联盟

做智能家居网站,做网站联盟,福州市城乡建设发展总公司网站,沧州app商城定制开发通信协议见#xff08;STM32——SPI#xff09; 一、I2C协议 1.1 I2C协议介绍#xff1b; I2C是#xff08;Inter IC Bus#xff09;是由Philips公司开发的一种通用数据总线#xff1b; 有多根通信线#xff1b; 一根SDA#xff08;串行通信线#xff09;#xf…通信协议见STM32——SPI 一、I2C协议 1.1 I2C协议介绍 I2C是Inter IC Bus是由Philips公司开发的一种通用数据总线 有多根通信线 一根SDA串行通信线 一根SCL串行时钟线 共地GND VCC电源线 同步半双工 支持总线挂载多设备一主多从多主多从 带数据应答主机接收一个数据后会返回应答位告诉从机是否接收到了数据 1.2 I2C协议对硬件的规定 所有设备的SDA连接在一起SCL连接在一起GND连接在一起如果从设备没有单独供电还需要外接电源VCC 主机对SCL时钟线具有绝对的控制权从机只能输入不能控制时钟线,此时SCL可以配置为推挽输出 但是SDA主机和从机即可以输入也可以输出为了避免主机输出同时从机也输出形成短路I2C设计中是禁止所有设备输出强上拉的高电平 采样外接弱上拉电阻加开漏输出的模式阻值一般为4.7千欧 结构图如下 原理设计为开漏模式此时输入时直接经过斯密特触发器整流任何时刻都可以输入输出时经过开漏设计低电平导通为拉下状态低电平高电平截至处于浮空状态引脚电平外接上拉电阻弱上拉为高电平 设计的优点 作用 1.避免电路出现短路现象 2.避免频繁切换引脚模式 3.线与一个或者多个输出低电平呈现低电平只有全部都输出高电平才输出高电平执行多主机下的时钟同步和总线仲裁 过程当I2C处于空闲状态时SCL和SDA均由外挂的电阻拉高至高电平总线处于高电平状态当总线需要传输数据时候SCL保持不变将SDA从高电平转换为低电平产生一个下降沿当从机检测到SCL高电平SDA下降沿时候会复位进入就绪状态在SDA下降沿后SCL也从高电平到低电平一方面占用这个总线同时拼接单元完成后传输后SCL回弹到高电平产生上升沿后SDA也回弹到高电平从机检测后进入终止终止后俩个都处于高电平恢复到平静状态 1.3 I2C协议对软件的规定 1.3.1时序单元: 由起始条件传输字节应答位终止条件组成 起始条件标志着一个数据帧的开始SCL高电平的时候,SDA由高电平变成低电平产生下降沿 终止条件标志着一个数据帧的间隔SLC高电平的时候,SDA由低电平转换为高电平产生上升沿 传输字节发送一个字节接收一个字节 发送一个字节; 分析:SCL高电平期间SDA由高电平变成低电平产生下降沿触发起始条件之后再SCL低电平时主机将数据首位放在SDA上在SCL高电平时从机从SDA进行采样读取数据所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节 接收一个字节时序 分析SCL高电平期间SDA由高电平变成低电平产生下降沿触发起始条件之后再SCL低电平时从机机将数据首位放在SDA上在SCL高电平时主机从SDA进行采样读取数据所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节主机在接受前需要先释放总线(需要先使总线恢复到空闲状态然后从机才能拿到掌控权); 发送和接收一个应答位时序 分析 发送一个应答位主机在接收完一个字节之后在下一个时钟发送一位数据数据0表示应答数据1表示非应答 接收一个应答位主机发送完数据后在下一个时钟接收一位数据判断从机是否应答数据0表示应答数据1表示非应答主机在接收之前需要释放SDA 一个完整的时序过程 I2C一主多从的模型主机可以访问总线上的任何一个设备通过地址来确定是哪个设备首先将每个从机确定一个唯一的设备地址主机在起始条件后发送一个字节从机匹配响应主机在同一个I2C总线上从机的地址必须不同 从机地址在I2C中分为7位和10位地址 每个芯片在出厂时候都会设置一个同类型芯片相同不同类型芯片不同的7位地址如果在一个I2C总线上接相同的芯片此时可以根据芯片的最后几位地址即可变地址 根据引脚改变例如高电平则位1101 0000 低电平位1010 0000 1.3.2示波器时序分析 时序1指定地址写 对于指定设备从机地址在指定地址设备内部寄存器地址下写入指定数据 首先产生起始条件然后发送一个地址字节七位或者十位基地址如果是十位需要发送两个字节第一个字节由5位表示十位基地址的标识3位地址位第二字节为剩余7位地址位一位读写标志位选择从设备和读写方式发送一位应答位之后发送设备内部寄存器地址然后一位应答位之后发送有效数据位如果要连续发送数据位在指定地址下连续依次向后写入就依次发送数据直到数据位发送完毕后发送一位应答位最后发送终止条件 因为寄存器是在线系空间连续存放的通过指针进行操作所以每次读写后指针自动指向下一位地址要连续操作几位就可以找到指定地址后通过连续写入字节即可 过程首先处于平稳状态下SCL和SDA都是处于高电平主机需要给从机写入数据时候在SLC高电平期间拉低SDA产生起始条件随后紧跟的时序必须是发送一个字节的时序内容必须是7位从机地址加1位读写位拉低SCL产生下降沿主机开始输出数据SCL低电平时候主机将数据位依次放在SDA上高位先行然后SCL拉高从机读取SDA上的数据位读取过程中即SCL高电平期间SDA不允许改变循环八次得到的结果是从机地址1101 000 写操作 0读操作1数据时序结束后紧跟着是应答时序主机需要释放SDA根据协议规定从机需要在此时立刻拉低SDA产生一个信号给主机主机判断从机是否应答根据线与的关系主机释放SDA后从机立刻下拉SDA所以SDA依旧保持低电平这个过程就表示了应答SCL为高电平时主机读取数据判断结果从机发送完成后结束对SDA控制SDA回调至高电平因为从机要在低电平尽快变化数据所以SCL下降沿和SDA上升沿同步发送读写为给的0为写入操作所以在应答时序完成后我们立刻要写入一个字节类似地址发送的方法重复八次从机可以自己定义第二个字节的用途重复应答时序然后在重新重复写入时序进行应答时序直到主机结束发送时候产生停止条件即先拉带SDA为后续SDA上升沿做准备释放SCL最后释放SDA形成一个完整的数据帧 时序2当前地址读当前地址读 对于指定设备Slave Address在当前地址指针指示的地址下读取从机数据Data 首先产生起始条件之后发送一个地址字节设备内部地址7读写标志位1之后读出当前指针指示的地址下的数据 时序3指定地址读 对于指定设备Slave Address在指定地址Reg Address下读取从机数据Data 首先首先产生起始条件然后发送一个地址字节七位地址一位写标志位选择从设备发送一位应答位之后发送设备内部寄存器地址然后一位应答位之后重新起始位再次发送地址字节七位地址一位读标志位选择从设备在指定地址下连续依次向后读出 二、I2C外设 2.1I2C外设介绍: I2C外设是STM32内部集成的硬件电路可以自动执行时钟生成和数据时序的收发减轻CPU的负担 硬件自动实现时序软件只需要写入控制寄存器CR产生起始条件等数据寄存器DR写入读取数据读取状态寄存器SR通过标志位判断当前状态 支持多主机模式分为固定多主机和可变多主机 固定多主机即为主机个数固定从机个数固定主机掌控数据总线从机只能通过主机允许才可以短暂的掌控数据总线当多个主机同时控制总线使用权时总线进行仲裁胜利的一方获得总线使用权 可变多主机I2C总线上挂在多个设备没有固定的主机和从机任何一个设备都可以在总线空闲的时候作为主机然后指定其他设备进行通信当通信完成后主机又变成从机当多个设备同时申请时总线进行仲裁胜利的一方获得总线使用权 支持7位/10位地址模式 A.7位地址起始条件后第一个时序是必须是寻址读写位主机想要通信的从机的七位地址一位读写位 B.十位地址则为起始条件后第一、二个时序是必须是寻址读写位是主机想要通信的从机的十位地址一位读写位此时俩个时序为15位读写位共16位15位由5位的十位地址标志位帧头11110十位地址组成 *并且同一个厂商生成的同一种芯片的I2C外挂地址是相同的如果要在一条I2C总线上挂载俩个相同地址的芯片可以通过配置芯片的可变地址即地址的最低位来配置不同的地址在一条I2C总线上不能有相同的地址 支持不同的通信速度标准速度高达100khz快速400KHZ 作为同步时序只需要不超过最大值即可 支持DMA 在多字节操作时候可以提高效率 兼容SMbus系统管理总线协议包括CRC码的生成和校验、SMBus(系统管理总线—System Management Bus)和PMBus(电源管理总线—Power Management Bus)主要用于电源管理系统中。 2.2 I2C外设的结构图 分析I2C外设引脚都是通过复用GPIO实现的具体参考映射表 数据接收与发送 数据控制通过数据控制控制数据的接收发送 接收一个数据当接收一个数据时候数据一位一位的从SDA输入到移位寄存器中高位先行 一位一位的放入数据寄存器中当一个字节数据接收完毕后移位寄存器的值会被移入RDR 数据寄存器中,并置标志位RXNE为1接收寄存器非空此时可以读取寄存器获取寄存器中的值 发送一个数据把要发送的数据写入数据寄存器TDR中当移位寄存器为空时数据寄存器的值会被立刻移入移位寄存器中并置标志位TXE为1发送寄存器空此时新的数据可以存放在数据寄存器中 比较器自身地址寄存器和双地址寄存器作用是当STM32作为从机的时候即可变多主机模式下STM32也是可以作为从机与其他主机通信此时STM32的从机地址通过自身的地址寄存器来配置当主机通信时通过比较器判断是否相同选择是否响应通信并且支持同时响应俩个从机地址 帧错误校验计算I2C自带数据校验 时钟控制通过配置时钟控制寄存器控制时钟控制电路控制SCL输出的时钟频率 控制逻辑电路 中断当内部某些标志位置1时可以开启中断执行一些事件 DMA可以开启DMA通道转运数据 通过配置控制寄存器CR1和CR2实现控制 通过读取状态寄存器SR1和SR2读取状态例如TXE,RXNE位 SMBALERT 总功能图 2.3 I2C外设的实现过程 配置过程 1.RCC开始GPIO和SPI时钟 2.初始化GPIO配置为开漏输出和上拉输入模式 3.初始化I2C配置I2C‘ 4.使能CMDI2C 2.4 时序图 主机发送 过程分析: 起始条件S寻址读写标志数据1数据2....数据N终止条件p数据后包括A响应 首先初始化后总线处于空闲状态STM32默认为从模式产生起始条件写入控制寄存器STM32又从模式转换为主模式发送EV5事件即是否产生标志位产生标志位后即起始条件产生完成在数据寄存器中写入一个字节的从机地址数据寄存器转到移位寄存器中再把这个字节发送到I2C总线上并硬件自动判断是否应答可以产生中断标志位寻址完成后发送EV6事件表示地址发送结束EV6结束发生EV8_1事件TXE移位寄存器空数据寄存器空此时可以写入数据写入数据可以因为移位寄存器也为空此时数据寄存器立马转移数据到移位寄存器并产生事件EV8数据寄存器空移位寄存器非空TXE1,数据1时序产生写入DR清除该事件接收应答为结束后然后移位寄存器空数据寄存器立马转移数据到移位寄存器并产生事件EV8一直重复上述过程直达没有新的数据发送此时当前移位寄存器完成时数据寄存器空移位寄存器也为空此时事件为EV8_2,标志位TXE1BTF字节发送结束 主机接收 过程 首先写入控制寄存器DRS位产生起始条件S然后进入EV5事件表示起始条件已发送之后寻址应答产生EV6事件代表寻址已完成数据1代表数据正通过移位寄存器进行输入EV6_1事件只适用于接收一个字节接收接收后硬件自动发送应答位当时序结束后表示移入的一个字节已转移到数据寄存器了产生EV7事件即收到了数据当把数据读走后该位清除从重复进行当不需要接收时候需要在最后一个时序单元发送时提前把应答位控制寄存器ACK置0并设置终止条件请求,即EV7_1事件完成后给出非应答产生终止事件P 五、API实现 5.1软件模拟I2C实现对MPU的控制 5.1.1程序规划: 首先明确想实现的功能:通过封装GPIO通信引脚模拟I2C时序实现读写MPU根据功能将程序主要分为三部分通信层底层驱动层上层应用层main 5.1.1.1建立I2C通信层模块底层: 1.主要对通信引脚的封装初始化GPIO初始化引脚电平变化封装 2.以及I2C的三个时序组成部分起始终止交换字节 5.1.1.2硬件驱动层上层 基于I2C通信层模块建立MPU6050模块在这个模块里调用底层的拼图组成完整的时序写使能擦除页编程读数据等 5.1.1.3应用层 mian函数里调用驱动层函数实现功能 5.1.2模块封装 首先建立模块MYI2C,MPU6050模块对应.c,.h文件并且包含在文件中完成基础配置参考STM32_程序建立 首先编写第一个模块I2C底层通信主要实现功能初始化GPIO配置GPIO引脚为开漏输出模式封装通信引脚配置时序单元拼图 功能:RCC开启GPIOB时钟初始化GPIOB配置PB10,11为开漏输出模式模拟I2C输出空闲状态下SDA和SCL为高电平外接电阻上拉至高电平 参数:无 返回值:无 封装通信引脚 功能将PB10引脚封装成通信引脚SCL通过改变PB10的电平实现模拟I2C输出 说明:在SMT32主频高变化快要求在SCL电平变化时立刻读走数据I2C对读取速率有要求太快无法读取所以加入延时函数 参数高低电平0/1 返回值无 功能将PB11引脚封装成通信引脚SDA通过改变PB11的电平实现模拟I2C输出 参数高低电平0/1 返回值 功能将PB11引脚封装成通信引脚SDA通过读取PB11的电平实现模拟接收从机输入 参数无 返回值接收到的值 时序单元:起始条件终止条件发送应答位接收应答位发送一个字节的数据接收一个字节的数据  功能产生起始条件空闲条件下SCL和SDA均为高电平在SCL高电平时候SDA由高电平转变为低电平之后在拉低SCL标志着时序的开始 说明:*先将释放SDA,在释放SCL确保在重复起始条件时不出错如果先置SCL高电平在置SDA高电平会判断为终止条件 参数无  返回值无 终止条件时序 功能标志着数据帧的结束/间隔; 说明:发送数据或者接受数据的最后一位是SCL低电平的时候放在SDA上高电平时从SDA上读出之后发送完毕SCL变为低电平但是SDA不确定在此之前需要将SDA先置低电平能够产生上升沿之后在SCL高电平时候SDA由低电平转变为高电平标志着时序的开始 参数无 返回值无 发送一个字节时序 功能实现主机发送一个字节; 说明:在SCL低电平的时主机把字节的一位放在SDA上在SCL高电平时候从机读取SDA上的数据起始条件后SDA为低电平所以直接放入数据之后拉高SCL从机从SDA上读取数据之后拉低SCL主机放入下一位数据 参数要发送的字节 返回值无 接收一个字节的时序  功能接收一个字节的时序; 说明:先将释放SDA相当于切换为输入模式通过低电平写高电平读实现读写分离进来之后SCL是低电平主机释放SDA从机把数据放在SDA上SCL切换为高电平主机从SDA上读取数据之后拉低SCL从机放入下一位数据 参数无 返回值接收到的数据 发送应答位 功能主机发送应答位; 说明:SCL低电平时主机写入SDASCL高电平时,从机接收SDA上的数据开始SCL低电平主机放入数据SDA上随后拉低SCL从机读取SDA之后在拉低SCL写入下一个数据 参数发送的应答位 返回值无 接收应答位 功能从机发送应答位 说明:首先释放SDASCL低电平时从机写入SDASCL高电平时,主机接收SDA上的数据开始SCL低电平从机放入数据SDA上随后拉低SCL主机读取SDA之后在拉低SCL写入下一个数据 参数无 返回值接收的值 在.H文件中声明 第一个模块底层通信层封装完成 下面封装第二个模块硬件驱动层上层将底层的时序单元拼接成一个完整的时序实现功能 指定地址写 功能对于指定设备Slave Address在指定地址Reg Address下写入指定数据Data 说明:首先是产生起始条件触发起始条件后主机发送的第一个字节是寻址发送从设地址选择通信的目标第二个字节是从设置的寄存器地址第三个字节是要发送的数据每次发送后接收从机的应答位最后终止条件时序接收 参数1.从设备的寄存器地址 2.发送的数据 返回值无 指定地址读 功能对于指定设备Slave Address在指定地址Reg Address下读取从机数据DataData 说明:在通过指针对指定地址进行读写操作的所以先通过在指定地址写将指针指向我们需要的地址所以先重复在指定地址写的首先是产生起始条件触发起始条件后主机发送的第一个字节是寻址发送从设地址选择通信的目标第二个字节是从设置的寄存器地址之后重复起始条件寻址时将在指定地址写改为在指定地址读通过|修改最后一位为读然后直接读取数据再把发送应答位为1表示非应答从机将不会在发送数据 如果要进阶连续读取多个数据则将重复读取数据发送应答位写0直到最后一位不再需要读取发送应答位写1 参数1.从设备的寄存器地址 返回值读到的数据 如果要进阶连续读取多个数据则将重复读取数据发送应答位写0直到最后一位不再需要读取发送应答位写1 读取寄存器不同的位置获取的内容参考手册 要想写入寄存器首先要解除芯片的睡眠模式通过写入电源管理寄存器1 初始化MPU6050 功能初始化 说明:在初始化之后要写入一些寄存器对MP6050硬件电路进行初始化配置初始化完成后MPU内部就会进行连续不断的数据转换输出的数据保存在数据寄存器中 参数无; 功能无 使用宏定义修改这样不用频繁的查看手册而且直接写入数字可读性不高 获取数据寄存器的值 功能获取数据寄存器的值获取XYZ对应的加速度值和陀螺仪值 说明:定义俩个变量先读取陀螺仪X轴的高八位在读取陀螺仪x轴的低八位再把他们|在一起的、得到16位数据后在用指针传递进来的地址把读到的数据通过指针返回回去 参数无; 功能返回6个16位的值分别代表XYZ的加速度值和陀螺仪值 *因为函数正常只能返回一个返回值这里需要六个返回值多返回值的方法1在函数外定义六个全局变量子函数读到的数据直接写道全局变量里六个全局变量在主函数中共享相当于返回六个值 2.用指针进行变量的地址传递来实现多返回值 3.用结构体对多个变量进行打包 使用第二种方法定义六个指针变量之后在主函数中定义变量通过指针把主函数变量的地址传递到子函数来子函数通过传递过来的地址操作主函数的变量这样子函数结束后主函数里的变量的值就是子函数想要返回的值 为什么读取的值是16位——因为是通过ADC采集电压值所以是16位详细可见MPU6050; 因为接收值是16的所以八位数据会进行自动强制类型转换所以左移八位不会出错 因为这些寄存器是连续的我们可以通过连续读取多个字节一次性读取14个字节加速度陀螺仪XYZ数据两位温度 在.H文件中声明 测试显示 根据在MPU6050介绍的模型1943/32768x/16gx大约为1g测得Z轴加速度值为1g 加速度计模型我们选择最大量程16g,测得数据是19451945/32768 陀螺仪测得数据/32768x/16满量程 5.2硬件SPI实现对MPU的控制 将软件改成硬件实现只需要更改底层通信层代码的操作驱动层不需要修改因为他们是调用底层通信函数来实现功能的这就是代码隔离封装的好处 主要实现步骤:1.RCC开启GPIO和I2C的时钟 2.初始化GPIO将引脚配置成开漏输出 3.初始化I2C外设 4.生成时序单元 5.使能12C 首先查看库函数 通过结构体初始化12C  生成时序:起始条件:查看手册通过配置CR1寄存器的START位 产生终止条件 产生应答位 发送一个字节 接收一个字节 发送7位地址 如果不是写入操作就把Address最低为置0否则就置1可以用代替函数代替  查看标志位状态监控 分为三种1基本状态监控,同时判断一个或者多个标志位确定那几个EVEN发生 2高级状态监控把SR1和SR2两个状态寄存器拼接为16的值输出 3.基于标志位的监控状态判断某一个标志位 读取标志位清除标志位读取中断标志位清除中断标志位 1.RCC开始GPIO和I2C时钟 2.初始化GPIO配置输出模式为AF_OD复用开漏输出选择引脚PB11和PB10 3.初始化I2C,配置IC2的应答位时钟频率时钟占空比响应地址位数I2C作为从设备时的响应地址 4.使能I2C 因为I2C是低电平产生下降沿的时候是强下拉所以下降沿变化很快但是输出高电平是释放外部上拉电阻产生弱上拉所以上升沿有一个缓冲随着时钟频率越来越大缓冲影响越大大于100Khz时我们通过改变占空比使低电平时间逐渐增多原因是因为低电平改变数据高电平读取数据数据变化需要一定的时间来翻转波形所以在快速模式下要给低电平更多的时间要不低电平来不及数据变化高电平读取也无效所以在小于100kHz时占空比是11大于100kHz时低电平占空比越来越大 这就是为什么频率过高的时候,I2C的传输速度会收到限制的原因 5.时序单元 起始条件 功能:产生一个起始条件 参数无 返回值无 //软件配置我们通过Delay进行阻塞式的流程函数运行完后对于的波形也发送完成但是硬件生成时是直接把寄存器对于位进行修改波形是否完成需要进行标志位判断根据时序图进行判断 参数是指定要检查哪个事件返回值是SUCCESS表示最后一次事件等于我们指定的事件ERROR表示不等于 停止条件 发送一个字节 接收一个字节 不需要应答位因为在我们发送一个字节和接收一个字节后硬件会自动产生应答位 六、实际应用
http://www.hkea.cn/news/14580458/

相关文章:

  • 做淘客网站需要备案温州手机网站建设wmwl
  • 给用ps做的网站加div乐山 网站建设
  • 网站建设 交易保障温州网站制作系统
  • 东莞网站建设公司制作网站广东官网网站建设企业
  • 北京中燕建设公司网站如何选择电商网站建设
  • 托里县城乡建设局网站hdwiki做网站
  • html5做网站好吗手机上怎么设计logo
  • 做印刷的网站有哪些网站主机的选择与优化
  • 推广网站的步骤做网站的赚钱吗
  • 甜品店网站开发背景中国人去菲律宾做网站赌钱会抓吗
  • 阿里云虚拟主机多个网站吗做网站销售好吗
  • 天天联盟广告网站如何做沈阳网站模板
  • 网站备案没有了seo统计
  • centos 网站开发工具南京正规小程序开发公司
  • 网站设计可以吗免费公司介绍网站怎么做
  • 乌兰察布市建设银行网站html网页设计颜色代码
  • 网站建设不完整 审核网站建设课程设计实验指导书
  • 平面设计网站首页新手做导航网站
  • 同人那个小说网站做的最好dede 友情链接 网站简况 调用
  • 做视频赚钱的网站wordpress 屏蔽
  • 江苏工信部网站备案查询济南效果图制作公司
  • 上海做网站吧wordpress默认分类链接
  • 女生化妆品网站建设规划书深圳网站关键词排名
  • 帮别人做网站怎么赚钱制作网页软件免费
  • 建设完网站如何信息更新中国建设机械职业教育网证书查询
  • 设计海报网站赣州建设工程信息网
  • 网站 打赏功能微信公众号服务号怎么创建
  • 淘宝可以在哪些网站上面打做推广需要注册的网站建设
  • 保定做网站国外网站设计理念
  • 网站网络优化外包盘锦网站设计