Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19895
  • 博文数量: 1
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 22
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-06 09:54
文章分类
文章存档

2013年(1)

我的朋友

分类: 嵌入式

2013-04-10 16:16:22

   
     这两天在弄SPI,主要是用ARM下的SPI与外部设备通信。SPI驱动移植就不说了,网上很多例子。
     SPI的操作主要设置的是CPOL,CPHA, CS ,SCLK,在Linux下,主要是通过 IOCTL 和 struct spi_ioc_transfer 这个结构体来设置的。OPEN SPI设备后,通过 IOCTL 设置 相关属性
        /*
        * spi mode
        */
        ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
       if (ret == -1)
      pabort("can't set spi mode");


       ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
       if (ret == -1)
        pabort("can't get spi mode");

       /*
       * bits per word
      */
       ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); 
       if (ret == -1)
       pabort("can't set bits per word");

      ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
     if (ret == -1)
     pabort("can't get bits per word");


    /*
   * max speed hz
   */
   ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
   if (ret == -1)
      pabort("can't set max speed hz");

    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
    if (ret == -1)
      pabort("can't get max speed hz");

  这里的mode参数,主要用来设置 CPOL 和  CPHA  
 相关定义在INCLUDE/LINUX/SPI/SPI.H文件里面
  #define SPI_CPHA 0x01 /* clock phase */
  #define SPI_CPOL 0x02 /* clock polarity */
  #define SPI_MODE_0 (0|0) /* (original MicroWire) */
  #define SPI_MODE_1 (0|SPI_CPHA)
  #define SPI_MODE_2 (SPI_CPOL|0)
  #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
  #define SPI_CS_HIGH 0x04 /* chipselect active high? */
  #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
  #define SPI_3WIRE 0x10 /* SI/SO signals shared */
  #define SPI_LOOP 0x20 /* loopback mode */
  #define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */
  #define SPI_READY 0x80 /* slave pulls low to pause */

    默认的MODE是 所有的配置都是0 , 如果你的SPI从外设是高电平有效,CPOL=1,CPHA=0,那么你的MODE就是 CPOL | SPI_CS_HIGH。设置好MODE后,发送数据时,需要使能CS,这里就用到 struct spi_ioc_transfer 里的cs_change位,在 填充这个结构体时,将CS_CHANGE置0即可。
    


 
阅读(13372) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~