特点
1、采用主-从模式(master-slave)的控制方式
spi规定了两个spi设备之间通信必须由主设备(master)来控制次设备(slave).一个master设备可以通过提供clock以及对slave设备进行片选(slaveselect)来控制多个slave设备,spi协议还规定slave设备的clock由master设备通过sck管脚提供给slave设备,slave设备本身不能产生或控制clock,没有clock则slave设备不能正常工作。
2、采用同步方式(synchronous)传输数据
master设备会根据将要交换的数据来产生相应的时钟脉冲(clockpulse),时钟脉冲组成了时钟信号(clocksignal),时钟信号通过时钟极性(cpol)和时钟相位(cpha)控制着两个spi设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
3、数据交换(dataexchanges)
spi设备间的数据传输之所以又被称为数据交换,是因为spi协议规定一个spi设备不能在数据通信过程中仅仅只充当一个"发送者(transmitter)"或者"接收者(receiver)"。在每个clock周期内,spi设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了。
一个slave设备要想能够接收到master发过来的控制信号,必须在此之前能够被master设备进行访问(access)。所以,master设备必须首先通过ss/cspin对slave设备进行片选,把想要访问的slave设备选上。
在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样.如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致spi物理模块最终失效。因此,在程序中一般都会在spi传输完数据后,去读取spi设备里的数据,即使这些数据(dummydata)在我们的程序里是无用的。
工作机制
概述上图只是对spi设备间通信的一个简单的描述:
sspbuf,synchronousserialportbuffer,泛指spi设备里面的内部缓冲区,一般在物理上是以fifo的形式,保存传输过程中的临时数据;
sspsr,synchronousserialportregister,泛指spi设备里面的移位寄存器(shiftregitser),它的作用是根据设置好的数据位宽(bit-width)把数据移入或者移出sspbuf;
controller,泛指spi设备里面的控制寄存器,可以通过配置它们来设置spi总线的传输模式。
通常情况下,我们只需要对上图所描述的四个管脚(pin)进行编程即可控制整个spi设备之间的数据通信:
sck,serialclock,主要的作用是master设备往slave设备传输时钟信号,控制数据交换的时机以及速率;
ss/cs,slaveselect/chipselect,用于master设备片选slave设备,使被选中的slave设备能够被master设备所访问;
sdo/mosi,serialdataoutput/masteroutslavein,在master上面也被称为tx-channel,作为数据的出口,主要用于spi设备发送数据;
sdi/miso,serialdatainput/masterinslaveout,在master上面也被称为rx-channel,作为数据的入口,主要用于spi设备接收数据;
spi设备在进行通信的过程中,master设备和slave设备之间会产生一个数据链路回环(dataloop),通过sdo和sdi管脚,sspsr控制数据移入移出sspbuf,controller确定spi总线的通信模式,sck传输时钟信号.
这里解释一下两个概念:
cpol:时钟极性,表示spi在空闲时,时钟信号是高电平还是低电平。若cpol被设为1,那么该设备在空闲时sck管脚下的时钟信号为高电平。当cpol被设为0时则正好相反。
cpha:时钟相位,表示spi设备是在sck管脚上的时钟信号变为上升沿时触发数据采样,还是在时钟信号变为下降沿时触发数据采样。若cpha被设置为1,则spi设备在时钟信号变为下降沿时触发数据采样,在上升沿时发送数据。当cpha被设为0时也正好相反。
本例所使用的spi数据传输模式被设置成cpol=1,cpha=1.这样,在一个clock周期内,每个单独的spi设备都能以全双工(full-duplex)的方式,同时发送和接收1bit数据,即相当于交换了1bit大小的数据.如果spi总线的channel-width被设置成byte,表示spi总线上每次数据传输的最小单位为byte,那么挂载在该spi总线的设备每次数据传输的过程至少需要8个clock周期(忽略设备的物理延迟).因此,spi总线的频率越快,clock周期越短,则spi设备间数据交换的速率就越快。
sspsr.sspsr是spi设备内部的移位寄存器(shiftregister)。它的主要作用是根据spi时钟信号状态,往sspbuf里移入或者移出数据,每次移动的数据大小由bus-width以及channel-width所决定。
bus-width的作用是指定地址总线到master设备之间数据传输的单位。
例如,我们想要往master设备里面的sspbuf写入16byte大小的数据:首先,给master设备的配置寄存器设置bus-width为byte;然后往master设备的tx-data移位寄存器在地址总线的入口写入数据,每次写入1byte大小的数据(使用writeb函数);写完1byte数据之后,master设备里面的tx-data移位寄存器会自动把从地址总线传来的1byte数据移入sspbuf里;上述动作一共需要重复执行16次。
channel-width的作用是指定master设备与slave设备之间数据传输的单位.与bus-width相似,master设备内部的移位寄存器会依据channel-width自动地把数据从master-sspbuf里通过master-sdo管脚搬运到slave设备里的slave-sdi引脚,slave-sspsr再把每次接收的数据移入slave-sspbuf里。
通常情况下,bus-width总是会大于或等于channel-width,这样能保证不会出现因master与slave之间数据交换的频率比地址总线与master之间的数据交换频率要快,导致sspbuf里面存放的数据为无效数据这样的情况。
sspbuf.我们知道,在每个时钟周期内,master与slave之间交换的数据其实都是spi
内部移位寄存器从sspbuf里面拷贝的。我们可以通过往sspbuf对应的寄存器(tx-data/rx-dataregister)里读写数据,间接地操控spi设备内部的sspbuf。
例如,在发送数据之前,我们应该先往master的tx-data寄存器写入将要发
送出去的数据,这些数据会被master-sspsr移位寄存器根据bus-width自动移入master-sspbuf里,然后这些数据又会被master-sspsr根据channel-width从master-sspbuf中移出,通过master-sdo管脚传给slave-sdi管脚,slave-sspsr则把从slave-sdi接收到的数据移入slave-sspbuf里.与此同时,slave-sspbuf里面的数据根据每次接收数据的大小(channel-width),通过slave-sdo发往master-sdi,master-sspsr再把从master-sdi接收的数据移入master-sspbuf。在单次数据传输完成之后,用户程序可以通过从master设备的rx-data寄存器读取master设备数据交换得到的数据。
controller.master设备里面的controller主要通过时钟信号(clocksignal)以及片选信号(slaveselectsignal)来控制slave设备。slave设备会一直等待,直到接收到master设备发过来的片选信号,然后根据时钟信号来工作。
master设备的片选操作必须由程序所实现。例如:由程序把ss/cs管脚的时钟信号拉低电平,完成spi设备数据通信的前期工作;当程序想让spi设备结束数据通信时,再把ss/cs管脚上的时钟信号拉高电平。
spi,串行外围设备接口,是motorola公司推出的一种同步串行接口技术.spi总线在物理上是通过接在外围设备微控制器(picmicro)上面的微处理控制单元(mcu)上叫作同步串行端口(synchronousserialport)的模块(module)来实现的,它允许mcu以全双工的同步串行方式,与各种外围设备进行高速数据通信。
spi主要应用在eeprom,flash,实时时钟(rtc),数模转换器(adc),数字信号处理器(dsp)以及数字信号解码器之间。它在芯片中只占用四根管脚(pin)用来控制以及数据传输,节约了芯片的pin数目,同时为pcb在布局上节省了空间.正是出于这种简单易用的特性,现在越来越多的芯片上都集成了spi技术。文章出自:玩转电子技术设计