SPI控制器及通信方法
【技术领域】
本发明涉及串行通信技术,尤其涉及一种改进型的SPI控制器及基于该SPI控制器的通信方法。
【背景技术】
SPI(Serial Peripheral Interface,串行外围设备接口)最早由Motorola公司提出的一种全双工、同步串行传输总线,主要用于微控制器和外围设备之间的通信,以及用于微处理器和微处理器之间的通信。具有电路结构简单、传输速度快、通信可靠等优点。
SPI总线包括4根信号线:SS(Slave Select,从机选择),SCLK(SPI Clock,SPI传输时钟),MOSI(Master Output Slave Input,主机输出从机输入)和MISO(Master Input Slave Output,主机输入从机输出)。其中,SS由SPI主机输出,用于SPI主机选择SPI从机,低电平有效,即当SS输入为低时,SPI从机与SPI主机进行通信;SCLK是SPI主机输出的用于同步MOSI和MISO的时钟;MOSI是主机输出给从机的数据线;MISO是从机输出给主机的数据线。SPI总线的连接关系如图1所示。
SPI控制器控制SS的方法,如图2所示,具体为:
(1)、当被配置为从机时:SS管脚配置为SPI专用SS功能,作为输入连接到外面的SPI主机的SS输出,只用当SS输入为低时,SPI控制器才能和外面的SPI主机进行通信;
(2)、当被配置为主机时:
(2a)、如果为单SPI主机系统,不需检测MODF(Mode Fault,模式错误)即多个SPI主机同时操作SPI总线,CPU(Central Processing Unit,中央处理单元)配置SPI控制器不使能MODF,SS作为输出连接到外部的SPI从机,此时SS输出通过CPU控制GPIO(Generic Purpose Input Output,通用输入输出)来实现,即SS管脚配置为GPIO功能,GPIO配置为输出状态,输出电平由CPU控制;此种情况下需软件控制以模拟SS输出;
(2b)、如果为多SPI主机系统,需检测MODF,CPU配置SPI控制器使能MODF,SS管脚配置为SPI专用SS功能作为输入,SPI控制器检测SS输入:当SS输入为低,说明有其他的SPI主机正在操作SPI总线,SPI控制器需硬件自动配置为从机,并向CPU报告MODF;相反,当SS输入为高,说明没有其他的SPI主机在操作SPI总线,SPI控制器工作在主机模式,CPU配置SPI控制器不使能MODF,SS作为输出连接到外部的SPI从机,SS输出控制通过CPU控制GPIO来实现,并需软件控制以模拟SS输出。
如图3所示,SPI控制器接收数据缓存器工作原理:初始接收数据缓存器未存储数据,为空状态,将写入的数据依次存储到相应的位置,当存储N个数据后,假设接收数据缓存器最大容量为N,接收数据缓存器中存满数据,为满状态,此时没有空间存储新的数据。如果SPI控制器接收新的数据并写入接收数据缓存器,由于接收数据缓存器中的数据不会改变,新的数据将不会成功写入到接收数据缓存器中;只有将接收数据缓存器里面的数据读走,接收数据缓存器才有空间存储新的数据,新的数据才能成功写入到接收数据缓存器。
从上述分析中可以看到,SPI控制器存在如下两个不足:
1、当SPI控制器配置为主机时,SS输出不由SPI控制器直接控制,通过CPU(Central Processing Unit,中央处理单元)控制GPIO(Generic Purpose InputOutput,通用输入输出)来实现,需要软件控制来模拟SS输出。该方法通过CPU来控制GPIO来模拟SS输出,需要软件设计人员通过软件来控制,虽提供了一定的设计灵活性,但软件设计人员需要准确地用软件控制来模拟SS输出以满足SPI传输时序要求,增加了软件人员的负担;同时,软件控制需要额外占用CPU资源,增加了CPU的工作负荷。
2、SPI控制器中的接收数据缓存器存满数据后,里面的数据须要及时被读走,否则接收数据缓存器将不能接收新的数据。即,当SPI控制器被配置为主机:SPI控制器对外围器件内部的控制寄存器进行写操作,SPI控制器输出有用的写数据到SPI从机,而此时SPI从机输出给SPI控制器的数据没有实际用途,SPI控制器也不关心这些数据,但当SPI控制器对SPI从机进行读操作时,SPI从机输出的有用数据需要写入接收数据缓存器,接收数据缓存器里面的数据必须要及时被读走;同理,当SPI控制器被配置为从机时:外部的SPI主机对SPI控制器进行读操作时,SPI控制器输出有用的数据到SPI主机,而此时SPI主机输出给SPI控制器的数据也没有实际用途,SPI控制器也不关心这些数据,但当外部SPI主机对SPI控制器进行写操作时,SPI主机输出的有用数据需要写入接收数据缓存器,接收数据缓存器里面的数据也必须及时被读走。
目前SPI控制器配置为主机时进行SPI传输的软件操作流程如下:
1)、CPU配置SPI控制器为主机,如果需要检测MODF(多SPI主机系统),CPU配置SPI控制器使能MODF,SPI控制器将SS管脚配置为SPI专用SS功能作为输入,并检测SS输入:当SS为低,此时有其他的SPI主机正在操作SPI总线,SPI控制器需要硬件自动配置为SPI从机,并向CPU报告MODF;当SS为高,此时没有其他的SPI主机在操作SPI总线,则SPI控制器可以工作在主机模式,之后CPU配置SPI控制器不使能MODF;如果是单SPI主机系统,则跳过前述的MODF检测过程,CPU配置SPI控制器为主机并且不使能MODF;
2)、CPU写操作波特率寄存器配置SCLK波特率参数;
3)、CPU写操作控制寄存器配置SPI传输参数;
4)、CPU配置SS管脚为GPIO功能,将GPIO配置为输出状态(软件操作控制);
5)、CPU控制GPIO输出低电平选择从机准备开始SPI传输(软件操作控制);
6)、CPU将需要发送的数据写入SPI控制器中的发送数据缓存器,该写操作将启动SPI传输;
7)、如果CPHA=0则执行步骤8),否则,如果CPHA=1则执行步骤10);
8)、每传输完一个数据后,将模拟SS输出的GPIO拉高(高电平),如果SPI控制器中的发送数据缓存器中还有数据要传输,则延时一段时间后(SS高电平保持时间)将模拟SS输出的GPIO拉低(低电平),开始下一个数据传输,以此类推,直到传输完发送数据缓存器里面的数据;等待传输完成后,CPU读取接收数据缓存器中的数据,如果需要继续传输则执行步骤5),开始下一次传输,否则传输完成;其中模拟SS输出的GPIO拉高时间、延时时间和拉低时间需软件人员控制以满足SPI传输时序要求(软件操作控制);
9)、等待发送数据缓存器里面的所有数据传输完成后,CPU读取接收数据缓存器中的数据,如果需要继续传输则执行步骤5),开始下一次传输,否则将模拟SS输出的GPIO拉高,完成传输(软件操作控制)。
因此,不管SPI控制器被配置为主机还是从机,接收数据缓存器存满数据后,不管接收到的数据有无实际用途,接收数据缓存器中的数据都必须及时被读走,否则接下来的数据就不能写进接收数据缓存器,大大增加了软件开销、以及对CPU资源的占用,同时,增加了软件设计人员的负担。
【发明内容】
本发明要解决的技术问题在于减少CPU操作SPI控制器时所需的软件控制,从而提高CPU的使用率。
为此,本发明一方面提供一种SPI控制器,包括内部总线接口模块,用于经内部总线实现CPU操作SPI控制器、寄存器模块,接收通过内部总线接口模块传输的CPU对SPI控制器的配置、数据转换模块,用于输出数据并串转换和输入数据串并转换、状态与中断控制模块,用于报告SPI控制器的状态和产生中断,还包括有限状态机,用于根据寄存器模块中控制寄存器寄存的SPI传输参数和波特率寄存器寄存的SCLK波特率参数产生SS和SCLK输出;发送和接收数据缓存器,分别用于缓存待传输和接收到的数据;所述有限状态机包括空闲、开始、传输和结束四个状态。
进一步地,所述SPI控制器还包括发送数据缓存器和接收数据缓存器,所述接收数据缓存器用于缓存SPI控制器接收到的数据;所述接收数据缓存器,进行如下控制:接收数据缓存器中数据存满后,当有新数据写入接收数据缓存器时,最先写入的数据被最先写入的数据之后的数据覆盖,依次类推,最后写入的数据之前的数据被最后写入的数据覆盖,进而形成一数据空间存储写入的新数据。
进一步地,所述数据转换模块包括输出数据并串转换单元和输入数据串并转换单元,所述输出数据并串转换单元用于读取发送数据缓存器中的并行数据后进行并串转换后输出,其中,当SPI控制器被配置为主机时,输出至MOSI信号线;反之,当SPI控制器被配置为从机时,输出至MISO信号线;所述输入数据串并转换单元用于将输入串行数据进行串并转换后写入接收数据缓存器,其中,当SPI控制器被配置为主机时,输入为MISO信号线;反之,当SPI控制器被配置为从机时,输入为MOSI信号线。
进一步地,所述寄存器模块包括控制寄存器和波特率寄存器,所述控制寄存器用于接收并寄存CPU配置SPI传输参数;所述波特率寄存器用于接收并寄存CPU配置SCLK时钟波特率参数。
进一步地,所述传输参数包括SPIE(SPI Enable,SPI使能)、MSS(MasterSlave Select,主从选择,其中‘1’为主、‘0’为从)、CPHA、CPOL、MODFEN和DataSize。
进一步地,所述CPHA和CPOL传输参数,支持8位、16位或32位的数据传输、最高位先传输或者最低位先传输。
本发明另一方面还提供一种SPI控制器的通信方法,包括,
S1、系统复位,有限状态机处于空闲状态,SS输出高电平,SCLK输出即CPOL;
S2、CPU配置SPI控制器为主机,不使能MODF,使能SPI控制器,SPI控制器为主机并等待SPI传输;
S3、CPU将待传输的数据写入发送数据缓存器,写操作将启动SPI传输;
S4、有限状态机保持空闲状态,当检测到递增计数器计数为ClockNumber/2-1,有限状态机进入开始状态,并将SS输出低电平开始SPI传输;
S5、有限状态机保持开始状态,当递增计数器计数到ClockNumber/2-1时SCLK输出翻转,同时SS输出低电平;
S6、有限状态机处于传输状态直至数据传输结束,进入结束状态;
进一步地,还包括,
S7、有限状态机保持在结束状态到递增计数器计数到ClockNumber/2-1,之后有限状态机进行状态转换:
S8、当CPHA=0,有限状态机进入空闲状态,同时SS输出高电平并结束当前SPI传输、等待下次SPI传输;
S9、当CPHA=0,如果发送数据缓存器中仍存有数据,有限状态机进入传输状态,同时保持SS输出低电平开始下次SPI传输;反之,如果发送数据缓存器中无数据,有限状态机进入空闲状态,同时SS输出高电平并结束当前SPI传输、等待下次SPI传输。其中,步骤S1-S9为有限状态机的工作流程。
进一步地,所述SPI传输为:
S10、CPU配置SPI控制器为主机,并判断SPI主机系统类型;
S11、当为多SPI主机系统,检测MODF,CPU配置SPI控制器使能MODF,SPI控制器配置SS为输入并检测SS输入电平:SS为低,有其他的SPI主机操作SPI总线,此时SPI控制器硬件自动配置为从机,并向CPU报告MODF;SS为高,没有其他的SPI主机操作SPI总线,SPI控制器可以配置为主机并开始SPI传输,CPU配置SPI控制器不使能MODF,SPI控制器配置SS为输出,准备SPI传输;
当为单SPI主机系统,CPU配置不使能MODF,SPI控制器配置SS为输出,准备SPI传输;
S12、CPU写操作波特率寄存器配置SCLK波特率参数;
S13、CPU写操作控制寄存器配置SPI传输参数;
S14、CPU将待传输的数据写入发送数据缓存器;数据转换模块将发送数据缓存器中的数据读出进行并串转换后输出至MOSI,同时将输入MISO进行串并转换后写入到接收数据缓存器;
S15、持续SPI控制器数据传输;
S16、当发送数据缓存器中还有数据,需继续传输执行步骤S14,并开始下次传输,否则传输结束。
进一步地,S17、CPU读取接收数据缓存器里面接收到的数据。
本发明提供的改进型SPI控制器,1)当被配置为主机时,SS输出完全由SPI控制器硬件自动控制,无需软件控制模拟SS输出,2)接收数据缓存器中数据的读取是可选的,减少了不必要的CPU读取接收数据缓存器操作,这两点大大减少CPU操作SPI控制器时所需的软件控制,从而提高CPU的使用率。
【附图说明】
图1示出现有技术的SPI总线的连接示意图。
图2示出现有技术的SPI控制器控制SS的示意图。
图3示出现有技术的SPI控制器接收缓存控制器的工作原理图。
图4示出本发明的SPI控制器的结构框架图。
图5示出本发明的SPI控制器控制SS的示意图。
图6示出本发明的SPI控制器的有限状态机的转换图。
图7示出本发明的SPI控制器接收缓存控制器的工作原理图。
图8示出本发明的CPHA=0时的SPI传输时序图。
图9示出本发明的CPHA=1时的SPI传输时序图。
【具体实施方式】
下面结合附图和具体实施例对本发明作进一步详细说明。
本发明提供一种SPI控制器,如图4所示,包括内部总线接口模块,用于经内部总线实现CPU操作SPI控制器、寄存器模块,接收通过内部总线接口模块传输的CPU对SPI控制器的配置、数据转换模块,用于输出数据并串转换和输入数据串并转换、状态与中断控制模块,用于报告SPI控制器的状态和产生中断,其特征在于,还包括有限状态机,用于根据寄存器模块中控制寄存器寄存的SPI传输参数和波特率寄存器寄存的SCLK波特率参数产生SS和SCLK输出;发送和接收数据缓存器,分别用于缓存待传输和接收到的数据;上述有限状态机包括空闲、开始、传输和结束四个状态。
如图5所示,为SPI控制器的SS端连接示意图,CPU1通过内部总线2与SPI控制器3连接,SPI控制器控制SS工作原理如下:
1)、当CPU配置SPI控制器为从机时:SPI控制器硬件自动配置SS管脚为输入,并连接到外部的SPI主机的SS输出,此状态下只有当SS输入为低时,SPI控制器才与外部的SPI主机进行通信;
2)、当CPU配置SPI控制器为主机时:
a)、当为单SPI主机系统,不需检测MODF(Mode Fault,模式错误:即多个SPI主机同时操作SPI总线),CPU配置SPI控制器不使能MODF,即MODFEN=0),SPI控制器硬件自动配置SS管脚为输出,SS输出电平由SPI控制器根据SPI传输参数硬件控制,上述传输参数如CPHA(Clock Phase,时钟相位)和CPOL(Clock Polarity,时钟极性);
b)、当为多SPI主机系统,需检测MODF,CPU配置SPI控制器使能MODF即MODFEN=1,SPI控制器硬件自动配置SS管脚为输入,SPI控制器检测SS输入:如果SS输入为低电平,则有其他的SPI主机正在操作SPI总线,SPI控制器硬件自动配置为从机,并向CPU报告MODF;相反,如果SS输入为高,则没有其他的SPI主机在操作SPI总线,SPI控制器可以工作在主机模式,之后CPU配置SPI控制器不使能MODF,即MODFEN=0,SPI控制器硬件自动配置SS管脚为输出,SS输出电平由SPI控制器根据SPI传输参数硬件控制,上述传输参数如CPHA和CPOL。
如图6所示,为有限状态机的转换图,上述有限状态机包括空闲、开始、传输和结束四个状态。
本发明提供的改进型SPI控制器,1)当被配置为主机时,SS输出完全由SPI控制器硬件自动控制,无需软件控制模拟SS输出,2)接收数据缓存器中数据的读取是可选的,减少了不必要的CPU读取接收数据缓存器操作,减少CPU操作SPI控制器时所需的软件控制,从而提高CPU的使用率。
进一步地,上述SPI控制器还包括发送数据缓存器和接收数据缓存器,上述接收数据缓存器用于缓存SPI控制器接收到的数据;上述接收数据缓存器,进行如下控制:接收数据缓存器中数据存满后,当有新数据写入接收数据缓存器时,最先写入的数据被最先写入的数据之后的数据覆盖,依次类推,最后写入的数据之前的数据被最后写入的数据覆盖,进而形成一数据空间存储写入的新数据。
如图7所示,本发明SPI控制器接收数据缓存器工作原理为,初始接收数据缓存器中没有数据,为空状态,之后将写入的数据依次存储到相应的位置,假设接收数据缓存器最大容量为N,则当存储N个数据后,接收数据缓存器中即存满了数据,为满状态。若SPI控制器接收新的数据并写入接收数据缓存器,此时,数据1会覆盖最先写入的数据0,同理,数据2覆盖数据1,依次类推,数据N覆盖数据N-1,这样将在地址N上产生一空间可用于存储写入的新数据。因此,即保证先进先出,又在存满数据后,将新的数据写入并覆盖之前写入的数据。
本发明提供的改进型SPI控制器,接收数据缓存器中数据的读取是可选的:如果有实际用途,则读走,否则可以不进行读操作,这样后续接收到的数据会自动覆盖掉接收数据缓存器中已经写入的数据,减少了不必要的CPU读取接收数据缓存器操作,同时减少CPU操作SPI控制器时所需的软件控制,从而提高CPU的使用率。
进一步地,上述数据转换模块包括输出数据并串转换单元和输入数据串并转换单元,上述输出数据并串转换单元用于读取发送数据缓存器中的并行数据后进行并串转换后输出,其中,当SPI控制器被配置为主机时,输出至MOSI信号线;反之,当SPI控制器被配置为从机时,输出至MISO信号线;上述输入数据串并转换单元用于将输入串行数据进行串并转换后写入接收数据缓存器,其中,当SPI控制器被配置为主机时,输入为MISO信号线;反之,当SPI控制器被配置为从机时,输入为MOSI信号线。
进一步地,上述寄存器模块包括控制寄存器和波特率寄存器,上述控制寄存器用于接收并寄存CPU配置SPI传输参数;上述波特率寄存器用于接收并寄存CPU配置SCLK时钟波特率参数。
其中,上述传输参数包括SPIE(SPI Enable,SPI使能)、MSS(Master SlaveSelect,主从选择:‘1’为主、‘0’为从)、CPHA、CPOL、MODFEN(模式错误使能)和DataSize(数据位宽选择:‘00’表示8-bit,‘01’表示16-bit,‘10’表示32-bit)。
上述状态与中断控制模块,用于报告SPI控制器的工作状态和产生中断,包括TxFIFOEmpty(发送数据缓存器空标志)、TxFIFOFull(发送数据缓存器满标志)、RxFIFOEmpty(接收数据缓存器空标志)、RxFIFOFull(接收数据缓存器满标志)和MODF。
SPI控制器可支持不同组合的CPHA和CPOL传输参数,支持8位、16位和32位的数据传输,以及支持最高位先传输MLFS=1或者最低位先传输MLFS=0。其中,MLFS(MSB LSB First Select,高低位选择:‘1’为MSB First最高位先传输,‘0’为LSB First最低位先传输)。
本发明另一方面针对SPI控制器还提供一种SPI控制器的通信方法,包括,
S1、系统复位,有限状态机处于空闲状态,SS输出高电平,SCLK输出即CPOL;
S2、CPU配置SPI控制器为主机MSS=1,不使能MODF(MODFFEN=0),使能SPI控制器(SPIEN=1),SPI控制器为主机并等待SPI传输;
S3、CPU将要传输的数据写入发送数据缓存器,该写操作将启动SPI传输:SPI控制器检测到发送数据缓存器中有数据(TxFIFOEmpty=0)就读出发送数据缓存器中的数据并启动SPI传输;
S4、有限状态机保持空闲状态,当检测到递增计数器计数为ClockNumber/2-1,有限状态机处于开始状态,并将SS输出低电平开始SPI传输;
S5、有限状态机保持开始状态,当递增计数器计数到ClockNumber/2-1时SCLK输出翻转,以产生SCLK时钟输出,同时SS输出低电平,ClockNumber(波特率数值);
S6、有限状态机处于传输状态直至数据传输结束,进入结束状态;
进一步地,还包括,
S7、有限状态机保持在结束状态到递增计数器计数到ClockNumber/2-1,之后有限状态机进行状态转换:
S8、如图8所示,当CPHA=0,有限状态机进入空闲状态,同时SS输出高电平并结束当前SPI传输、等待下次SPI传输;
S9、如图9所示,当CPHA=1,如果发送数据缓存器中仍存有数据,有限状态机进入传输状态,同时保持SS输出低电平开始下次SPI传输;反之,如果发送数据缓存器中无数据,有限状态机进入空闲状态,同时SS输出高电平并结束当前SPI传输、等待下次SPI传输。
其中,上述SPI传输为:
S10、CPU配置SPI控制器为主机,并判断SPI主机系统类型;
S11、当为多SPI主机系统,需检测MODF,CPU配置SPI控制器使能MODF,SPI控制器配置SS为输入并检测SS输入电平:
SS为低电平,有其他的SPI主机操作SPI总线,此时SPI控制器硬件自动配置为从机,并向CPU报告MODF;
SS为高电平,没有其他的SPI主机操作SPI总线,SPI控制器可以配置为主机并开始SPI传输,CPU配置SPI控制器不使能MODF,SPI控制器配置SS为输出,准备SPI传输;
当为单SPI主机系统,CPU配置不使能MODF,SPI控制器配置SS为输出,准备SPI传输;
S12、CPU写操作波特率寄存器配置SCLK波特率参数;SCLK时钟频率=系统时钟频率/波特率寄存器的值,其中,最低位永远为0,即波特率寄存器的值为偶数,系统时钟频率为SPI控制器所挂的内部总线接口时钟工作频率。
S13、CPU写操作控制寄存器配置SPI传输参数,如CPHA、CPOL;
S14、CPU将待传输的数据写入发送数据缓存器;数据转换模块将发送数据缓存器中的数据读出进行并串转换后输出至MOSI,同时将输入MISO进行串并转换后写入到接收数据缓存器;
S15、持续SPI控制器数据传输;
S16、当发送数据缓存器中还有数据,需继续传输执行步骤S14,并开始下次传输,否则传输结束。
S17、CPU读取接收数据缓存器里面接收到的数据。其中,步骤S17可选择性的应用;步骤S10-S17是CPU操作SPI控制器实现SPI传输的流程。
以上所述本发明的具体实施方式,并不构成对本发明保护范围的限定。任何根据本发明的技术构思所作出的各种其他相应的改变与变形,均应包含在本发明权利要求的保护范围内。