spi讀寫ATT7022E

SPI,是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備接口。SPI,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只佔用四根線,節約了芯片 的管腳,同時爲PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議。

其工作模式有兩種:主模式和從模式,無論那種模式,都支持3Mbit/s的速率,並且還具有傳輸完成標誌和寫衝突保護標誌。

跟SPI密切相關的兩個概念是時鐘極性和時鐘相位。

  • 時鐘極性:表示時鐘信號在空閒時是高電平還是低電平。

  • 時鐘相位:決定數據是在SCK的上升沿採樣還是在SCK的結束沿採樣。

下面以矩力的7022B芯片爲例子,分析SPI工作模式的設置。

在7022B的數據手冊中,指出:在SCK的上升沿放數據,在下降沿取數據。在SCK的下降沿將DIN的數據採樣到7022B中,在SCK的上升沿將7022B的數據放置在DOUT上面輸出。

下面是模擬SPI總線對7022B進行讀取的例子,這個例子生動表示了何時放數據,何時採樣數據。

unsigned long Read_reg3(unsigned char cmd)
{
       int i;
       unsigned long data;
       set_bit(SPI_PORT,SPI_SS);
       clr_bit(SPI_PORT,SPI_SCK);
       clr_bit(SPI_PORT,SPI_SS);
       for(i=0;i<8;i++)
       {
           set_bit(SPI_PORT,SPI_SCK);
              if(cmd&0x80)
              {
                set_bit(SPI_PORT,SPI_MOSI);
              }
              else
              {
                clr_bit(SPI_PORT,SPI_MOSI);
              }
              cmd=cmd<<1;
              nop;
              nop;
              clr_bit(SPI_PORT,SPI_SCK);nop;
       }
       clr_bit(SPI_PORT,SPI_SCK);
       _delay_us(3);
       data=0;
       for(i=0;i<24;i++)
       {
           set_bit(SPI_PORT,SPI_SCK);
              nop;
              nop;
              nop;
              if(PINB&(1
              {
                data+=1;
              }else
              {
                data+=0;
              }
              data=data<<1;
              nop;
              clr_bit(SPI_PORT,SPI_SCK);
       }
       set_bit(SPI_PORT,SPI_SS);
       return data;
}

如果採用硬件SPI,則需要對單片機(ATMEGA16)SPI寄存器進行設置,本例子中,需要設置SPCR=0x57;//MSB在先01010011

時鐘極性爲0,因爲空閒時CLK電平爲低。

時鐘相位設置爲1,因爲是下降沿採樣數據,上升沿放數據。

我 對SPI的理解錯在採樣的概念上。比如,下降沿採樣,當主機接收時,我覺得應該是先有下降沿,再有采樣。其實,正確的理解是:採樣是對主機從機都一致的概 念,採樣之前必須把數據準備好。當主機接收數據時,主機也是下降沿採樣,但是在下降沿發生之前,必須準備好數據,換句話說,從機在上升沿發生後,就要把數 據放出來,爲下降沿採樣做好準備。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章