分享

PIC单片机之SPI总线篇

 共同成长888 2020-06-24

大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,现在我们就趁热打铁,再向上跨一步,一起来学习一下SPI 总线器的工作原理及使用方法,这样我们可以将一些需要保存的数据保存到存储器芯片中,掉电不会失丢,如汽车的里程表,它在不断地计数,其公里数就是放在一个SPI 总线的存储器芯片里面。

一、SPI总线基本概念

SPI ( Serial Peripheral Interface ———串行外设接口) 总线是Motorola 公司推出的一种同步串行接口技术。SPI 总线系统是一种同步串行外设接口, 允许MCU 与各种外围设备( 如闪存、数摸转换、网络控制器、从MCU) 以串行方式进行通信、数据交换。

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。其工作模式有两种:主模式和从模式。SPI 是一种允许一个主设备启动一个从设备的同步通讯的协议,从而完成数据的交换。

也就是SPI 是一种规定好的通讯方式。这种通信方式的优点是占用端口较少,一般4 根就够基本通讯了(不算电源线)。同时传输速度也很高。一般来说要求主设备要有SPI 控制器(也可用模拟方式),就可以与基于SPI 的芯片通讯了。

二、SPI总线系统结构

SPI 系统可直接与各个厂家生产的多种标准外围器件直接接口, 一般使用4 条线: 串行时钟线(SCK) 、主机输入/ 从机输出数据线SDO、主机输出/ 从机输入数据线SDI 和低电平有效的从机选择线SS。SDI 和SDO 用于串行接收和发送数据,数据高位在前低位在后。在SPI 设置为主机方式时,SDO 是主机读从机,SDI 是主机写从机。SCK 用于提供时钟脉冲将数据一位位地传送。SPI 总线器件间传送数据框图如图1 所示。

三、SPI总线的接口特性

利用SPI 总线可在软件的控制下构成各种系统。如1 个主MCU 和几个从MCU、几个从MCU 相互连接构成多主机系统(分布式系统)、1 个主MCU 和1 个或几个从I / O 设备所构成的各种系统等。在大多数应用场合,可使用1个MCU 作为主控机来控制数据,并向1 个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式总是高位(MSB)在前,低位(LSB)在后。

当一个主控机通过SPI 与几种不同的串行I / O 芯片相连时,必须使用每片的允许控制端,这可通过MCU 的I / O 端口输出线来实现。

但应特别注意这些串行I / O 芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU 的MISO端只能连接一个外设。其次是外设的串行数据输入是否有允许控制端。

因为只有在此芯片允许时,SCK 脉冲才把串行数据移入该外设;在禁止时,SCK 对外设无影响。若原来没有允许控制端,则增加控制门;当然,也可以在SPI 总线上只连接1 个外设,就不必用允许控制。

通过前文的原理介绍,我们已经对SPI 总线的特性以及工作原理有了大致地了解,但当我们拿到一个SPI 总线器件时要正确地应用它,还是一时不知如何下手,比如我们现在要想把一个具体的数据存储放器件中去,需要怎么办呢?现在,我们来一起看一个数据存储的例子,通过一个实例,相信会给大家带来一个感性的认识,下面就以目前单片机系统中广泛应用的SPI 接口的数据存储器93C46 为例,介绍SPI器件的基本应用。

四、93C46串行存储器简介

93C46 是1k 位串行EEPROM 储存器。

每一个储存器都可以通过DI/DO 引脚写入或读出。它的存储容量为1024 位,内部为128×8位或64×16 位。93C46 为串行三线SPI 操作芯片,在时钟时序的同步下接收数据口的指令。

指令码为9 位十进制码,具有7 个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100 万次, 93C46 的引脚功能图如图2 所示。

图2 93C46 的引脚图

图2 93C46 的引脚图

表1 :93C46 串行EEPROM 指令格式选择表

表1 :93C46 串行EEPROM 指令格式选择表

指令说明:

① 读(READ):当下达10XXXXXX 指令后,地址(XXXXXXXX) 的数据在SCK=1 时由DO输出。

② 写(WRITE):在写入数据前, 必须先下达写使能(EWEN) 指令, 然后再下达01XXXXXX 指令后, 当SCK=1 时, 会把数据码写入指定地址(XXXXXXXX);而DO=0 时,表示还在进行写操作, 写入结束后DO 会转为高电平。写入动作完成后,必须再下达写禁止(EWDS)命令。

③ 清除(ERASE): 下达清除指令11XXXXXX 后会将地址(XXXXXXXX)的数据清除。

④ 写使能(EWEN):下达0011XXXX 指令后,才可以进行写(WRITE)操作。

⑤ 写禁止(EWDS):下达0000XXXX 指令后,才可重复进行写入(WRITE)操作。

⑥ 芯片清除(ERAL):下达0010XXXX 指令后,全部禁止。

⑦ 芯片写入(WRAL):下达0001XXXX指令后,全部写入“0”。

我们的例子程序功能是要实现对93C46 存储器的读写操作,并验证数据是否正确。程序先分别向0x02 和0x03 两个地址写入0x55 和0xAA,然后读其中一个地址,并将读到的数据显示出来验证是否正确。程序默认是读0x02 地址内的数据,读者也可以修改地址数据来读其它地址数据。

首先, 我们来看一下增强型PIC 实验板上的93C46 接口电路, 因为我们需要将软件和硬件相结合进行考虑如何来编程,完成该实验的硬件原理图如图3 所示,U6 为实验板上的93C46 芯片, 单片机的RB1、RB2、RB4、RB5 分别与芯片的CS、CLK、DI、DO 脚相连,七段数码管D5、D7、D8 组成了显示单元,字形码的数据通过RC 口送入,各数码管扫描显示信号分别不同的RA 口进行控制。

