datasheet

arm底层通讯协议之SPI通讯

2019-07-11来源: eefocus关键字:arm  底层通讯协议  SPI通讯

1、基本概念区分


    (1)SPI和SSP区别


        可能很多人在其他的地方都多次到过SPI和SSP,比如爱NXP的LPC11XX系列的SOC手册中多次出现SSP,这里作统一区分:SSP(Synchronize Serial Port,同步串行口)和SPI(Serial Peripheral Interface,串行外设接口)。SSP是在SOC和一些串行外部设备通信的通信模块,他有两种工作模式:SPI和IIC。


    (2)SPI协议和代码关系


        我们在使用SPI接口进行数据通信的时候,之所以要了解SPI通信协议的原因是我们需要了解SPI通信协议原理。虽然实际硬件通讯硬件电路已经做好了,但是我们还是需要通过配置寄存器来实现SPI通讯时序,所以说还是要学会SPI通信原理的。


        了解SPI通信原理只是第一步,第二步是阅读硬件用户手册,根据手册指示编写配置寄存器代码,实现基本配置(时钟频率、数据帧格式、引脚功能等),第三步就是实际收发接口程序编写。


2、SPI硬件接口



    通过上图可以知道,首先SPI通信有4线:SCK(同步时钟信号)、MISO(主接收从发送)、MOSI(主发送从接收)、NSS(片选信号)。SPI通信最少3根线:SCK同步时钟、NSS(或者CS)片选信号、MISO或者MOSI。


    SCK:作为同步通信的时钟,指示什么时候开始/结束通讯,以及中间数据传输(主设备什么时候发送,从设备什么时候接收)。时钟由主设备发出,控制。


    MISO:SPI通信分为主设备(Master)和从设备(Slave),主设备intput,从设备output


    MOSI:主设备发送(output输出),从设备接收(intput输入)


    NSS:SPI通信分为一主多从,主设备要想从多个从设备中选中和哪个从设备通信,直接将和从设备连接的NSS引脚拉低即可。这个和IIC不一样,IIC直接发送从设备ID来选择从设备。


3、专业术语解释


    (1)空闲态


        指的是SPI总线上没有数据发送时候的状态。


    (2)时钟极性(CPOL)


        SCK时钟线,在SPI总线空闲时候,所处的电平状态(帧与帧之间的状态):


            CPOL = 0,SCK空闲时,主设备持续发送低电平


            CPOL = 1,SCK空闲时,主设备持续发送高电平


    (3)时钟相位(CPHA)


        时钟相位,实际指的就是发送和接受双方如何协调收发:


            CPHA = 0,无论收发方,在第一个边沿(上升沿还是下降沿看CPOL=0还是1)处采样(读取数据),在第二个边沿处发送数据


            CPHA = 1,在第二个边沿处(上升沿还是下降沿看CPOL=0还是1)处采样(读取数据),在第一个边沿处发送数据。


4、SPI通信协议


    SPI通信协议总结起来就是一句话,解决SPI通信问题:


    (1)数据发送高位在前还是低位在前:比如0x55(0101 0101),先发送第0位的1还是第7位的0?


        高位在前,先发送0(MSB),最后发送1(LSB)


    (2)怎么区分正在发送数据还是处在空闲,例如0xff(1111 1111):区分空闲和数据发送?


        在开始发送之前SCK处在空闲态(根据CPOL时钟极性设置规定,持续输出高电平(CPOL=1)或者低电平(CPOL=0)),开始发送时候,主设备会控制SCK发生变化(低电平转高电平,高电平转换低电平),知道数据发送完,SCK会继续回到空闲状态(持续输出高电平或者低电平)。


    (3)发送方什么时候发送?


        根据CPHA时钟相位设置,向数据线上放数据:CPHA=1,在第一个边沿处,向数据线上放数据(发送),CPHA=0,在第二个边沿处,向数据线上放数据(发送)


    (4)接收方什么时候接收?


        根据CPHA设置采样(读取数据):CPHA=1,在第二个边沿处,从数据线上采样(读取数据),CPHA=0,在第一个边沿处,从数据线上采样(读取数据)。


    (5)总结


        从上图可以看出SPI通信双方内部的基本结构,在主设备在发送的时候,从设备也在发送,只不过主设备发送的数据是我们(程序员)放进去的有效数据,但是从设备发送过来的数据确是不确定的(当然我们也可以自己指定垃圾数据,比如0xff或者0x00)。


        所以SPI通信的特点就是,发送方发送数据的时候,是将实现准备好的有效数据在CPHA规定的边沿发送出去的(比如MOSI上,主设备发送数据),同一时刻从设备也在CPHA规定的边沿发送数据(比如MISO上,从设备发送),然后在CPHA规定的采样边沿处,收发双方都会从MOSI或者MISO上去采样(读取数据)。总结起来就是一句话:发送方发送数据的同时,接收方也在发送数据,只不过发送方发的是实际有意义的数据,接收方发送的是无效垃圾数据(这是SPI通信方式所限定的)。


