新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > SPI、IIC、UART、can區(qū)別

SPI、IIC、UART、can區(qū)別

作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

例子:
假設(shè)主機(jī)和從機(jī)初始化就緒:并且主機(jī)的sbuff=0xaa,從機(jī)的sbuff=0x55,下面將分步對(duì)spi的8個(gè)時(shí)鐘周期的數(shù)據(jù)情況演示一遍:假設(shè)上升沿發(fā)送數(shù)據(jù)

本文引用地址:http://m.butianyuan.cn/article/201611/322756.htm

脈沖主機(jī)sbuff從機(jī)sbuffsdisdo
0101010100101010100
1上0101010x1010101x01
1下010101001010101101
2上1010100x0101011x10
2下101010010101011010
3上0101001x1010110x01
3下010100101010110101
4上1010010x0101101x10
4下101001010101101010
5上0100101x1011010x01
5下010010101011010101
6上1001010x0110101x10
6下100101010110101010
7上0010101x1101010x01
7下001010101101010101
8上0101010x1010101x10
8下010101011010101010

這樣就完成了兩個(gè)寄存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對(duì)于主機(jī)而言的。其中ss引腳作為主機(jī)的時(shí)候,從機(jī)可以把它拉底被動(dòng)選為從機(jī),作為從機(jī)的是時(shí)候,可以作為片選腳用。根據(jù)以上分析,一個(gè)完整的傳送周期是16位,即兩個(gè)字節(jié),因?yàn)?,首先主機(jī)要發(fā)送命令過去,然后從機(jī)根據(jù)主機(jī)的名準(zhǔn)備數(shù)據(jù),主機(jī)在下一個(gè)8位時(shí)鐘周期才把數(shù)據(jù)讀回來

SPI 總線是Motorola公司推出的三線同步接口,同步串行3線方式進(jìn)行通信:一條時(shí)鐘線SCK,一條數(shù)據(jù)輸入線MOSI,一條數(shù)據(jù)輸出線MISO;用于CPU與各種外圍器件進(jìn)行全雙工、同步串行通訊。SPI主要特點(diǎn)有:可以同時(shí)發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機(jī)或從機(jī)工作;提供頻率可編程時(shí)鐘;發(fā)送結(jié)束中斷標(biāo)志;寫沖突保護(hù);總線競(jìng)爭(zhēng)保護(hù)等。圖3示出SPI總線工作的四種方式,其中使用的最為廣泛的是SPI0和SPI3方式(實(shí)線表示):

圖2SPI總線四種工作方式

SPI模塊為了和外設(shè)進(jìn)行數(shù)據(jù)交換,根據(jù)外設(shè)工作要求,其輸出串行同步時(shí)鐘極性和相位可以進(jìn)行配置,時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒有重大的影響。如果CPOL=0,串行同步時(shí)鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時(shí)鐘的空閑狀態(tài)為高電平。時(shí)鐘相位(CPHA)能夠配置用于選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。如果CPHA=0,在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;如果CPHA=1,在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI主模塊和與之通信的外設(shè)音時(shí)鐘相位和極性應(yīng)該一致。SPI接口時(shí)序如圖3、圖4所示。

二,.SPI功能模塊的設(shè)計(jì)

根據(jù)功能定義及SPI的工作原理,將整個(gè)IP Core分為8個(gè)子模塊:uC接口模塊、時(shí)鐘分頻模塊、發(fā)送數(shù)據(jù)FIFO模塊、接收數(shù)據(jù)FIFO模塊、狀態(tài)機(jī)模塊、發(fā)送數(shù)據(jù)邏輯模塊、接收數(shù)據(jù)邏輯模塊以及中斷形式模塊。

深入分析SPI的四種傳輸協(xié)議可以發(fā)現(xiàn),根據(jù)一種協(xié)議,只要對(duì)串行同步時(shí)鐘進(jìn)行轉(zhuǎn)換,就能得到其余的三種協(xié)議。為了簡(jiǎn)化設(shè)計(jì)規(guī)定,如果要連續(xù)傳輸多個(gè)數(shù)據(jù),在兩個(gè)數(shù)據(jù)傳輸之間插入一個(gè)串行時(shí)鐘的空閑等待,這樣狀態(tài)機(jī)只需兩種狀態(tài)(空閑和工作)就能正確工作。

