Linux内核驱动之spi子系统spi协议
概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构;支持多slave模式应用(此时使用四线模式进行通信,在原有三线模式下多出一根片选信号CS),一般一个Master最多支持4个Slave,此时Master控制器需要有4根CS片选信号,因为主从通信的属于独占式,在某一个Slave设备通信时候,其他设备只能等待。SPI总线时钟由Master控制,在同步时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB FIRST),四线工作模式的SPI接口有2根单向数据线MOSI和MISO,SCK时钟线,Slave设备的片选信号CS。看下图多Slave模式的主从连接图从上很明显看出各个Slave设备共享数据线和时钟线,各自的片选信号线不一样,三线模式更为简单,简单的说去掉片选信号线即可。下面是SPI总线的优缺点优点: 1) 支持全双工操作; 2) 操作简单; 3) 数据传输速率较高。缺点: 1) 需要占用主机较多的引脚线(每个从机都需要一根片选线),占用总线带宽; 2) 没有指定的流控制,没有应答机制确认是否接收到数据。 3) SPI总线并不是一个标准的协议,为了适应较多产品存在较多的模式,同时各家芯片的读写方法并不是完全一致二 SPI总线模式设置SPI协议中最重要的便是模式设置包括CPOL和CPHA。CPOL指的是SCK时钟空闲时的电平极性Polarity。CPHA指的是相位Phase.CPOL=0表示SCK时钟在空闲时候是低电平CPOL=1表示SCK时钟在空闲时候是高电平CPHA=0 表示片选信号有效后,SCK的第一个跳变沿采样(接收)数据(包括下降沿/上升沿取决于CPOL),第二个跳变沿发送数据CPHA=1表示片选信号有效后,SCK的第一个跳变沿发送数据,第二个跳变沿采样(接收)数据注意采样数据一般都是在数据线信号最稳定的时候采样-信号中间根据CPOL和CPHA的变化SPI设备存在四种工作模式Linux使用以下四个宏表示SPI_MODE_0,SPI_MODE_1,SPI_MODE_2,SPI_MODE_3为了保证主从设备的正常通信,主从设备需要保持一致的工作模式,对于一个给定的从设备是可以从其datasheet中间找到相应的工作模式,主设备按照datasheet进行设置即可。看下面的时序图即四种工作模式首先看图3,CPHA = 0:表示片选信号有效后,SCK的第一个跳变沿采样数据。此时正好是MOSI和MISO信号最稳定最中间的地方,正好采样数据,那究竟是在何时输出的BIT7(MSB)了,肯定早于SCK第一个跳变沿不然对方没法接收到数据。从图3也可以看出来,MOSI输出(Master输出数据)早SCK第一个跳变沿半个周期,MISO输出数据(Slave输出数据)就更早了,基本在片选信号有效后就立即输出数据了。到了SCK的第二个跳变沿,肯定继续输出数据第三个跳变沿接收数据 … …直到传输结束接着图4,CPHA = 1;:表示片选信号有效后,SCK的第二个跳变沿采样数据。这时候就更好理解了,第二个跳变沿采样数据,那第一个跳变沿自然就发送数据,看时序图也是:片选信号有效后第一个个跳变沿MOSI和MISO就各自发送数据了,第二个跳变沿来的时候,正好是MOSI和MISO信号最稳定最中间的地方,正好采样数据。第三个跳变沿就继续发送数据,第四个跳变沿接收数据 … …直到传输结束三 GSPI接口首先GSPI接口和普通SPI接口在电路连接上显然不一样,GSPI接口的数据线是连接成环路,即上一级芯片的输出SDOUT连接下一级芯片的输入SDIN.但是GSPI的接口时序和SPI接口时序是一样的也有四种工作模式需要注意的地方:我们芯片的的SPI Master只有三根CS片选信号,也就是说最多只能连接三个SPI Slave设备,由于系统需求我们必须连接四个SPI Slave所以使用一根GPIO来代替CS信号。此时出现了一个问题:我们根本不能去读写这四个SPI Slave设备后来查询原因是由于GSPI接口的事,由于电路是闭环的,SPI Master去读取某个SPI Slave设备时,会选通该SPI slave的CS信号(低电平),使得数据沿着闭环传输回SPI Master。然而我们最后一级SPI Slave是使用GPIO扩展的,始终输出的都是低电平,导致一个环路里边有两个SPI slave都是选通状态,这样肯定不能正常工作。解决方法是把GPIO电平变高使得该SPI slave始终都处于未选通状态,这样GSPI环路里边始终就只有一个SPI Slave选通了。