完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
针对GPIO、I2C、SPI的讲解,对这些通讯方式有个大致框架,对日后的开发会有帮助,了解因为所以然。 一. GPIO 1. 什么是GPIO? GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,GPIO口是由引脚,功能寄存器组成,不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,具体可以参考芯片手册里的GPIO篇。 GPIO的作用是用来控制连接在此GPIO口上的外设,我们一般通过观察原理图找到当前板子的GPIO口引出在哪个口上或者排针上,我们把我们的外设接到上面去就可以通过GPIO与这个外设进行交互控制,在驱动层我们通过读写GPIO口中的功能寄存器来改变连接在此GPIO上的外设状态。 2. GPIO组成原理 GPIO原理图如下: 取自STM32F7系列,不同架构的GPIO口封装不同,这里仅用于当前示例 从上面原理图可以看出STM32F7系列GPIO是由三个寄存器以及“TTL肖特基触发器、二极管、P-MOS管和N-MOS管”组成 3. GPIO工作原理 电子器件的作用: [tr] 器件名 作用 [/tr]
上面涉及到一个知识点,推挽与开漏输出,这两个模式是使用P-MOS与N-MOS两个晶体管实现的 P-MOS与N-MOS的区别 P-MOS是接了VDD(正极电源),所以它拥有输出高电流的能力,所以给P-MOS高电平就可以导通P-MOS管,因为接了电源线的原因一旦导通了就可以让电源线里的工作电压流通,而N-MOS上面接了VSS,若给高电平是无法导通的,因为它没有接电源线是无法输出高电平的,如果给了N-MOS高电平即便流通了因为没有VDD电源线它也无法正常输出电流,若给了低电平则会流向VSS接地处,所以N-MOS只能给低电平才有效,若想N-MOS驱动可以外接上拉电阻。 所以这里输出低电流的话输出到N-MOS晶体管的引脚上,那么始终输出的是接地部分,可以有效降低材料的消耗率。 这里说一下高电平与低电平在电路里的区分: 这里以TTL电路为列,高电平>3.4V,低电平<0.2V,所以即便N-MOS没有输出任何电流,它也是低电平。 使用这两个器件能够在输出高低电平时保证材料的消耗率降低,如果使用一个线路输出高低电平的话会损耗会提升,N-MOS会一直接地,所以输出端其实一点电流都没有,这会极大降低消耗率。 MOS是场效应管,它有两种类型,P沟道与M沟道,至于哪种类型取决于MOS源接在VDD还是VSS,接在VDD就是P沟道,接在VSS就是M沟道 推挽输出 连接在输出控制电路里的数字器件,可以输出高电平与低电平,输出数字信号0时N-MOS导通,P-MOS高阻,输出数字信号1时P-MOS导通,N-MOS高阻抗 开漏输出 只能输出低电平,输出数字0时N-MOS导通,P-MOS高阻,无法输出高电平,若需要输出高电平需要在N-MOS晶体管后的引脚上接一个上拉电阻,将所有不确定的信号变成高电平,它只能从N-MOS这条线路上流过,所以就导致了它不能输出高电平 输出电路会获取输出数据寄存器里当前的模式位是什么,如推挽或开漏,若推挽则用电路比较器进行电流比较来确定输出到P-MOS还是N-MOS,若是开漏模式则根据N-MOS导通特性以及当前数字信号的值0/1,来输出对应的电流导通,同时电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。 开漏负载能力较强,因为有上拉电阻,所以一般长时间的设备会用开漏输出 二. I2C 1. 什么是I2C? I2C全拼Inter Integrated Circuit,简称IIC或I2C,是由Philips公司开发的两线时串行总线,用于SOC与外设的连接通讯,它只需要两根线就能实现I2C的通讯,采用主从模式,主的一方可以读写数据,而从的一方只能等待被读写。从的一方没有主动权。 I2C是双向通讯的,由两根线完成,分别是:SDA(串行数据线)、SCL(串行时钟线),接口输出模式为开漏输出,其总线接口已经集成到SOC内部,我们只需要通过原理图找到它的接口,在用外设的杜邦线或者其它方法连接到此接口上就可以实现I2C的通讯。 SDA与SCL都外接了上拉电阻,所以当SDA空闲时刻输出的永远是高电平,它对外设也有一定要求,要求外设的输出模式也是开漏输出,因为这跟它本身的电路实现有关,若两个电路接口模式不一则是无法完成正常通讯的。 其中I2C里的上拉电阻也不是随便用的,因为电阻值越高意味着信号拉高周期越长,那么通讯周期时间就越高,速率就下来了。 I2C为每个设备提供了一个地址,可以通过这个地址找到不同的设备,来表明不同的设备,只有从设备收到是自己的地址时才响应。 因为连接在I2C上的可能有很多个设备,从设备需要设置自己的地址,主设备不用,因为主设备是不会被从设备读写的,主设备是负责读写其它设备的。 通讯时会有一个起始数据,这个数据是9个bit位,前7位是从设备地址,最后一位是方向(0/1(读或写)) 这也就表明从设备的地址不能超过7个bit 2. I2C组成原理 架构图: SMBA线用于SMBUS 的警告信号,I2C 通讯没有使用,可以忽略 I2C内部是有自己的控制单元的,用于处理I2C的通讯,可以说是一个小芯片,它不属于CPU,它只是被集成SOC里(看架构,有的架构是没有的) 3. I2C的特性
双向传输总线: [tr] 模式 速率(kbit/s) [/tr]
[tr] 模式 速率(kbit/s) [/tr]
设置方法: 我们需要根据当前的PCLK时钟频率来计算的,这和设置PWM占空比类似,都需要经过计算然后设置I2C里的CCR时钟控制寄存器的值,因为如果频率不同是无法正常工作的。 如:时钟频率是66MHZ,预分频值是65MHZ,系数是1/2那么计算公式如下: 时钟频率=PCLK/((预分频值+1))/分频系数 PCLK我们得知是66,分频值我们设置的是65,分频系数是1/2也就是除于2 所以公式:66/(65+1)/2 =0.5 在将0.5转化为HZ的单位:0.5*1000=500KHZ,这里还有一个公式,就是算HZ转秒,赫兹的倒数就是它的秒这个公式:(1/500)=0.002ms,1毫秒=1000微秒,0.002毫秒等于2微秒,通过这样的算法公式就可以得知我们现在的频率是每2微秒工作一次 我们想让它每0.5毫秒工作一次,所以TCNTB的值=500毫秒/当前微秒频率2 500/2=250,所以TCNTB的值应该为250,当然你也可以这也算,2微秒一次,1毫秒=1000微秒,0.5毫秒就等于500微秒,500微秒/2微秒=250,就得出经过250次2微秒后就到达了500微秒,而500微秒就等于0.5毫秒 5. I2C的通讯过程 通讯步骤:
这三种信号里,起始信号是必须需要的,而结束信号和应答信号都可以视情况不要。 在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备 将释放总线,总线再次处于空闲状态 传输过程:
从设备是需要实时监听SCL的电平变化,来完成对应的动作 以下是发送170(十六进制:0xAA; 二进制:1010 1010)到从设备的传输时序: 总结理解起始与结束信号就是:
6. I2C接口工作模式 I2C接口有四种工作模式 [tr] 工作模式 介绍 [/tr]
其中因为是高位到地位发送的,所以内部会有一个位移寄存器的过程才能写入到DR寄存器 7. 硬件拉高拉低的过程 I2C的SDA与SCL都外接了上拉电阻,如果一直处于拉高状态那么只能输出高电平无法输出低电平,那么数字逻辑信号时钟是1,这样结果是不对的,所以需要有一个拉低的过程才能保证传输的bit位是有效且正确的。 I2C内部有一个逻辑控制器,负责控制这一块,当需要上拉时候会控制FET(场效应管,主要作用是控制半导体器件,控制电阻值),来拉低上拉电阻值使其电流固定在低电平值范围,产生低电平信号 拉低: 拉高: S3C2400的物理层的拓扑结构(仅供参考): 8. 一对多 I2C给每个从设备设置地址,然后通过发送地址位来选择要操控哪个从设备。 在每个从设备连接后需要设置自己的地址,便于I2C主设备查找。 每个设备连接到I2C的SDA与SCL上,然后I2C主设备对这条线发送地址当从设备收到以后来确定是否是寻找自己 下图的连接就是将所有设备的SCL与SDA连接到I2C的主设备上,也就是说将I2C主设备的SDA与SCL引出来,然后从设备接到这根线上去,然后发送数据时接在这跟线上的所有设备都能监听到电平变化,就像socket的广播模式一样。 主设备是不需要设置自身地址的,因为不会有人找它,当然如果要与其它外设进行合作开发,可以设置一个自己的地址,并编写监听代码让自己做主或从 9. 开发流程 以下是我在资料里找到的开发流程,若裸机编程可以用作参考 主机接收模式: 主机发送模式: 三. SPI 1. 什么是SPI? SPI全拼Serial Peripheral interface(串行外围设备接口),是由Motorola(摩托罗拉)在MC68HCXX系列处理器上定义的,主要应用于EEPROM(带电可擦可编程只读存储器),FLASH,RTC(实时时钟),AD转换器,还有数字信号处理器和数字信号解码器。 SPI,是一种高速的,全双工,同步的通信总线,且只需要四根引脚线,与I2C一样都大大简化了PCB板子的布局空间,SPI依然是一种世界级的流行标准,大多数板子都内置了SPI的接口。 Motorola设计它的初衷也是为了节约排版空间。 2. SPI优与缺点 优点
SPI模块框架图 SPI结构 上图结构中的SCK、SS、SDO、SDI是比较重要的几根线,其作用如下: [tr] 名称 作用 [/tr]
其内部是有DR寄存器与位移寄存器,用来存数据与写数据 4. SPI通讯模式 SPI有四种通讯模式,分别是:
[tr] 模式 作用 [/tr]
SPI工作模式与CPOL和CPHA的对应关系以及它俩的作用: [tr] 模式 CPOL CPHA [/tr]
这里说一下在SPI中什么是边沿,这里的第1个边沿与第2个边沿表示的是电平变化 边沿表示的是上升沿或下降沿 上升沿:即在一定周期时由低电平变化到高电平,然后此时在进行数据采样,即电平信号到数字信号转换 下降沿:即在一定周期时由高电平变化到低电平,然后此时在进行数据采样,即电平信号到数字信号转换 CPOL 用来决定SCL空闲时应该是怎样的电平状态,若为0,SCLK空闲时输出低电平,若为1空闲时输出高电平 CPHA 它用来表示该SDI有效还是SDO有效,若它的值为0则代表第0个边沿数据采样,即SDI上可以进行数据采样,若它为1时则SDO数据可以进行采样 同时它与CPOL是关联的: 若CPHA为0,CPOL为0时: 若CPOL为0,则第一个边沿有效,即SCLK空闲时是低电平,那么边沿就等于上升沿,同时SDI输出信号,SDO可以采样了 若CPHA为0,CPOL为1时: 若CPOL为1,则第一个边沿有效,即SCLK空闲时是高电平,那么边沿就等于下降沿,同时SDO输出信号,SDI可以采样了 SDI与SDO线对主设备和从设备方向不同,SDI线在主设备上是输出,从设备上是输入,所以它们是相反的,所以当SDI输出信号时,对于从设备来说,它就可以读数据了所以主设备与从设备两根线SDO与SDI两根线作用是不一样的,所以上面的状态对于不同的设备是相反的,也就是刚好实现了主设备写时,从设备读,主设备读时,从设备写 采样意思是设备可以去某个线上去读数据了 SPI是没有控制信号的,只能通过SCLK时钟的状态来告诉从设备现在的流方向,从设备需要实时检测当前的SCLK状态 工作时需要保证从设备与主设备一致的工作模式,其次许多从设备在出厂时就已经设定好了工作模式,是无法修改的,有些从设备是可以修改的。 5. 通讯过程
在通讯之前需要保证双方时钟频率是一致的,一般情况下从设备是无法修改时钟频率的,只有主设备能够修改时钟频率,将主设备的时钟频率修改与从设备一致,默认情况下是不需要修改这些的,这个可以根据芯片手册中SPI上的使能时钟接的是谁,如果提供了GPIO口进行修改那么就支持可编程时钟,若没有则代表当前的MCU不支持编程SPI的时钟频率 |
||
|
||
只有小组成员才能发言,加入小组>>
3120 浏览 9 评论
2819 浏览 16 评论
3332 浏览 1 评论
8693 浏览 16 评论
3921 浏览 18 评论
9540浏览 3评论
874浏览 3评论
441浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
445浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2169浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-15 20:29 , Processed in 0.974762 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191