SPI協(xié)議心得

SPI接口時(shí)鐘配置心得:
在主設(shè)備這邊配置SPI接口時(shí)鐘的時(shí)候一定要弄清楚從設(shè)備的時(shí)鐘要求,因?yàn)橹髟O(shè)備這邊的時(shí)鐘極性和相位都是以從設(shè)備為基準(zhǔn)的。因此在時(shí)鐘極性的配置上一定要搞清楚從設(shè)備是在時(shí)鐘的上升沿還是下降沿接收數(shù)據(jù),是在時(shí)鐘的下降沿還是上升沿輸出數(shù)據(jù)。但要注意的是,由于主設(shè)備的SDO連接從設(shè)備的SDI,從設(shè)備的SDO連接主設(shè)備的SDI,從設(shè)備SDI接收的數(shù)據(jù)是主設(shè)備的SDO發(fā)送過來的,主設(shè)備SDI接收的數(shù)據(jù)是從設(shè)備SDO發(fā)送過來的,所以主設(shè)備這邊SPI時(shí)鐘極性的配置(即SDO的配置)跟從設(shè)備的SDI接收數(shù)據(jù)的極性是相反的,跟從設(shè)備SDO發(fā)送數(shù)據(jù)的極性是相同的。下面這段話是Sychip Wlan8100 Module Spec上說的,充分說明了時(shí)鐘極性是如何配置的:
The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.
意思是:主設(shè)備在時(shí)鐘的下降沿發(fā)送數(shù)據(jù),從設(shè)備在時(shí)鐘的上升沿接收數(shù)據(jù)。因此主設(shè)備這邊SPI時(shí)鐘極性應(yīng)該配置為下降沿有效。
又如,下面這段話是摘自LCD Driver IC SSD1289:
SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.
意思是:從設(shè)備SSD1289在時(shí)鐘的上升沿接收數(shù)據(jù),而且是按照從高位到地位的順序接收數(shù)據(jù)的。因此主設(shè)備的SPI時(shí)鐘極性同樣應(yīng)該配置為下降沿有效。
時(shí)鐘極性和相位配置正確后,數(shù)據(jù)才能夠被準(zhǔn)確的發(fā)送和接收。因此應(yīng)該對(duì)照從設(shè)備的SPI接口時(shí)序或者Spec文檔說明來正確配置主設(shè)備的時(shí)鐘。

posted @2009-02-22 22:51陳廣強(qiáng) 閱讀(195) |評(píng)論(0)| 編輯
IIC一例子

IIC

型號(hào)容量器件/業(yè)面尋址字節(jié)可尋址位模塊

24C01128B(1010)(A2)(A1)(A0)(0或1)3128B
24C02256B(1010)(A2)(A1)(A0)(0或1)3256B
24C04512B(1010)(A2)(A1)(P0)(0或1)22X256B
24C081024B(1010)(A2)(P1)(P0)(0或1)14X256B
24C162048B(1010)(P2)(P1)(P0)(0或1)08X256B