5、LPC11C14平台特点


    在开始在LPC11C14平台上编写SPI通信代码接口之前,将这几个问题搞明白就可以了:


    (1)既然SPI都是一位一位的传送的,那么我(程序员)发送或者接收的时候可是都以byte为单位的,怎么去界定已经发送完或者接收完一个byte?



        在LPC11C14的芯片手册中,可以知道,整个SPI的传输都是以8bit一个字节为单位的(一帧),当帧传输完成时,如果想要传输多个字节,在每个字节传输后,释放总线(还原SCK到空闲态,拉高NSS片选线),这样会将SPI标记寄存器中关于接受和发送标记置位。


    (2)发送和接受有没有FIFO?FIFO的大小是多少?


        LPC11C14上发送和接受的FIFO是公用一个的(环路收发),都是2字节(16bit)


    (3)发送和接受方式是轮训?还是中断?


        SPI的接收和发送均是轮训方式的,当然也可以设置成中断(SSP0IMSC寄存器,半满中断(FIFO收够1个字节)),建议不这么做,因为单个byte就产生一次中断,中断次数太频繁,容易打断CPU主程序执行


    (4)需要写几个接口?每个接口什么功能?


        需要至少2个接口:


            a、SPI初始化配置接口:void spi__0_config(void)


                完成相关引脚功能、时钟选择和分频、SPI通信帧格式、主从角色设置、时钟极性和时钟相位设置


/****************************************************

* 函数名称:spi_0_config

* 功能描述:配置SPI通讯接口:引脚功能、时钟频率、主从模式、数据帧格式

* 参数:无

* 返回值:无

*****************************************************/

void spi_0_config(void)

{

//1、spi引脚初始化:CLK-PIO0_6,MOSI0-PIO0_9,MISO-PIO0_8,C/S-PIO2_4

    LPC_IOCON->PIO0_9 &= ~(0x7<<0);

    LPC_IOCON->PIO0_9 |= (1<<0); //MOSI0

    LPC_IOCON->PIO0_8 &= ~(0x7<<0);

    LPC_IOCON->PIO0_8 |= (1<<0); //MISO0

    LPC_IOCON->PIO0_6 &= ~(0x7<<0);

    LPC_IOCON->PIO0_6 |= (2<<0); //SCK0

    

    //2、设置SCK0管脚时钟功能

    LPC_IOCON->SCK_LOC &= ~(0x3<<0);

    LPC_IOCON->SCK_LOC |= (2<<0);

    

    //3、设置SSP0总线时钟使能

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);

    

    //4、SPI时钟分频设置

    LPC_SYSCON->SSP0CLKDIV &= ~(0xff<<0);

    LPC_SYSCON->SSP0CLKDIV |= 2<<0;

    

    //5、关闭SSP0复位

    LPC_SYSCON->PRESETCTRL |= (1<<0);

    

    

    //6、使能GPIO时钟输出功能:SPI的SCK输出

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

    

    //7、设置SPI的偏选引脚为输出功能:PIO2_4

    LPC_IOCON->PIO2_4 &= ~(0x7<<0);

    LPC_GPIO2->DIR |= (1<<4); //设置PIO2_4引脚为输出功能

    LPC_GPIO2->DATA |= (1<<4); //设置PIO2_4引脚输出高电平(默认悬空不选中)

    

    

    //8、SPI通讯时钟选择、总线类型、数据长度设置

    LPC_SSP0->CR0 &= ~(0xf<<0);

    LPC_SSP0->CR0 |= (7<<0); //设置帧长度为8bit

    LPC_SSP0->CR0 &= ~(3<<4); //设置帧格式为SPI

    LPC_SSP0->CR0 &= ~(3<<6); //SPI时钟极性为低电平,在第一个边沿采样,第二个边沿输出

    

    LPC_SSP0->CR0 &= ~(0xf<<8);

    LPC_SSP0->CR0 |= (7<<8); //设置时钟分频因子7+1

    

    LPC_SSP0->CPSR = 2;//分频结果 = 48MHz/(2*(7+1)) = 3MHz

    

    //9、设置SPI通讯模式为主设备模式,使能SPI

    LPC_SSP0->CR1 &= ~(0xf<<0);

    LPC_SSP0->CR1 |= (1<<1);

}


