怎样设计一个基于SPI汽车can总线工作原理技术的同步422接口

摘要: SPI是一种高速、全双工、同步的串行通信总线,本文对PIC18F452单片机SPI的结构、工作原理与工作模式进行了详细分析,并对单片机与单片机之间的双机SPI通信,和单片机之间的多机SPI通信进行了仿真设计。  

课程名称_电子技术综合设计与实训 题目名称 基于 VHDL 的串行同步通信 SPI 设计 学生学院_ 自动化____________

广东工业大学课程设计任务书

题目名称 学生学院 专业班级 姓 学 名 号

基于 VHDL 的串行同步通信 SPI 设计 自动化 电子信息科学与技术 陈振添


设计一个同步串行通讯 SPI

二、课程设计的要求与数据


设计要求包括: 1.深入了解串行通信的方案内容和协议,思考设计方法。 2.设计串行通信方案,并写好传输程序 VHDL。 3.下载到 DE2 板调试,检测其可行性。

三、课程设计应完成的工作


1. 利用 VHDL 语言编程实现 SPI; 2. 利用 DE2 板对所设计的思想进行验证; 3. 总结 VHDL 设计结果,撰写课程设计报告。

五、应收集的资料及主要参考文献


[1] PIC 单片机原理及应用(第 3 版) 北京航天航空大学出版社 [2] 黄智伟,王彦?FPGA 系统设计与实践[M]?北京:电子工业出版社,2005

计划完成日期: 主管院长签章:

基层教学单位责任人签章:

本设计是用 Quartus 作为开发环境,以 DE2 板为硬件平台实现的 SPI 同步串行通讯。设 计过程方便。根据接收和发送两个主要部分实现了 SPI 的基本功能。此外,该设计还实 现了波特率发生器,数码管显示的功能。用 DE2 板实现具有电路简洁,开发周期短的优 点。充分利用了 EDA 设计的优点。开发过程用了 VHDL 硬件描述语言进行描述,从底层设 计,分模块进行,充分提高了设计者的数字逻辑设计的概念。

关键词:SPI,同步串行通讯,Quartus,DE2 板,VHDL 硬件描述语言。


串行扩展通信接口是器件间进行数据交换的平台和重要渠道。主控同步串 行通信模块主要应用于系统内部近距离的串行通讯,如 SPI,I^C 等。SPI 是 英文 Serial Peripheral Interface 的缩写, 中文意思是串行外围设备接口, SPI 是 Motorola 公司推出的一种同步串行通讯方式,是一种三线同步总线, 因其硬件功能很强, 与 SPI 有关的软件就相当简单,使 CPU 有更多的时间处 理其他事务。
顾名思义,串行接口的数据传输方式是串行的,即数据是一位一位地进行传输 虽然串行接 口的传输方式导致其传输速度会比较慢, 但是它却具有较强的抗干扰能力, 并能有较长的传 输距离,RS232 口的最大传输距离为 15m。 SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和 数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚 上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出 于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如 AT91RM9200. SPI 的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设 备,需要至少 4 根线,事实上 3 根也可以(单向传输时) 。也是所有基于 SPI 的设备共有的, 它们是 SDI(数据输入) ,SDO(数据输出) ,SCK(时钟) ,CS(片选) 。 (1)SDO - 主设备数据输出,从设备数据输入 (2)SDI - 主设备数据输入,从设备数据输出 (3)SCLK - 时钟信号,由主设备产生 (4)CS - 从设备使能信号,由主设备控制 其中 CS 是控制芯片是否被选中的, 也就是说只有片选信号为预先规定的使能信号时 (高 电位或低电位) ,对此芯片的操作才有效。这就允许在同一总线上连接多个 SPI 设备成为可 能。 接下来就负责通讯的 3 根线了。通讯是通过数据交换完成的, 这里先要知道 SPI 是串行 通讯协议,也就是说数据是一位一位的传输的。这就是 SCK 时钟线存在的原因,由 SCK 提 供时钟脉冲,SDI,SDO 则基于此脉冲完成数据传输。数据输出通过 SDO 线,数据在时钟 上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使 用同样原理。这样,在至少 8 次时钟信号的改变(上沿和下沿为一次) ,就可以完成 8 位数 据的传输。 SPI 是一个环形总线结构,由 ss(cs) 、sck、sdi、sdo 构成,其时序其实很简单,主要是 在 sck 的控制下,两个双向移位寄存器进行数据交换。 假设下面的 8 位寄存器装的是待发送的数据 ,上升沿发送、下降沿接收、高

位先发送。 那么第一个上升沿来的时候 数据将会是 sdo=1;寄存器中的 左移一位,后面 补入送来的一位未知数 x,成了 0101010x。下降沿到来的时候,sdi 上的电平将锁存到寄存 器中去,那么这时寄存器=0101010sdi,这样在 8 个时钟脉冲以后,两个寄存器的内容互相 交换一次。这样就完成里一个 spi 时序。


