SPI:Serial Peripheral Interface的简称,是Motorola首先在其MC68HCXX系列处理器上定义的,一种同步串行外设接口。它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASH,RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU, EEPROM,FLASH,实时时钟,AD转换器,还有DSP和数字信号解码器之间等。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
SPI接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和从机选择线CS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
以手上的一款LCD为例,分析SPI的时序。时序图
SPENB为片选使能,SPDA为MOSI,SPCK为时钟。在SPCK上升沿锁存信号。LCD数据格式
数据格式在应用里处理。这里只关注3线时序输出
- #define CS_LOW s3c2410_gpio_setpin(S3C2410_GPG2,0)
-
#define CS_HIGHT s3c2410_gpio_setpin(S3C2410_GPG2,1)
-
#define SDA_LOW s3c2410_gpio_setpin(S3C2410_GPE12,0)
-
#define SDA_HIGHT s3c2410_gpio_setpin(S3C2410_GPE12,1)
-
#define SCL_LOW s3c2410_gpio_setpin(S3C2410_GPE13,0)
-
#define SCL_HIGHT s3c2410_gpio_setpin(S3C2410_GPE13,1)
-
void spi_write8(uint addr,uint data)
-
{
-
uchar ucLoop;
-
-
CS_HIGHT;
-
udelay(20);
-
SDA_HIGHT;
-
udelay(20);
-
SCL_HIGHT;
-
udelay(20);
-
CS_LOW; 片选使能
-
udelay(20);
-
-
for(ucLoop=8;ucLoop > 0; ucLoop--) {
-
SCL_LOW;
-
if(addr &(1<<(ucLoop-1))) {
-
SDA_HIGHT;
-
} else {
-
SDA_LOW;
-
}
-
udelay(10);
-
SCL_HIGHT;
-
udelay(10);
-
}
-
for(ucLoop=8;ucLoop > 0; ucLoop--) {
-
SCL_LOW;
-
if(data &(1<<(ucLoop-1))) {
-
SDA_HIGHT;
-
} else {
-
SDA_LOW;
-
}
-
udelay(10);
-
SCL_HIGHT; //上升沿采集信号
-
udelay(10);
-
}
-
udelay(10);
-
CS_HIGHT;
-
}
- 注:用IO口模拟的三线,使能高/低有效,以及时钟上升沿/下降沿采样,均可在device寄存器设置。输入输出是可以同时进行的,并且,时钟可控(由master), 即可暂停,可延时。
阅读(1286) | 评论(0) | 转发(0) |