面试中关于SPI常见问题
什么是SPI?
SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位(bit)传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。
SPI一般使用4条线通信分别是?
答:
1、 MISO ————— 主设备数据输入、从设备数据输出
2、 MOSI ————— 主设备数据输出、从设备数据输入
3、 SCLK ————— 时钟信号、由主设备产生
4、 NSS(CS) ————– 从设备片选信号,由主设备控制
SPI有四种操作模式,模式0、模式1、模式2、模式3。它们的区别是?
答:SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。
如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。
时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
SPI主模块和与之通信的外设音时钟相位和极性应该一致。
硬件SPI和软件模拟SPI的区别有哪些?
答:硬件SPI的效率要比软件模拟SPI高,写程序的时候只要把要发的数据写在寄存器里,硬件就会自动给你发了,软件模拟SPI则需要器实现时钟的拉高拉低,数据串行输出等等。硬件SPI必须要处理器支持才可以用,软件SPI就不需要特定的要求了,一般IO口就可用。
简单手撕程序
从下面这个图分析循环移位寄存器,从高位开始发送,接收到寄存器的低位,然后通过每次移位,完成master和slave的8bit数据交换,也就完成数据的读写。
//GPIO模拟SPI(同时读写,写一个数据,通过返回一个数据)
uchar SPI_RW(uchar byte)//byte是写的数据,返回值是需要读的数据
{
uchar bit_ctr;
for(bit_ctr=;bit_ctr<8;bit_ctr++)
{
MOSI=(byte&0x80);//写,移动最高有效位到MOSI线上
byte=(byte<<1);//左移一位
SCK=1; //时钟线置高
byte|=MISO;//读,取当前MISO线上的值,放在byte最低位上
SCK=0;//时钟线置低
}
return(byte);
}