Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353269
  • 博文数量: 570
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-17 10:38
文章分类

全部博文(570)

文章存档

2015年(570)

我的朋友

分类: LINUX

2015-11-17 16:37:01

原文地址:spi协议 作者:leon_yu

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线时序输出 
  1. #define CS_LOW s3c2410_gpio_setpin(S3C2410_GPG2,0)
  2. #define CS_HIGHT s3c2410_gpio_setpin(S3C2410_GPG2,1)
  3. #define SDA_LOW s3c2410_gpio_setpin(S3C2410_GPE12,0)
  4. #define SDA_HIGHT s3c2410_gpio_setpin(S3C2410_GPE12,1)
  5. #define SCL_LOW s3c2410_gpio_setpin(S3C2410_GPE13,0)
  6. #define SCL_HIGHT s3c2410_gpio_setpin(S3C2410_GPE13,1)
  7. void spi_write8(uint addr,uint data)
  8. {
  9.     uchar ucLoop;

  10.     CS_HIGHT;
  11.     udelay(20);
  12.     SDA_HIGHT;
  13.     udelay(20);
  14.     SCL_HIGHT;
  15.     udelay(20);
  16.     CS_LOW;    片选使能
  17.     udelay(20);
  18.         
  19.     for(ucLoop=8;ucLoop > 0; ucLoop--) {
  20.         SCL_LOW;
  21.         if(addr &(1<<(ucLoop-1))) {
  22.             SDA_HIGHT;
  23.         } else {
  24.             SDA_LOW;
  25.         }
  26.         udelay(10);
  27.         SCL_HIGHT;
  28.         udelay(10);
  29.     }
  30.     for(ucLoop=8;ucLoop > 0; ucLoop--) {
  31.         SCL_LOW;
  32.         if(data &(1<<(ucLoop-1))) {
  33.             SDA_HIGHT;
  34.         } else {
  35.             SDA_LOW;
  36.         }
  37.         udelay(10);
  38.         SCL_HIGHT;    //上升沿采集信号
  39.         udelay(10);
  40.     }
  41.     udelay(10);
  42.     CS_HIGHT;
  43. }
  44. 注:用IO口模拟的三线,使能高/低有效,以及时钟上升沿/下降沿采样,均可在device寄存器设置。输入输出是可以同时进行的,并且,时钟可控(由master), 即可暂停,可延时。
阅读(317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~