<rt id="ycqqm"><small id="ycqqm"></small></rt><option id="ycqqm"></option>
<acronym id="ycqqm"><center id="ycqqm"></center></acronym>
<rt id="ycqqm"><small id="ycqqm"></small></rt> <acronym id="ycqqm"></acronym>
<tr id="ycqqm"><optgroup id="ycqqm"></optgroup></tr>
<acronym id="ycqqm"><small id="ycqqm"></small></acronym>

技術支持Technical

Am335x 應用層之SPI操作

時間:2016-12-02     作者:


AM335X的SPI接口有四種不同的數據傳輸時序,取決于CPOL和CPHL這兩位的組合。圖1中表現了這四種時序,時序與CPOL、CPHL的關系也可以從圖中看出。

1111551424.jpg

CPOL是用來決定SCK時鐘信號空閑時的電平,CPOL=0,空閑電平為低電平,CPOL=1時,

空閑電平為高電平。CPHA是用來決定采樣時刻的,CPHA=0,在每個周期的第一個時鐘沿采樣,

CPHA=1,在每個周期的第二個時鐘沿采樣。

經由上面我們就可以比對實際設備的時序來對SPI的MODE進行配置了。

找到頭文件里的SPI mode的一定義如下:

 

  1.     #define SPI_CPHA 0x01 /* clock phase */ 

  2.     #define SPI_CPOL 0x02 /* clock polarity */ 

  3.     #define SPI_MODE_0 (0|0) /* (original MicroWire) */

  4.     #define SPI_MODE_1 (0|SPI_CPHA) 

  5.     #define SPI_MODE_2 (SPI_CPOL|0) 

  6.     #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)

  7. 大家很容易可以分析出SPI四種模式的配置了吧,后面的速率,字節數就都很好配置了。

  8.     int Spi0Mode = SPI_MODE_2; //配置模式

  9.     ioctl(Spi0Handle, SPI_IOC_WR_MODE, &Spi0Mode);

  10.     ioctl(Spi0Handle, SPI_IOC_RD_MODE, &Spi0Mode);


  11.     struct spi_ioc_transfer sSpi0TR;

  12.     sSpi0TR.speed_hz = 6000000; //配置速率6M

  13.  

    1.    ioctl(Spi0Handle, SPI_IOC_WR_MAX_SPEED_HZ, &sSpi0TR.speed_hz);

    2.    ioctl(Spi0Handle, SPI_IOC_RD_MAX_SPEED_HZ, &sSpi0TR.speed_hz);

  14.      sSpi0TR.bits_per_word =16;  //配置字節數

  15.      sSpi0TR.len = 2;


  16. 配置好了后,就是讀寫了,讀寫需要注意的參數有兩個地方:

    1,tx_buf,rx_buf這兩個參數決定了SPI的讀寫,如果只讀或只寫的情況下,就把另一個不用的參數=NULL。

    2,SPI_IOC_MESSAGE(N)這里的N決定了SPI操作的次數,如果你想連接讀寫幾次SPI就改變N就是了

    1.    ioctl(Spi0Handle, SPI_IOC_WR_BITS_PER_WORD, &sSpi0TR.bits_per_word);

    2.    ioctl(Spi0Handle, SPI_IOC_RD_BITS_PER_WORD, &sSpi0TR.bits_per_word);

 

网信快3首页