这是一个衡量通信速度的参数。它表示每秒钟传送的 bit 的个数。例如 300 波特表示每 秒钟发送 300 个 bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要 4800 波 特率,那么时钟是 4800Hz。这意味着串口通信在数据线上的采样率为 4800Hz。通常电话线 的波特率为 14400,28800 和 36600。波特率可以远远大于这些值,但是波特率和距离成反 比。 串行 口每秒发送或接收数据的码元数为传码 ,单位为波特,也叫波特率。若发送或接 收一位数据所需时间为 T, 则波特率为 1 / T, 相应的发送 或接收时钟为 1 / T Hz 。 发送和接收设备的波特率应 一致。 位 同步是实现收发双方的码元同步, 由数据传输系统的 同步控制电路实现。发送端由发送时钟 的定时脉冲对数据序列取样再生,接收端由接收时 钟的定时脉冲对接收数据序列取样判断,恢复原来 的数据序列。因此,接收时钟和发送时 钟必须同频 同相,这是由接收端的定时提取和锁相环 电路实现 的。传码率与位同步必须 同时满足 。否则,接收设备接收不到有效信息。
顶层文件设计,将波特率发生模块,数据发送模块,数据接收模块,和数码显示模块通 过例化语句组合成总的顶层模块。 其中数据发送模块为并行输入串行输出模块, 在时钟的上 升沿发送一位数据, 共需要 8 个时钟脉冲即可发送完一字节数据。 数据接收模块为串行输入 并行输出模块,串行输入的数据来自数据发送模块,在时钟的上升沿接收数据,即由“自己 发送的数据自己同步接收”

3.2 波特率发生器模块


由于 SPI 同步串行通讯的缺点是波特率不高,通常常用的 SPI 波特率有 2400,4800, 9600, 19200 等比较低的波特率, 晶振的频率一般都比较高, 需要分频后才能供给 SPI 使用。 假设采用 6MHZ 的晶振作为外部时钟, 那么要产生 9600 波特率的时钟信号, 则需要对 6MHZ 的时钟进行 625 分频。除此之外,为了提高接收电路接收数据的准确度,采取“过采样法”

0); 为并行输入端 口 8 位数据,clk_sdo 为输入 端口发送时钟;sdo_out : out std_logic 为输出串行端口;当 load=‘1’ ,则把待发送的数据 送入数据缓冲区 BUFF,然后根据时钟的上升沿的到来把数据一位一位的从缓冲器送给串行 输出。如图所示,第一次装载待发送数据 ,第二次装载待发送数据 于缓 冲区,共 2 字节数据,从仿真图上可以看到,串行输出分贝输出了 2 字节数据:, 和

if; end if; shuma <= cout; end process; end one ; 数据一位一位的接收, 接收一位就把它存放于接收缓冲寄存器, 等待缓冲器满后就并行输出 数据由程序读取。如仿真图所示,串行传来的两字节数据 和 ,数码管循 环显示从 0~8,当显示 8 时代表缓冲器满,并串行输出数据,SDI_OUT 为串行输出的数据。

3.5 数码管显示模块

4.1 实验验证方案选择


由于要在 DE2 板上验证 SPI 有一定难度。
就是利用串口调试助手,PC 机作为从器件,目标板做为主器件进行 SPI 通讯。
是完全在 DE2 板上模拟主从同步串行通讯, 但是由于考虑到 DE2 板上可以用的验证设备 (开 关和 LED 灯)不够,所以我们决定在 DE2 版上对所设计的 SPI 模块进行调整,自己发送的 数据自己接收,模拟实现了主从之间通过不串行通讯。 在这里我们采用的是方案 2,优点是易于实现。我们把 SDO 发送数据模块直接接到了 SDI 数据接收模块,因此我们只要验证:通过发送以自己数据,待 8 个时序脉冲后数据发送完的 同时也被接收,则说明我们的思路正确。
说明:开关 SW8 代表 LOAD 数据装载。 开关 SW9 代表时钟时能 SW0~SW7 作为发送数据的数据缓冲器,即发送模块数据输入端,存待发送的数据。 LED0~LED7 读取数据接收模块的数据接收状态。 数码管循环显示 0~8. 当我们拨动开关,准备好待发送数据时,先 LOAD 把数据送入缓冲区,然后使时钟时能, 这是开始发送和接收数据同步。数码管从 0~8 显示,当数码管显示 8 时,灯的状态与开关的 状态相对应,灯亮代表数据位 1,灯灭为 0.然后我们准备第二字节数据。发送和接收数据区 间如果取消时钟时能则可以使数据暂停传输。

5.1 完成设计要求的程度


本设计在完成了基本部分外, 还实现了轮流显示每字节数据的传输情况情况的功能。 完 成了这次设计的任务。

5.2 遇到的问题及解决方法


遇到的问题有数据收发不同步,数据收发不准确,不知道如何验证正确性等问题。 对于数据收发不同步, 我们采取了使用同频同相的时钟信号, 同在时钟的上升沿接收和 发送数据。 对于数据收发不准确,我们经过老师的点拨,采取 OVERSAMPLING 的方法,即过采 样的技术,对发送来的数据进行多次采样取其平均值的方法解决了该问题。

5.3 存在的不足及改进思路


1,因为验证环境有限,对于该模块的数据准确度还有待验证。 改进思路:对于该模块编写一个专门验证的程序,即特色的编辑,以验证 其正确性。
这次实验对比上学期的实验有了很大的进步, 这跟知识的积累和练习是分不 开的。 这个设计我采用比较正规的方式,在确定方案前,先去查找相关的 资料,从懵懵懂懂的 SPI 到精确掌握其中的协议规则。 查找到了模块化设 计的方法。确定了从上到下的设计方式。规划好各个模块及输入输出端后, 就开始了各个模块 VHDL 源程序编写。最综合处了整个系统。在这次设计中 我积极的向同学,老师请教,比如波特率问题,过采样问题,数据收发不同 步问题,验证问题,特色编辑问题等,避免走了弯路。整个流程下来真的锻 炼了我们独立设计的能力和团队协作的能力。最终看到了预想中的结果。这 是确实令人高兴的。 当然这次设计还存在些不足,就是仿真方面有点问题没 有解决就在硬件上验证和修改了。相对来说,在硬件上验证比较直观的找出 问题所在。还需在软件平台上编写特色的编辑,验证其真正的正确性。这些 都得在以后的学习工作中注意。

我要回帖

更多关于 汽车can总线工作原理 的文章

 

随机推荐