b、spi收发接口:unsigned short spi_put_get(unsigned

[1] [2]

关键字:arm  底层通讯协议  SPI通讯

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

上一篇:DSP2808与ARM STM32F103的SPI通讯例程及详解
下一篇:STM32——SPI通信协议(W25Q128FLASH的通信)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

华为已在欧洲给鸿蒙OS提交了商标申请:Harmony

      据gsmarena消息,华为已向欧盟知识产权局(European Union Intellectual Property Office)提交商标申请,申请对象为华为移动和电脑操作系统鸿蒙OS,申请商标为“Harmony”,申请日期为2019年7月12日,目前正在审核中。而之前的“Ark”,将作为的华为公司操作系统“Harmony”在全球市场上的代号。  据华为董事长梁华表示,鸿蒙系统是为物联网开发的,用于自动驾驶、远程医疗等低时延场景。华为手机还是把开放的安卓系统和生态作为首选,如果美国不允许华为使用安卓,华为是否会把鸿蒙发展为手机系统,还没有确定。
发表于 2019-07-15

DSP2808与ARM STM32F103的SPI通讯例程及详解

本程序经验证可实现DSP和ARM的SPI通讯。 一、 SPI的通信协议 SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口一般由4根线组成,CS片选信号(有的单片机上也称为NSS),SCLK时钟信号线,MISO数据线(主机输入从机输出),MOSI数据线(主机输出从机输入),CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟信号来发起通讯。通讯时主机的数据由MISO输入,由MOSI 输出,输入的数据在时钟的上升或下降沿被采样
发表于 2019-07-11
DSP2808与ARM STM32F103的SPI通讯例程及详解

为确保万亿物联网安全,Arm正在下着一盘大棋

2017年10月,Arm针对物联网安全推出PSA(Platform Security Architecture)平台安全架构,以保护未来万亿个联网设备的安全为愿景。Arm 新兴事业部总监Rob Coombs近日在北京举行的Arm PSA安全架构技术研讨会上说道:“目前有全球有80亿的物联网设备,随着物联网产业的蓬勃发展, 3年之后,预计物联网设备会从到80亿达到240亿,在未来6年内,在芯片、软件以及产品设备领域,物联网都有一个非常大的商机。Arm认为随着物联网、5G还有AI技术的快速发展,全球第五波计算时代将迎来很大的机遇,Arm的愿景是在2035年实现1万亿个物联网设备。”Arm 新兴事业部总监Rob Coombs物联网安全
发表于 2019-07-11
为确保万亿物联网安全,Arm正在下着一盘大棋

Chirp:以Arm 为基础的技术将有助于发展

——翻译自embedded-computingChirp宣布支持Arm ®Cortex-A和基于Cortex-M体系结构,提高基于Arm®的任何具有音频功能的产品的设备到设备的连接。 Chirp的Arm SDK得益于Arm Cortex-M4和Cortex-M7处理器的DSP功能,设计了一种可靠的数据传输解决方案,无需占用大量资源,帮助连接和应用逻辑驻留在一个Arm 核心上。 SDK: 带有一个简单的API的静态库(大约740KiB),用于通过Chirp信号发送和接收数据; 使用其他层(包括加密、特定于应用程序的协议或端到端传输/QoS,如果需要的话可以放在SDK顶部)对数据超音OSI栈
发表于 2019-07-04

Arm联合亿咖通,于武汉成立一家专攻车规级SoC的公司

6月27日,武汉开发区举行重大项目集中签约活动,项目签约总额累计1350亿元,涵盖下一代汽车、新能源、创新创业等领域。武汉开发区管委会主任彭浩表示,10个重大项目的签约,将为武汉开发区推动产业转型升级,实现高质量发展增添强大动力。据武汉开发区官方消息,亿咖通科技有限公司、安谋科技中国有限公司在武汉开发区投资成立湖北芯擎科技有限公司,规划建设车规级芯片及通讯模组的研发、测试及生产基地。智瑞半导体有限公司在武汉开发区投资建设汽车模块生产线,预计2020年完成产线建设,2021年投入使用。天眼查显示,湖北芯擎科技有限公司(简称:芯擎科技)成立于2018年9月18日,股东包括亿咖通、Arm中国、安创及Oceanwi Holdings
发表于 2019-07-02

STM32学习笔记-SPI通讯

。其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。SCLK信号线只由主设备控制,从设备
发表于 2019-04-23
STM32学习笔记-SPI通讯

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved