本帖最后由 okwh 于 2016-2-18 12:04 编辑
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (四、筑基) 25_okwh@https://www.cirmall.com/gd32f2mcu 2015.01.22 一、 筑基 本方案核心是SPI通讯,在开始之前,先要复习准备相关的背景知识。我们知道,就我们普通人(遇不到DDR内存/FPGA/DSP等,通常以通用通讯和控制为主)来说,早期PC的通用接口主要是ISA/UART/并口,嵌入单片机的接口主要是并行总线和UART,51单片机甚至有广为普及的并口总线IO扩展8255和计数器扩展8254这样的独立模块。后来数十年过去,PC现在已演化为PCI系列、USB、SATA为主(工控还有GPIB等),而嵌入单片机中的ARM逐渐变得普及,而接口则是种类繁多、各有千秋,其中SPI普及率似乎略高于其他如UART、USB、CAN、I2C等。所以学习单片机,第一学习数字输入输出DIO(就是那每个人都从那里开始的闪闪LED灯),然后我以为就是SPI了,随后就是UART和USB,再然后选学个自己需要的并行总线、某种有线无线网络通讯就差不多可以对付实用了。 其实所有接口,所有的复杂只是当时历史条件下制定的协议规则及其变种,硬件工作原理基本都不难理解。一切都是二进制数字信号在时空的排列(即时序图),我们只要看明白了时序图,就可以理解一切。复杂通讯一般都已经有库可用。当然如果调试硬件,还是要了解时序图才能正确判断,略高级点的示波器和逻辑分析仪甚至已经准备好了软件能完成半自动分析方便查错。 这里我就从SPI开始。 SPI是什么? 听起来似乎是个白痴问题,可不幸似我等非科班出身者或是自学者只好从白痴开始(想想自己面对下列名词一筹莫展、头皮发麻的时候,地址、寻址、片选、数据、时钟、输入输出、映射(端口、内存)、传输,上拉、下拉、推挽、三态、高阻、开路,上升、下降、脉冲、触发,位寻址、位屏蔽、休眠、自旋锁、0值电阻、使能……,唯一的快乐就是我是给自己学的,不用被考试,呵呵)。(专业人员请飘过!!!) 先复习下DIO,如果要让一个管脚为高或低,就是给代表它的符号(通常是称作端口的某位,其实就是个类似门牌编号的地址编号,C语言中叫指针,如果够机灵,明白了这个,连C语言中令人头疼的指针都会恍然大悟的)赋值,即写1或0,如果想要知道一个管脚是高或低,就是用代表它的符号给我们要记录的变量赋值,即读(可能是1或0)。这就是通常说的IO/DIO/GPIO/管脚读写/端口位读写。如果我们要同时读写多个位(相邻或不相邻),就要进行端口读写(可能还要进行逻辑操作)。这是我们不怎么关注时间、时刻、时机时永恒的第一练习---点亮熄灭LED就是练习这个的。 那么更复杂的呢,就是需要多根线多个管脚配合工作,它们上面的信号0或1以指定的排列方式以特定需要的时间顺序流过,就完成了某项指定的工作(通常就是某种通讯,当然CPU也是这样工作的),对这个东东的系统完善的说明就是所谓的通讯协议。犹如打电话,一个起始发起(拨号),然后一个喂一个回喂---即握手,然后就是以双方能听懂的语言(二进制)一来一往的听说――即读写! 电子线路其实也是这么做的,只是更简单、更精确、更确定、不得模糊不清模棱两可。其实今天的计算机也是把人类很多事情简化后的表达。 所以通常,通讯的对应关系就是: 拨号、握手―――片选,(复杂的需要在低速下协商通讯规则) 双方能听懂的语言―――0和1的排列组合规则和序列内容(大端小端高低字节序等) 读写―――WR/RD/SCLK等线控制读写许可(或和方向) 其实所有的通讯都是这样!它们合称 总线。 SPI不过是其中简单的一种而已。 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的通信总线,工作原理:四线:NCS(NSS/SS/CS…)片选、SCLK(CLK)时钟、MISO (SDI)输入、MOSI(SDO)输出, (1)MOSI – 主设备数据输出,从设备数据输入
(2)MISO – 主设备数据输入,从设备数据输出
(3)SCLK – 时钟信号,由主设备产生
(4)CS – 即片选,从设备使能信号,一线对应一个设备,由主设备控制
任一数字信号线可提供四种基本特征:高电平high level、低电平low level、上升沿up edge、下降沿down edge。 SPI的SCK线提供时钟脉冲,就用这四种特征确保双方读写步调的(四种特征可组合出四种SPI传输模式,下图),其两种跳变沿分别用于触发发送方开始设置、触发接收方开始接收,在对应两种电平持续期间相应的MOSI和MISO线上。两方可以对应在同一条线上一个发送另一个接收,单方在两条线上分别发送和接收,在同一条线上,发送方进行设置和保持两个动作、接收方对应进行等待和接收两个动作。于是每一时钟周期,一个方向可完成一位数据的传输。 四种SPI传输模式取决于两种沿两种电平的用途组合(如下图),即时钟极性(clock polarity,CPOL)与 时钟相位(clock phase,CPHA),简单理解就是不通讯时CLK线状态(空闲或设置时写时CLK线状态)是低还是高 (对应CPOL=0/1,图中时钟开始始前状态) 与 触发读的跳变沿是离开此空闲状态 还是变为此空闲状态 (或称采样、捕获,对应CPHA=0/1, 也被称为首跳变采样、次跳变采样,即图上红线所示跳变沿,黑线所示跳变沿为触发写)。可以看出模式0和3其实是一样的,模式1和2其实是一样的,只是CLK空闲态不同。
SPI使用的关键就是配置时钟和模式。SPI的工作时序图就不复制了,到处都有了。 SPI可算是点对点同步全双工总线(如下图),可以配置成单主单从,分时工作时可配置为单主多从、互为主从。在此基础上,SPI其实有多种变种,可以以十分灵活的方式使用。最少可只使用SCLK和MOSI两线(如MOSI可单向使用),最多则是可增加MOSI线进行同时多位高速传输(如GD32就提供的SPI四路模式,常用于SD卡的QSPI)。 当然,MPU端的SPI基本是可以满足一切SPI要求,使用十分灵活,可以是硬件实现的(只需软件读写缓冲区,象UART串口类似),也可以用纯软件通过几根DIO线实现(因为SPI以跳变沿触发为核心,时钟周期要求并不严格,通常设备方主要有时钟周期上限要求和模式要求)。
缺点:没有指定的流控制,没有应答机制确认是否接收到数据。当然这些机制可以通过软件自行处理控制实现。
GD32 Colibri-F207ZE 配备了三个单主单从的SPI,
1个四线QSPI
至此,准备完毕,下篇正式开始调试工作。
题外话:如果对比SPI(SDIO)、USB、SATA,也是一件有意思的事情,可以感受为什么这三个成了现在使用最广的三种通讯接口。 其实就是用时钟替代了原来WR/RD线的作用,用串行传送。
本系列:
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (一、邂逅)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (二、初识)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (三、定计)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (四、筑基)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (五、曙光)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (六、揭秘)
兆易创新GD32 Colibri-F207ZE评估板体验纪实 (七、回眸) |