图3 硬件原理图

图3 硬件原理图

对于单片机软件的编程,我们使用MPLabIDE 软件来进行C 语言编程,它是我们的编程环境,同时我们可以通过使用ICD2 仿真烧写器和增强型PIC 实验板连接进行程序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的说明和介绍,在此就不再重复说明,读者朋友可以参阅以前的文章或直接登陆我们的网站查看资料。现在我们可以输入程序代码进行调试了, 我们在MPLab IDE软件中新建工程, 加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。由于篇幅限制,程序的源代码请上网站www.ele169.com 或www.hificat.com下载。 流程框图如图4 示。

图4 读写演示程序的流程图

图4 读写演示程序的流程图

编好程序后将编译好的HEX通过ICD2 仿真烧写器烧入单片机芯片,上电运行,效果如图5 所示。“0170”是我们事先写入存储器芯片再将其读出来的十进制值。

图5 从93C46 读出的数据通过数码管显示

图5 从93C46 读出的数据通过数码管显示

看到这里,相信你现在已经可以完成一些数据存储方面的实验。

关键字:PIC单片机  SPI总线  串行外设接口 编辑:什么鱼 引用地址:http://news./mcu/ic487159.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机之数码管
下一篇:PIC单片机之RS232串口通信篇

  • 关注eeworld公众号
    快捷获取更多信息

  • 关注eeworld服务号
    享受更多官方福利

0

推荐阅读

PIC单片机之I2C通信(主模式)
(ACK)    当接收方接收完一个字节的数据就要告诉对方我收到了。接收方如果接收到数据则控制数据线输出低电平。否则为高电平。    5,停止     没有下一个字节要发送,最后时钟线变为高电平后,数据线从低电平变为高电平。代表数据发送停止。    实例讲解: 使用单片机使用 RSM2257 电子音量控制芯片来控制音量。一个按键按下,声音变大,一个按键按下,声音变小。在加上一个按键,控制一个LED亮灭的程序。而且音量掉电保存。    介绍RSM2257.    子地址 
发表于 2020-04-25
PIC单片机之I2C通信(主模式)
PIC单片机学习遇到的一些问题
1、中断优先级中断优先级的设置虽然能够比较合理的管理资源,但是如果在中断里写太多内容会导致另一个中断可能永远进不去的现象。比如在定时器中断里定20ms,但是中断里面处理的代码量太多超过20ms,则会出现另一个中断优先级低的刚等待定时器执行完要开始执行时,定时时间到了又进定时中断。如此循环低优先级的中断永远也进不去。(给低优先级中断IE位重新复位可以在短时间无视优先级执行,不过过一段时间也会出现上述情况。作者亲身试过的bug)2、AD采样出现波动大的问题有时程序出现AD采样的数值波动大往往是因为可能这时候的供电情况不同,可能你跟原先状态比关闭了什么开启了什么。如开关GPS、开关功放导致的。3、XC编译器与系统不兼容问题由于系统与编译器
发表于 2020-03-23
PIC单片机的学习——时钟的配置
一、概念Fcy是CPU时钟,Fosc晶振频率。Fcy = Fosc/2,也就是CPU时钟是晶振频率的1/2。二、寄存器的配置例子如下:    //系统时钟初始化 产生55.296M //11.0592M晶振    // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2    // Fosc= 11.0592M*60/(2*3)=110.592Mhz for 11.0592M input clock    // Fcy= Fosc/2 = 55.296MHZ     PLLFBD = 58;  &nbs
发表于 2020-03-23
PIC单片机软件平台----MPLAB IDE和MPLAB X IDE
这里主要是针对PIC18单片机开发平台,当然对于16位或32位单片机的开发平台是一样的,只是编译器不一样。PIC18单片机有两个开发平台,一个是MPLAB IDE,对应的编译器为MPLAB C Compiler for PIC18 MCUs.exe;一个是MPLAB X IDE,对应的编译器为xc8-v2.00-full-install-windows-installer.exe。下载链接如下:https://download.csdn.net/download/euxnijuoh/10889265
发表于 2020-03-17
PIC单片机输出比较(PWM)模块介绍
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。将输出比较模块配置为PWM 操作,需要以下步骤:1.将OCx输出配置为可用的外设引脚选择引脚之一。2.计算所需的占空比并将计算结果装入 OCxR 寄存器。3.计算所需的周期并将计算结果装入 OCxRS 寄存器。4.选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL<4:0>(OCxCON2<4:0>),把 0 写入OCTRIG (OCxCON2<7>)。5.通过写 O
发表于 2020-03-17
PIC单片机驱动LCD模块的设计
(Thevenin)等效电路进行模拟。对于VLCD3和VLCD0,戴维南电阻为0;如它不为0的两种情况,即对于VLCD2和VLCD1。电路可以简化为如下图所示的电路。RSW是段多路开关的电阻;RCOM是公共多路开关的电阻。对于戴维南电阻不为0的情况,戴维南电压等于2/3 VDD或1/3 VDD。戴维南电阻等于梯形电阻网络上部和下部的串联电阻,其估算电阻的等效电路见右图所示。例如.可以用RC电路来模拟单个像素的驱动器,在该电路中电压在0V~VLCD2之间切换。对于LCD和PIC单片机,可以估算段和公共开关电路的电阻分别大约为4.7kΩ和0.4kΩ。可以看到,经过像素的电压从0变为VTH的时间将取决于像素的电容和总电阻,而梯形电阻网络戴维南电阻
发表于 2020-03-11

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多