深入了解PSoC?4A :基于SCB的串行通信設(shè)計(jì)
4. 基于SCB模塊的I2C串行通信實(shí)現(xiàn)
本文引用地址:http://m.butianyuan.cn/article/264012.htm?、?I2C串行通信簡介
I2C(Inter Integrated Circuit)是一種兩線制的串行通信協(xié)議,被廣泛應(yīng)用于嵌入式設(shè)備中芯片之間的低速互連通路,如單片機(jī),ADC,DAC,EEPROM,溫度傳感器, 電源檢測器等,與UART只能實(shí)現(xiàn)點(diǎn)到點(diǎn)通信模式不同,I2C總線可以方便的構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng),器件地址采用硬件設(shè)置方法,并通過軟件進(jìn)行尋址。圖6給出了I2C總線拓?fù)涫疽鈭D。
圖6:I2C總線拓?fù)涫疽鈭D
由圖2可以看出,I2C總線共有兩根信號(hào)線,SDA串行數(shù)據(jù)線與SCL串行時(shí)鐘線。SCL保證了總線上所有器件的時(shí)鐘同步,可實(shí)現(xiàn)較快的傳輸速率(標(biāo)準(zhǔn)模式為100Kbps,高速模式可達(dá)3.4Mbps)。I2C總線可以同時(shí)連接多個(gè)節(jié)點(diǎn)設(shè)備,并支持多主從設(shè)備模式,但同一時(shí)刻只能由一個(gè)主設(shè)備,負(fù)責(zé)產(chǎn)生SCL同步時(shí)鐘和發(fā)起與結(jié)束一次數(shù)據(jù)傳輸。且主設(shè)備和從設(shè)備均可作為發(fā)送器(寫數(shù)據(jù))和接收器(讀數(shù)據(jù))。
由于只有一根SDA數(shù)據(jù)線,因此I2C總線只能實(shí)現(xiàn)半雙工傳輸模式。數(shù)據(jù)的讀/寫均由主設(shè)備發(fā)起與結(jié)束。以讀數(shù)據(jù)為例,首先主設(shè)備發(fā)起數(shù)據(jù)傳輸,輸出START事件并輸出7bit的從設(shè)備地址和讀標(biāo)志’1’;接下來主設(shè)備釋放SDA,被尋址的從設(shè)備拉低SDA作為對(duì)主設(shè)備的應(yīng)答(ACK)。然后從設(shè)備將通過SDA向主設(shè)備發(fā)送8位數(shù)據(jù),主設(shè)備接收完成后發(fā)送應(yīng)答(ACK)信號(hào)。當(dāng)主設(shè)備讀完所有的數(shù)據(jù),輸出STOP事件,結(jié)束本次傳輸。過程示意如圖7所示。
圖7:I2C總線主設(shè)備讀數(shù)據(jù)示意
當(dāng)總線上多個(gè)主設(shè)備在同一時(shí)刻發(fā)起數(shù)據(jù)傳輸時(shí),沖突檢測和仲裁機(jī)制能夠保證數(shù)據(jù)不被丟失。當(dāng)主設(shè)備偵測到SDA 上的邏輯值與自身驅(qū)動(dòng)的值不符時(shí),則檢測到總線沖突,并放棄對(duì)總線的控制。更多I2C 協(xié)議的知識(shí)請(qǐng)參考官方的I2C 協(xié)議標(biāo)準(zhǔn)。
?、?基于SCB的I2C通信實(shí)現(xiàn)
在圖2所示的配置框中,將SCB配置為I2C模式,點(diǎn)開出現(xiàn)的” I2C”菜單,配置基本的I2C通信參數(shù),如圖8所示;需要注意的是,當(dāng)配置為Master模式的時(shí)候,不需要設(shè)置地址,只有在配置為Slave模式時(shí),才需要7位地址。
I2C只能支持半雙工通信,因此在同一時(shí)刻,數(shù)據(jù)發(fā)送和接收模式只能選擇一種。與UART相似,數(shù)據(jù)的發(fā)送和接收都可以用中斷與輪詢兩種方式來完成。
PSoC Creator 3.0 本身帶有I2C半雙工數(shù)據(jù)處理的Example Project;點(diǎn)擊菜單File->Example Project,選擇PSoC 4 Architecture,然后選擇”SCB_I2cCommMaster”(主設(shè)備模式)或”SCB_I2cCommSlave”(從設(shè)備模式)即可打開I2C通信例程。本文以”SCB_I2cCommMaster”為例,打開后的原理圖界面如圖9所示。
圖 8:I2C通信參數(shù)配置
本例程中的主設(shè)備通過I2C總線發(fā)送0,1,2,3四個(gè)數(shù)字給下位機(jī)來控制RGB三色LED燈的循環(huán)點(diǎn)亮。
圖 9: SCB_I2cCommMaster
發(fā)送數(shù)據(jù)的函數(shù)代碼如下:
uint32 WriteCommandPacket(uint8 cmd)
{
uint8 buffer[BUFFER_SIZE];
uint32 status = TRANSFER_ERROR;
/* Initialize buffer with packet */
buffer[PACKET_SOP_POS] = PACKET_SOP;
buffer[PACKET_CMD_POS] = cmd;
buffer[PACKET_EOP_POS] = PACKET_EOP;
(void) I2CM_I2CMasterWriteBuf(I2C_SLAVE_ADDR, buffer, PACKET_SIZE, I2CM_I2C_MODE_COMPLETE_XFER);
while (0u == (I2CM_I2CMasterStatus() & I2CM_I2C_MSTAT_WR_CMPLT))
{
/* Waits until master completes write transfer */
}
/* Displays transfer status */
if (0u == (I2CM_I2C_MSTAT_ERR_XFER & I2CM_I2CMasterStatus()))
{
RGB_LED_ON_GREEN;
/* Check if all bytes was written */
if(I2CM_I2CMasterGetWriteBufSize() == BUFFER_SIZE)
{
status = TRANSFER_CMPLT;
}
}
else
{
RGB_LED_ON_RED;
}
(void) I2CM_I2CMasterClearStatus();
return (status);
}
函數(shù)發(fā)送三個(gè)字節(jié)長度的buffer數(shù)組給從設(shè)備,第一個(gè)字節(jié)為起始符字節(jié)”PACKET_SOP”,第二個(gè)字節(jié)為數(shù)據(jù)字節(jié)”cmd”, 第三個(gè)字節(jié)為結(jié)束符字節(jié)”PACKET_EOP”。數(shù)據(jù)的發(fā)送通過函數(shù)” I2CM_I2CMasterWriteBuf”來執(zhí)行,它尋址從設(shè)備并自動(dòng)將數(shù)據(jù)加載到總線上。接下來是不斷輪詢數(shù)據(jù)發(fā)送的狀態(tài),直到成功發(fā)送完成。接收數(shù)據(jù)的過程與此類似,您可參考本例程中的數(shù)據(jù)讀取函數(shù)。
5. 基于SCB模塊的SPI串行通信實(shí)現(xiàn)
① SPI串行通信簡介
SPI(Serial Peripheral Interface:串行外設(shè)接口)總線是Motorola公司 推出的 一種同步串行接口技術(shù)。SPI總線允許MCU以全雙工的同步串行方式,與各種外圍設(shè)備進(jìn)行高速數(shù)據(jù)通信。主要應(yīng)用在EEPROM,F(xiàn)lash,RTC(實(shí)時(shí)時(shí)鐘),ADC,DSP以及數(shù)字信號(hào)解碼器之間。
SPI數(shù)據(jù)傳輸共有四根信號(hào)線:SCLK為串行時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生,并傳輸?shù)綇脑O(shè)備作為同步時(shí)鐘;MOSI/SIMO為主出從入數(shù)據(jù)信號(hào),由主設(shè)備輸出,輸入到從設(shè)備。MISO/SOMI為主入從出信號(hào),由從設(shè)備輸出,輸入到主設(shè)備。SELECTx為從設(shè)備選擇信號(hào),由主設(shè)備輸出,輸入到從設(shè)備,一般為低電平有效。
SPI總線擁有最高的傳輸速率,最低標(biāo)準(zhǔn)速率為500Kbps,最高可達(dá)8Mbps,且為全雙工模式,因此特別適合于MCU用來讀寫諸如EEPROM等片外設(shè)備中的數(shù)據(jù)。
圖10給出了一主三從的SPI總線串行通信系統(tǒng)框圖。SPI總線一般為”一主多從”拓?fù)浣Y(jié)構(gòu),進(jìn)行數(shù)據(jù)傳輸時(shí),主設(shè)備首先控制相應(yīng)的一根SELECTx來選擇從設(shè)備,然后主設(shè)備向從設(shè)備同時(shí)傳輸時(shí)鐘(通過SCLK)和數(shù)據(jù)(通過MOSI/SIMO),從設(shè)備對(duì)該數(shù)據(jù)進(jìn)行采樣;如果主設(shè)備需要讀數(shù)據(jù)時(shí),從設(shè)備將數(shù)據(jù)發(fā)送到MISO/SOMI線上,主設(shè)備對(duì)該數(shù)據(jù)進(jìn)行采樣。
圖10:SPI總線串行通信系統(tǒng)框圖
在連續(xù)傳輸多幀數(shù)據(jù)時(shí),SELECT 信號(hào)一直被拉低。從設(shè)備就無法利用SELECT 的狀態(tài)來區(qū)分每一幀,從而需要一直監(jiān)測數(shù)據(jù),根據(jù)主從設(shè)備之間約定的協(xié)議找出幀頭和幀尾。當(dāng)總線結(jié)束數(shù)據(jù)傳輸時(shí),SELECT 被重新拉高,SCLK 無時(shí)鐘輸出。摩托羅拉定義了SPI 協(xié)議中的四種信號(hào)傳輸模式,規(guī)定數(shù)據(jù)在哪個(gè)時(shí)鐘沿被發(fā)送和采樣。通過配置時(shí)鐘極性(CPOL: Clock POLarity)和時(shí)鐘相位(CPHA: Clock PHAse)來選擇四種模式中的一種。圖11給出了傳輸模式0(SCLK 空閑態(tài)為低,時(shí)鐘上升沿采樣數(shù)據(jù),時(shí)鐘下降沿發(fā)送數(shù)據(jù)) 下,雙幀(16bit)數(shù)據(jù)傳輸?shù)牟ㄐ螆D。
圖11:傳輸模式0 下的雙幀數(shù)據(jù)傳輸波形圖
除了Motorola公司提出的初始版本SPI協(xié)議外,TI(德州儀器)與NSC(國家半導(dǎo)體)也在其基礎(chǔ)上提出了各自的修改版SPI協(xié)議。關(guān)于SPI協(xié)議的詳細(xì)信息,您可以參考相關(guān)的理論文獻(xiàn)。
② 基于SCB的SPI通信實(shí)現(xiàn)
在圖2所示的配置框中,將SCB配置SPI模式,點(diǎn)開出現(xiàn)的”SPI Basic”菜單,配置基本的UART通信參數(shù),如圖12所示;”SPI Advanced”菜單下的TX Buffer 和RX Buffer參數(shù)保持默認(rèn)的16個(gè)即可。
圖 12:I2C通信參數(shù)配置
SPI可以支持全雙工通信,但是只能有一個(gè)器件為Master。SPI數(shù)據(jù)幀的長度限制較為寬松,可在4bit到16bit之間自由配置。UART相似,數(shù)據(jù)的發(fā)送和接收都可以用中斷與輪詢兩種方式來完成。
PSoC Creator 3.0 本身帶有SPI全雙工數(shù)據(jù)處理的Example Project;點(diǎn)擊菜單File->Example Project,選擇PSoC 4 Architecture,然后選擇”SCB_SpiComm”即可打開SPI通信例程。打開后的原理圖界面如圖13所示。
該例程以1Mbps的傳輸速率,8bit每幀的方式將一組固定的數(shù)據(jù)(如圖13所示)由Master發(fā)送到Slave,并從Slave讀取一組固定的數(shù)據(jù)(如圖13所示)到Master。
圖 13: SCB_SPIComm 參考例程
數(shù)據(jù)傳輸?shù)暮瘮?shù)代碼如下:
/* Writing data into the SPIS TX software buffer */
SPIS_SpiUartWriteTxData(0x11u);
SPIS_SpiUartWriteTxData(0x22u);
SPIS_SpiUartWriteTxData(0x33u);
SPIS_SpiUartWriteTxData(0x44u);
SPIS_SpiUartWriteTxData(0x55u);
SPIS_SpiUartWriteTxData(0x66u);
SPIS_SpiUartWriteTxData(0x77u);
SPIS_SpiUartWriteTxData(0x88u);
SPIM_ClearMasterInterruptSource(SPIM_INTR_MASTER_SPI_DONE);
/* Writing data into the SPIM software buffer */
SPIM_SpiUartWriteTxData(0x99u);
SPIM_SpiUartWriteTxData(0xAAu);
SPIM_SpiUartWriteTxData(0xBBu);
SPIM_SpiUartWriteTxData(0xCCu);
SPIM_SpiUartWriteTxData(0xDDu);
SPIM_SpiUartWriteTxData(0xEEu);
SPIM_SpiUartWriteTxData(0xFFu);
SPIM_SpiUartWriteTxData(0x12u);
/*
* We need to know the moment when SPI communication is completed
* to display received data. SPIM_INTR_MASTER_SPI_DONE status should be polled.
*/
while(0u == (SPIM_GetMasterInterruptSource() & SPIM_INTR_MASTER_SPI_DONE))
{
/* Wait while Master completes transaction */
}
可以看出SPI串行通信的代碼實(shí)現(xiàn)也很簡單,分別將需要發(fā)送和接收的數(shù)據(jù)寫入Master和Slave器件相應(yīng)的寄存器即可。然后就等待SCB模塊自動(dòng)置位傳輸完成標(biāo)志后即可以將所獲得的數(shù)據(jù)用于程序處理了。關(guān)于數(shù)據(jù)幀的長度和傳輸故障的處理,用戶可以根據(jù)自己的需要自行配置。
6. 小結(jié)
本文主要介紹了PSoC®4A片內(nèi)SCB模塊的主要功能與配置方法,以及如何使用SCB模塊實(shí)現(xiàn)行UART,I2C和SPI這三種最常用的串行通信協(xié)議,并詳細(xì)介紹了PSoC Creator 3.0 開發(fā)工具自帶的UART,I2C和SPI通信例程,可以幫助用戶加快開發(fā)過程,并使用PSoC®4A進(jìn)行簡潔高效的產(chǎn)品設(shè)計(jì)。
參考文獻(xiàn)
[1]. PSoC® 4: PSoC 4200 Family Datasheet
[2]. PSoC® 4 Architecture TRM
[3]. PSoC 4100/4200 Family PSoC® 4 Registers TRM (Technical Reference Manual)
[4]. UM10204 I2C-bus specification and user manual
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評(píng)論