发明内容
有鉴于此,本申请提供了一种通信方法、SPI控制器及单片机,从而达到直接实现多主多从通信,且节约BOM成本的目的。
本申请提供的一种通信方法,应用于SPI控制器,SPI控制器用于控制多个SPI主机,多个SPI主机均连接同一数据线,具体通过如下方式实现:
控制第一SPI主机对NSS信号电平进行检测,多个SPI主机包括第一SPI主机;
若确定NSS信号电平为高电平,则控制第一SPI主机拉低NSS信号电平为低电平;
延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测,第一时间段为第一SPI主机对应的延时时间段,多个SPI主机中各个SPI主机对应的延时时间段不同;
若确定数据线信号电平为高电平,则控制第一SPI主机拉低数据线信号电平为低电平;
等待第二时间段后,控制第一SPI主机与SPI从机进行通信,第二时间段为第一SPI主机对应的间隔时间段,多个SPI主机中各个SPI主机对应的间隔时间段一致。
可选地,多个SPI主机还包括第二SPI主机,控制第一SPI主机对NSS信号电平进行检测,包括:
同时控制第一SPI主机和第二SPI主机对NSS信号电平进行检测;
则控制第一SPI主机拉低NSS信号电平为低电平,包括:
同时控制第一SPI主机和第二SPI主机拉低NSS信号电平为低电平。
可选地,同时控制第一SPI主机和第二SPI主机拉低NSS信号电平为低电平之后,还包括:
延时第三时间段后,控制第二SPI主机对数据线信号电平进行检测,第三时间段为第二SPI主机对应的延时时间段,第三时间段的时间长度长于第一时间段的时间长度;
确定数据线信号电平为低电平,并控制第二SPI主机向处理器发送第三冲突信息,第三冲突信息指示NSS信号冲突,第一SPI主机正在使用SPI总线进行通信。
可选地,第二时间段的时间长度长于第三时间段的时间长度。
可选地,等待第二时间段之前,多个SPI主机所连接的SPI总线处于开漏模式。
可选地,等待第二时间段之后,多个SPI主机所连接的SPI总线处于推挽模式。
可选地,方法还包括:
若确定NSS信号电平为低电平,则控制第一SPI主机向处理器发送第一冲突信息,第一冲突信息指示NSS信号冲突,第三SPI主机正在使用SPI总线进行通信,多个SPI主机还包括第三SPI主机,多个SPI主机均连接SPI总线。
可选地,方法还包括:
若确定数据线信号电平为低电平,则控制第一SPI主机向处理器发送第二冲突信息,第二冲突信息指示数据线信号冲突,第三SPI主机正在使用SPI总线进行通信,多个SPI主机还包括第三SPI主机,多个SPI主机均连接SPI总线。
本申请还提供了一种SPI控制器,SPI控制器用于控制多个SPI主机,多个SPI主机均连接同一数据线,包括:
检测模块,用于控制第一SPI主机对NSS信号电平进行检测,多个SPI主机包括第一SPI主机;检测模块,还用于延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测,第一时间段为第一SPI主机对应的延时时间段,多个SPI主机中各个SPI主机对应的延时时间段不同;
拉低模块,用于若确定NSS信号电平为高电平,则控制第一SPI主机拉低NSS信号电平为低电平;拉低模块,还用于若确定数据线信号电平为高电平,则控制第一SPI主机拉低数据线信号电平为低电平;
通信模块,用于等待第二时间段后,控制第一SPI主机与SPI从机进行通信,第二时间段为第一SPI主机对应的间隔时间段,多个SPI主机中各个SPI主机对应的间隔时间段一致。
本申请还提供了一种单片机,包括:处理器,处理器与存储器耦合,存储器中存储有至少一条计算机程序指令,至少一条计算机程序指令由处理器加载并执行,以使单片机实现上述通信方法。
因此,本申请的有益效果是:由于SPI控制器可以控制多个SPI主机,通过在SPI主机与SPI从机进行通信以前,先对NSS信号电平进行检测,若NSS信号电平为高电平,则代表此时无其他SPI主机与SPI从机正在进行通信,因此SPI主机可以将NSS信号电平拉低为低电平,同时为了防止多个SPI主机同时将NSS信号电平拉低为低电平并进入通信状态,此时会延时一段时间后对数据线信号电平进行检测,由于各个SPI主机对应的延时时间段不同,因此延时时间长的SPI主机可以发现延时时间短的SPI主机拉低数据线信号电平的操作,若此时数据线信号电平为高电平,则代表延时时间段内无其他SPI主机与SPI从机正在进行通信,因此SPI主机可以拉低数据线信号电平并与SPI从机进行通信。本申请通过在SPI主机与SPI从机进行通信以前,先对可能造成通信冲突的情况进行检测,从而降低通信冲突发生的概率,使得多主SPI总线能够正常工作,因此可以实现SPI多主多从通信,并且由于本申请并未额外增加电路模块,在SPI控制器内部即可实现多主多从通信,因此可以节约BOM成本。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
发明人发现,现有技术在MCU芯片外部设置电路模块,通过对外部电路模块进行控制,从而可以对SPI总线进行切换,以实现SPI总线的复用。然而这种方式,实际上是对电路进行控制,从而间接实现SPI总线的多主通信,同时,由于增设了电路模块,还会导致增加BOM成本。
而本申请在不需要增加外部电路的情况下,通过SPI控制器就可以检测到多个SPI主机同时对SPI从机进行通信的冲突,同时可以在检测到通信冲突后,控制SPI主机让出SPI总线,以实现同一时刻仅有一个SPI主机与SPI从机进行通信,因此本申请在MCU芯片内部即可直接实现SPI多主通信功能,并且可以节约系统BOM成本,使得MCU芯片可以适用于更多的应用场景中。
请参阅图1,本申请的第一实施例具体步骤如下:
S101:SPI控制器控制第一SPI主机对NSS信号电平进行检测。
在本申请中,可以存在多个SPI主机以及多个SPI从机,SPI控制器用于控制多个SPI主机,多个SPI主机中的任一SPI主机均可以与多个SPI从机中的任一SPI从机进行通信。第一SPI主机可以是上述多个SPI主机中的任一SPI主机,且第一SPI主机具有与SPI从机进行通信的需要。具体地,多个SPI主机均与同一SPI主线进行连接,并利用同一SPI主线与SPI从机进行通信,此时,多个SPI主机可以均连接同一数据线。需要说明的是,多个SPI主机包括第一SPI主机。
在本申请中,可能存在多个SPI主机同时均需要与SPI从机进行通信的情况,但若多个SPI主机与SPI从机之间均进行数据传输,则会存在冲突。因此,在SPI主机与SPI从机进行通信之前,需要先进行冲突检测。具体地,冲突检测可以分为两个阶段,第一阶段为NSS(Negative of Slave Select,意为“低电平有效的从器件选择”信号)信号冲突检测阶段,第二阶段为数据线信号冲突检测阶段。当SPI主机在冲突检测阶段,确定可与SPI从机进行通信,则可进入正常通信阶段。
需要说明的是,步骤S101至步骤S102为NSS信号冲突检测阶段,步骤S103至步骤S104为数据线信号冲突检测阶段,而步骤S105为正常通信阶段。同时,在冲突检测阶段,SPI总线工作在开漏模式;在正常通信阶段,SPI信号线工作在推挽模式。
在SPI通信中,NSS信号线通常用于从机的选择,因此,NSS信号电平可以反映是否有SPI主机已选择其需要通信的SPI从机。第一SPI主机通过对NSS信号电平进行检测,可以知道其是否有选择SPI从机的条件。
S102:SPI控制器若确定NSS信号电平为高电平,则控制第一SPI主机拉低NSS信号电平为低电平。
由于NSS信号为低电平有效,因此当NSS信号电平为高电平时,则证明当前没有SPI主机选择SPI从机,第一SPI主机可以选择SPI从机;而当NSS信号电平为低电平时,则证明当前已有SPI主机选择SPI从机,第一SPI主机不具备选择SPI从机的条件。
因此,在一些实现方式中,多个SPI主机还包括第三SPI主机,SPI控制器若确定NSS信号电平为低电平,则其中,第一冲突信息指示NSS信号冲突,第三SPI主机正在使用SPI总线进行通信。此时,第一SPI主机让出SPI总线,并停止与SPI从机进行通信,从而避免与正在进行通信的第三SPI主机发生通信冲突。
S103:SPI控制器延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测。
第一时间段为第一SPI主机对应的延时时间段。具体地,可以通过软件设置,将第一时间段设置为第一SPI主机对应的延时时间段。
需要说明的是,多个SPI主机中各个SPI主机对应的延时时间段不同。由于多个SPI主机可能均具有通信需要,且可能同时对NSS信号电平进行检测,并确定NSS信号电平为高电平,因此多个SPI主机若同时拉低NSS信号电平为低电平并进行SPI通信,则也可能造成通信冲突。为了防止这种情况发生,则会为不同SPI主机分配不同的延时时间段,由于各个SPI主机对应的延时时间段不同,从而可以将各个SPI主机可拉低数据线信号电平的时间分隔开,因此延时时间长的SPI主机可以发现延时时间段的SPI主机拉低数据线信号电平的操作,从而降低通信冲突的可能性。
由于数据线信号电平在未传输数据的情况下为默认电平,即高电平,因此第一SPI主机通过对数据线信号电平进行检测,即可以确定此时是否有其他SPI主机正在进行数据传输,从而可以降低数据线信号冲突的可能性。
S104:SPI控制器若确定数据线信号电平为高电平,则控制第一SPI主机拉低数据线信号电平为低电平。
当数据线信号电平为高电平,则证明当前没有其他SPI主机正在进行数据传输,第一SPI主机可以拉低数据线信号电平为低电平,并与SPI从机进行数据传输;当数据线信号电平为低电平,则证明当前已有其他SPI主机正在进行数据传输,若第一SPI主机进行通信则会导致通信冲突。
在一些实现方式中,多个SPI主机还包括第三SPI主机,SPI控制器若确定数据线信号电平为低电平,则控制第一SPI主机向处理器发送第二冲突信息。其中,第二冲突信息指示数据线信号冲突,第三SPI主机正在使用SPI总线进行通信。此时,第一SPI主机让出SPI总线,并停止与SPI从机进行通信,从而避免与正在进行通信的第三SPI主机发生通信冲突。
S105:SPI控制器等待第二时间段后,控制第一SPI主机与SPI从机进行通信。
第二时间段为第一SPI主机对应的间隔时间段,且多个SPI主机中各个SPI主机对应的间隔时间段一致。具体地,若SPI控制器用于控制第一SPI主机、第二SPI主机和第三SPI主机,则第一SPI主机对应的间隔时间段、第二SPI主机对应的间隔时间段和第三SPI主机对应的间隔时间段在时间长度上相等。
第二时间段的时间长度长于各个SPI主机对应的延时时间段的时间长度,此时第一SPI主机可以在各个SPI主机均对数据线信号电平进行检测完后,再进行SPI通信。需要说明的是,由于第一SPI主机已确定数据线信号电平为高电平,因此第一SPI主机的延时时间段应小于其他SPI主机的延时时间段,其他SPI主机对数据线信号电平进行检测,仅能得到数据线信号电平为低电平的结果。而通过在各个SPI主机均已得到对数据线信号电平进行检测的检测结果后,再进行SPI通信,可以进一步降低发生通信冲突的概率。
需要说明的是,第一SPI主机与SPI从机进行通信时,第一SPI主机与SPI从机之间进行数据传输。
在一些实现方式中,SPI控制器等待第二时间段之前,多个SPI主机所连接的SPI总线处于开漏模式;在另一些实现方式中,SPI控制器等待第二时间段之后,多个SPI主机所连接的SPI总线处于推挽模式。
在本申请第一实施例中,通过在SPI主机与SPI从机进行通信以前,先对NSS信号电平进行检测,若NSS信号电平为高电平,则代表此时无其他SPI主机与SPI从机正在进行通信,因此SPI主机可以将NSS信号电平拉低为低电平,同时为了防止多个SPI主机同时将NSS信号电平拉低为低电平并进入通信状态,此时会延时一段时间后对数据线信号电平进行检测,由于各个SPI主机对应的延时时间段不同,因此延时时间长的SPI主机可以发现延时时间短的SPI主机拉低数据线信号电平的操作,若此时数据线信号电平为高电平,则代表延时时间段内无其他SPI主机与SPI从机正在进行通信,因此SPI主机可以拉低数据线信号电平并与SPI从机进行通信。本申请通过在SPI主机与SPI从机进行通信以前,先对可能造成通信冲突的情况进行检测,从而降低通信冲突发生的概率,使得多主SPI总线能够正常工作,因此可以实现SPI多主多从通信,并且由于本申请并未额外增加电路模块,在SPI控制器内部即可实现多主多从通信,因此可以节约BOM成本。
由于在第一SPI主机拉低NSS信号电平后,可能有其他SPI主机需要与SPI从机进行通信,因此第二实施例对这种情况进行说明。
请参阅图2,本申请的第二实施例具体步骤如下:
S201:SPI控制器控制第一SPI主机对NSS信号电平进行检测。
在本实施例中,多个SPI主机还包括第四SPI主机,SPI控制器至少用于控制第一SPI主机和第四SPI主机。
需要说明的是,SPI控制器若确定NSS信号电平为低电平,则执行步骤S202;SPI控制器若确定NSS信号电平为高电平,则执行步骤S203。
S202:SPI控制器控制第一SPI主机向处理器发送第一冲突信息。
需要说明的是,若SPI控制器执行步骤S202,则不再执行后续步骤S203至步骤S209。
S203:SPI控制器控制第一SPI主机拉低NSS信号电平为低电平。
S204:SPI控制器控制第四SPI主机对NSS信号电平进行检测。
S205:SPI控制器确定NSS信号电平为低电平,控制第四SPI主机向处理器发送第三冲突信息。
第三冲突信息指示NSS信号冲突,第一SPI主机正在使用SPI总线进行通信。
需要说明的是,步骤S204至步骤S205可以在步骤S202之后的任一时刻执行。具体地,步骤S204至步骤S205还可以在步骤S206至步骤S207之间执行,还可以在步骤S207至步骤S208之间执行,也可以在步骤S208至步骤S209之间执行。
S206:SPI控制器延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测。
需要说明的是,SPI控制器若确定数据线信号电平为低电平,则执行步骤S207;SPI控制器若确定数据线信号电平为高电平,则执行步骤S208。
S207:SPI控制器控制第一SPI主机向处理器发送第二冲突信息。
需要说明的是,若SPI控制器执行步骤S207,则不再执行后续步骤S208至步骤S209。
S208:SPI控制器控制第一SPI主机拉低数据线信号电平为低电平。
S209:SPI控制器等待第二时间段后,控制第一SPI主机与SPI从机进行通信。
在本申请第二实施例中,由于SPI主机在与SPI从机进行通信之前,均会对NSS信号电平进行检测,因此当第四SPI主机需要进行通信时,可以检测到NSS信号电平已经由第一SPI主机拉低为低电平,第四SPI主机从而可以让出SPI总线,停止可能造成冲突的通信,实现在多主模式下,SPI总线能够正常工作。
由于可能存在多个SPI主机同时对NSS信号电平进行检测的情况,因此第三实施例对这种情况进行说明。
请参阅图3和图4,本申请的第三实施例具体步骤如下:
S301:SPI控制器同时控制第一SPI主机、第二SPI主机和第五SPI主机对NSS信号电平进行检测。
需要说明的是,多个SPI主机至少包括第一SPI主机、第二SPI主机和第五SPI主机。
S302:SPI控制器若确定NSS信号电平为高电平,则同时控制第一SPI主机、第二SPI主机和第五SPI主机拉低NSS信号电平为低电平。
S303:SPI控制器延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测。
具体地,在本实施例中,数据线可以为串行数据输出信号线MOSI(Master OutputSlave Input,MOSI),即图4所示MOSI1、MOSI2和MOSI3分别对应于第一SPI主机、第二SPI主机和第五SPI主机对串行数据输出信号线电平进行检测的情况。
S304:SPI控制器确定数据线信号电平为高电平,并控制第一SPI主机拉低数据线信号电平为低电平。
S305:SPI控制器延时第三时间段后,控制第二SPI主机对数据线信号电平进行检测。
第三时间段为第二SPI主机对应的延时时间段,且第三时间段的时间长度长于第一时间段的时间长度。
需要说明的是,SPI控制器延时第一时间段,以及SPI控制器延时第三时间段均以拉低NSS信号电平为低电平的时刻为起始时间点,但由于第三时间段的时间长度长于第一时间段的时间长度,因此第二SPI主机对数据线信号电平进行检测的时间应晚于第一SPI主机对数据线信号电平进行检测的时间。
S306:SPI控制器确定数据线信号电平为低电平,并控制第二SPI主机向处理器发送第三冲突信息。
由于第三时间段的时间长度长于第一时间段的时间长度,因此当第二SPI主机对数据线信号电平进行检测时,第一SPI主机已经拉低数据线信号电平为低电平,此时第二SPI主机对数据线信号电平进行检测得到的检测结果为:数据线信号电平为低电平。
S307:SPI控制器延时第四时间段后,控制第五SPI主机对数据线信号电平进行检测。
第四时间段为第五SPI主机对应的延时时间段,且第四时间段的时间长度长于第三时间段的时间长度。
需要说明的是,SPI控制器延时第四时间段也以拉低NSS信号电平为低电平的时刻为起始时间点,但由于第四时间段的时间长度也长于第一时间段的时间长度,因此第五SPI主机对数据线信号电平进行检测的时间应晚于第一SPI主机对数据线信号电平进行检测的时间。
S308:SPI控制器确定数据线信号电平为低电平,并控制第五SPI主机向处理器发送第三冲突信息。
由于第四时间段的时间长度长于第一时间段的时间长度,因此当第五SPI主机对数据线信号电平进行检测时,第一SPI主机已经拉低数据线信号电平为低电平,此时第五SPI主机对数据线信号电平进行检测得到的检测结果为:数据线信号电平为低电平。
S309:SPI控制器等待第二时间段后,控制第一SPI主机与SPI从机进行通信。
需要说明的是,第二时间段的时间长度长于第四时间段的时间长度。此时第一时间段、第二时间段、第三时间段和第四时间段根据长度按照从短到长依次排序如下:第一时间段、第三时间段、第四时间段、第二时间段。
在本申请第三实施例中,由于SPI主机在拉低NSS信号电平为低电平之后,还需要对数据线信号电平进行检测,并且,通过对不同SPI主机设置不同的延时时间,因此多个SPI主机对数据线信号电平进行检测的时间不同,此时延时时间长的SPI主机可以发现延时时间短的SPI主机拉低数据线信号电平的操作,并让出SPI总线、停止通信,从而可以降低多个SPI主机同时进行通信而引发的通信冲突的情况,使得SPI总线能够在存在多个SPI主机的情况下正常工作。
请参阅图5,本申请提供了一种SPI控制器500,SPI控制器500用于控制多个SPI主机,多个SPI主机均连接同一数据线,包括:
检测模块501:用于控制第一SPI主机对NSS信号电平进行检测,多个SPI主机包括第一SPI主机。
检测模块501:还用于延时第一时间段后,控制第一SPI主机对数据线信号电平进行检测,第一时间段为第一SPI主机对应的延时时间段,多个SPI主机中各个SPI主机对应的延时时间段不同。
拉低模块502:用于若确定NSS信号电平为高电平,则控制第一SPI主机拉低NSS信号电平为低电平。
拉低模块502:还用于若确定数据线信号电平为高电平,则控制第一SPI主机拉低数据线信号电平为低电平。
通信模块503:用于等待第二时间段后,控制第一SPI主机与SPI从机进行通信,第二时间段为第一SPI主机对应的间隔时间段,多个SPI主机中各个SPI主机对应的间隔时间段一致。
可选地,多个SPI主机还包括第二SPI主机,检测模块501:具体用于同时控制第一SPI主机和第二SPI主机对NSS信号电平进行检测。
则,拉低模块502:具体用于同时控制第一SPI主机和第二SPI主机拉低NSS信号电平为低电平。
可选地,一种SPI控制器500还包括:发送模块504。
检测模块501:还用于延时第三时间段后,控制第二SPI主机对数据线信号电平进行检测,第三时间段为第二SPI主机对应的延时时间段,第三时间段的时间长度长于第一时间段的时间长度。
发送模块504:用于确定数据线信号电平为低电平,并控制第二SPI主机向处理器发送第三冲突信息,第三冲突信息指示NSS信号冲突,第一SPI主机正在使用SPI总线进行通信。
可选地,发送模块504:还用于若确定NSS信号电平为低电平,则控制第一SPI主机向处理器发送第一冲突信息,第一冲突信息指示NSS信号冲突,第三SPI主机正在使用SPI总线进行通信,多个SPI主机还包括第三SPI主机,多个SPI主机均连接SPI总线。
可选地,发送模块504:还用于若确定数据线信号电平为低电平,则控制第一SPI主机向处理器发送第二冲突信息,第二冲突信息指示数据线信号冲突,第三SPI主机正在使用SPI总线进行通信,多个SPI主机还包括第三SPI主机,多个SPI主机均连接SPI总线。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
需要说明的是:上述实施例提供的通信装置在实现通信功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将通信装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的通信装置与通信方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
请参阅图6,本申请还提供了一种单片机600,包括:处理器601和存储器602。
处理器601与存储器602耦合,存储器602中存储有至少一条计算机程序指令,至少一条计算机程序指令由处理器601加载并执行,以使单片机实现上述通信方法。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。