解析:IIC總線接口器件24C系列非易失性存儲(chǔ)器與89C51接口采用軟件模擬IIC。24C系列
存儲(chǔ)器器件地址統(tǒng)一為1010XXXX,不要問為什么,這是廠家出廠的時(shí)候規(guī)定好的了。至
于24C的引腳功能和89C51的接口我就不多說了,本文的重點(diǎn)主要是如何應(yīng)用。
上面說了,器件的地址字節(jié)的高位是1010,那么低4位呢?先說最后一位吧,最后一
位為0的時(shí)候表示89C51要寫數(shù)據(jù)入存儲(chǔ)器,1的時(shí)候表示要從存儲(chǔ)器讀數(shù)據(jù)。還剩下中
三位A2,A1和A0。它們的高低電平取決于24C的A2,A1,A0是接高電平還是接地。A2,
A1 和A0有8個(gè)組合,因此可以擴(kuò)展8個(gè)相同的器件,根據(jù)A2、A1、A0的不同,一樣的器件
也會(huì)有不同的地址。那么是不是每一個(gè)24C都可以擴(kuò)展8個(gè)呢?不是的。注意上表,24C01
有三個(gè)可尋址位,A2,A1,A0,所以可以擴(kuò)展8個(gè),24C02也一樣。而04則只可以擴(kuò)展4個(gè)
08只可以擴(kuò)展2個(gè),16就沒有擴(kuò)展了,只可以掛一片24C16。為什么呢?因?yàn)樵L問24C系列
除了訪問器件地址外,還要訪問器件內(nèi)的字節(jié)的地址。例如24C01,要對(duì)其操作,就先選
選中它的地址,然后操作第一個(gè)字節(jié)或其他字節(jié),這些字節(jié)也是有地址的,分模塊,用
一個(gè)字節(jié)表示,最多可以操作256個(gè)字節(jié)。24C01和24C02不大于256個(gè)字節(jié),對(duì)其操作就
簡(jiǎn)單得多了。但24C04,08和16呢?他們都大于256個(gè)字節(jié),怎么辦?分模塊。注意到上
表的P0,P1,P3沒有?把04分成兩個(gè)模塊,2X256B,08四個(gè)模塊,16就八個(gè)模塊。究竟
怎么
模塊操作呢?拿24C08為例,有A2 P1 P0。A2只可以0或1,所以只能擴(kuò)展2個(gè)24C08,其
內(nèi)有4個(gè)256字節(jié)的模塊,要操作哪個(gè)模塊取決于P1,P0的組合。例如,24C08的地址字節(jié)
為1010000X第一個(gè)字節(jié)地址為0,第256個(gè)地址為255,如果地址字節(jié)是1010001X,那么第
256個(gè)字節(jié)的地址為0,第512個(gè)字節(jié)的地址為255。就如此。
再用24C08舉例說明如何擴(kuò)展,當(dāng)兩個(gè)24C08的A2腳分別接高電平和地的時(shí)候,就可
以了,這樣就擴(kuò)展了,他們的器件地址分別是1010000X和1010100X。當(dāng)要讀第一個(gè)(A2
接地)
24C08的的第一個(gè)模塊的數(shù)據(jù)時(shí)候,單片機(jī)先發(fā)送地址字節(jié)10100001;當(dāng)要把數(shù)據(jù)寫
進(jìn)第二個(gè)(A2接高電平)24C08的第二個(gè)模塊的時(shí)候,應(yīng)發(fā)送10101010地址字節(jié)。
不再說了,再說我瘋了,看程序吧。這是對(duì)24C16操作的例子。*/
復(fù)制內(nèi)容到剪貼板
代碼:
#include

#define WRITE 0xA0
#define READ0xA1
#define BLOCK_SIZE100
#define uchar unsigned char
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE

sbit SCL=P3^4;//T0
sbit SDA=P3^5;//T1

uchar xdata EAROMImage[BLOCK_SIZE]={0};


void delayi2c( void ) {
;
}


void I_start( void ) {
SCL = HIGH ;
delayi2c() ;
SDA = LOW ;
delayi2c() ;
SCL = LOW ;
delayi2c() ;
}


void I_stop( void ) {
SDA = LOW ;
delayi2c() ;
SCL = HIGH ;
delayi2c() ;
SDA = HIGH ;
delayi2c() ;
SCL = LOW ;
delayi2c() ;
}

//初始化
void I_init( void ) {
SCL = LOW ;
I_stop() ;
}


bit I_clock( void ) {
bit sample ;
SCL = HIGH ;
delayi2c() ;
sample = SDA ;
SCL = LOW ;
delayi2c() ;
return ( sample ) ;
}


//發(fā)送8位數(shù)據(jù)
bit I_send( uchar I_data ) {
uchar i ;

for ( i=0 ; i<8 ; i++ ) {
SDA = (bit)( I_data & 0x80 ) ;
I_data = I_data << 1 ;
I_clock() ;
}

SDA = HIGH ;
return ( ~I_clock() );
}

//接受8位數(shù)據(jù)
uchar I_receive( void ) {
uchar I_data = 0 ;
register uchar i ;
for ( i=0 ; i<8 ; i++ ) {
I_data *= 2 ;
if (I_clock()) I_data++ ;
}
return ( I_data ) ;
}

//應(yīng)答
void I_Ack( void ) {
SDA = LOW;
I_clock();
SDA = HIGH;
}



關(guān)鍵詞: SPIIICUARTca

評(píng)論


技術(shù)專區(qū)

關(guān)閉