深入了解PSoC?4A :基于SCB的串行通信設計
?、?I2C串行通信簡(jiǎn)介
I2C(Inter Integrated Circuit)是一種兩線(xiàn)制的串行通信協(xié)議,被廣泛應用于嵌入式設備中芯片之間的低速互連通路,如單片機,ADC,DAC,EEPROM,溫度傳感器, 電源檢測器等,與UART只能實(shí)現點(diǎn)到點(diǎn)通信模式不同,I2C總線(xiàn)可以方便的構成多機系統和外圍器件擴展系統,器件地址采用硬件設置方法,并通過(guò)軟件進(jìn)行尋址。圖6給出了I2C總線(xiàn)拓撲示意圖。
圖6:I2C總線(xiàn)拓撲示意圖
由圖2可以看出,I2C總線(xiàn)共有兩根信號線(xiàn),SDA串行數據線(xiàn)與SCL串行時(shí)鐘線(xiàn)。SCL保證了總線(xiàn)上所有器件的時(shí)鐘同步,可實(shí)現較快的傳輸速率(標準模式為100Kbps,高速模式可達3.4Mbps)。I2C總線(xiàn)可以同時(shí)連接多個(gè)節點(diǎn)設備,并支持多主從設備模式,但同一時(shí)刻只能由一個(gè)主設備,負責產(chǎn)生SCL同步時(shí)鐘和發(fā)起與結束一次數據傳輸。且主設備和從設備均可作為發(fā)送器(寫(xiě)數據)和接收器(讀數據)。
由于只有一根SDA數據線(xiàn),因此I2C總線(xiàn)只能實(shí)現半雙工傳輸模式。數據的讀/寫(xiě)均由主設備發(fā)起與結束。以讀數據為例,首先主設備發(fā)起數據傳輸,輸出START事件并輸出7bit的從設備地址和讀標志’1’;接下來(lái)主設備釋放SDA,被尋址的從設備拉低SDA作為對主設備的應答(ACK)。然后從設備將通過(guò)SDA向主設備發(fā)送8位數據,主設備接收完成后發(fā)送應答(ACK)信號。當主設備讀完所有的數據,輸出STOP事件,結束本次傳輸。過(guò)程示意如圖7所示。
圖7:I2C總線(xiàn)主設備讀數據示意
當總線(xiàn)上多個(gè)主設備在同一時(shí)刻發(fā)起數據傳輸時(shí),沖突檢測和仲裁機制能夠保證數據不被丟失。當主設備偵測到SDA 上的邏輯值與自身驅動(dòng)的值不符時(shí),則檢測到總線(xiàn)沖突,并放棄對總線(xiàn)的控制。更多I2C 協(xié)議的知識請參考官方的I2C 協(xié)議標準。
?、?基于SCB的I2C通信實(shí)現
在圖2所示的配置框中,將SCB配置為I2C模式,點(diǎn)開(kāi)出現的” I2C”菜單,配置基本的I2C通信參數,如圖8所示;需要注意的是,當配置為Master模式的時(shí)候,不需要設置地址,只有在配置為Slave模式時(shí),才需要7位地址。
I2C只能支持半雙工通信,因此在同一時(shí)刻,數據發(fā)送和接收模式只能選擇一種。與UART相似,數據的發(fā)送和接收都可以用中斷與輪詢(xún)兩種方式來(lái)完成。
PSoC Creator 3.0 本身帶有I2C半雙工數據處理的Example Project;點(diǎn)擊菜單File->Example Project,選擇PSoC 4 Architecture,然后選擇”SCB_I2cCommMaster”(主設備模式)或”SCB_I2cCommSlave”(從設備模式)即可打開(kāi)I2C通信例程。本文以”SCB_I2cCommMaster”為例,打開(kāi)后的原理圖界面如圖9所示。
圖 8:I2C通信參數配置
本例程中的主設備通過(guò)I2C總線(xiàn)發(fā)送0,1,2,3四個(gè)數字給下位機來(lái)控制RGB三色LED燈的循環(huán)點(diǎn)亮。
圖 9: SCB_I2cCommMaster
發(fā)送數據的函數代碼如下:
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);
}
函數發(fā)送三個(gè)字節長(cháng)度的buffer數組給從設備,第一個(gè)字節為起始符字節”PACKET_SOP”,第二個(gè)字節為數據字節”cmd”, 第三個(gè)字節為結束符字節”PACKET_EOP”。數據的發(fā)送通過(guò)函數” I2CM_I2CMasterWriteBuf”來(lái)執行,它尋址從設備并自動(dòng)將數據加載到總線(xiàn)上。接下來(lái)是不斷輪詢(xún)數據發(fā)送的狀態(tài),直到成功發(fā)送完成。接收數據的過(guò)程與此類(lèi)似,您可參考本例程中的數據讀取函數。
5. 基于SCB模塊的SPI串行通信實(shí)現
?、?SPI串行通信簡(jiǎn)介
SPI(Serial Peripheral Interface:串行外設接口)總線(xiàn)是Motorola公司 推出的 一種同步串行接口技術(shù)。SPI總線(xiàn)允許MCU以全雙工的同步串行方式,與各種外圍設備進(jìn)行高速數據通信。主要應用在EEPROM,Flash,RTC(實(shí)時(shí)時(shí)鐘),ADC,DSP以及數字信號解碼器之間。
SPI數據傳輸共有四根信號線(xiàn):SCLK為串行時(shí)鐘信號,由主設備產(chǎn)生,并傳輸到從設備作為同步時(shí)鐘;MOSI/SIMO為主出從入數據信號,由主設備輸出,輸入到從設備。MISO/SOMI為主入從出信號,由從設備輸出,輸入到主設備。SELECTx為從設備選擇信號,由主設備輸出,輸入到從設備,一般為低電平有效。
SPI總線(xiàn)擁有最高的傳輸速率,最低標準速率為500Kbps,最高可達8Mbps,且為全雙工模式,因此特別適合于MCU用來(lái)讀寫(xiě)諸如EEPROM等片外設備中的數據。
圖10給出了一主三從的SPI總線(xiàn)串行通信系統框圖。SPI總線(xiàn)一般為”一主多從”拓撲結構,進(jìn)行數據傳輸時(shí),主設備首先控制相應的一根SELECTx來(lái)選擇從設備,然后主設備向從設備同時(shí)傳輸時(shí)鐘(通過(guò)SCLK)和數據(通過(guò)MOSI/SIMO),從設備對該數據進(jìn)行采樣;如果主設備需要讀數據時(shí),從設備將數據發(fā)送到MISO/SOMI線(xiàn)上,主設備對該數據進(jìn)行采樣。
圖10:SPI總線(xiàn)串行通信系統框圖
在連續傳輸多幀數據時(shí),SELECT 信號一直被拉低。從設備就無(wú)法利用SELECT 的狀態(tài)來(lái)區分每一幀,從而需要一直監測數據,根據主從設備之間約定的協(xié)議找出幀頭和幀尾。當總線(xiàn)結束數據傳輸時(shí),SELECT 被重新拉高,SCLK 無(wú)時(shí)鐘輸出。摩托羅拉定義了SPI 協(xié)議中的四種信號傳輸模式,規定數據在哪個(gè)時(shí)鐘沿被發(fā)送和采樣。通過(guò)配置時(shí)鐘極性(CPOL: Clock POLarity)和時(shí)鐘相位(CPHA: Clock PHAse)來(lái)選擇四種模式中的一種。圖11給出了傳輸模式0(SCLK 空閑態(tài)為低,時(shí)鐘上升沿采樣數據,時(shí)鐘下降沿發(fā)送數據) 下,雙幀(16bit)數據傳輸的波形圖。
圖11:傳輸模式0 下的雙幀數據傳輸波形圖
除了Motorola公司提出的初始版本SPI協(xié)議外,TI(德州儀器)與NSC(國家半導體)也在其基礎上提出了各自的修改版SPI協(xié)議。關(guān)于SPI協(xié)議的詳細信息,您可以參考相關(guān)的理論文獻。
?、?基于SCB的SPI通信實(shí)現
在圖2所示的配置框中,將SCB配置SPI模式,點(diǎn)開(kāi)出現的”SPI Basic”菜單,配置基本的UART通信參數,如圖12所示;”SPI Advanced”菜單下的TX Buffer 和RX Buffer參數保持默認的16個(gè)即可。
圖 12:I2C通信參數配置
SPI可以支持全雙工通信,但是只能有一個(gè)器件為Master。SPI數據幀的長(cháng)度限制較為寬松,可在4bit到16bit之間自由配置。UART相似,數據的發(fā)送和接收都可以用中斷與輪詢(xún)兩種方式來(lái)完成。
PSoC Creator 3.0 本身帶有SPI全雙工數據處理的Example Project;點(diǎn)擊菜單File->Example Project,選擇PSoC 4 Architecture,然后選擇”SCB_SpiComm”即可打開(kāi)SPI通信例程。打開(kāi)后的原理圖界面如圖13所示。
該例程以1Mbps的傳輸速率,8bit每幀的方式將一組固定的數據(如圖13所示)由Master發(fā)送到Slave,并從Slave讀取一組固定的數據(如圖13所示)到Master。
圖 13: SCB_SPIComm 參考例程
數據傳輸的函數代碼如下:
/* 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í)現也很簡(jiǎn)單,分別將需要發(fā)送和接收的數據寫(xiě)入Master和Slave器件相應的寄存器即可。然后就等待SCB模塊自動(dòng)置位傳輸完成標志后即可以將所獲得的數據用于程序處理了。關(guān)于數據幀的長(cháng)度和傳輸故障的處理,用戶(hù)可以根據自己的需要自行配置。
6. 小結
本文主要介紹了PSoC®4A片內SCB模塊的主要功能與配置方法,以及如何使用SCB模塊實(shí)現行UART,I2C和SPI這三種最常用的串行通信協(xié)議,并詳細介紹了PSoC Creator 3.0 開(kāi)發(fā)工具自帶的UART,I2C和SPI通信例程,可以幫助用戶(hù)加快開(kāi)發(fā)過(guò)程,并使用PSoC®4A進(jìn)行簡(jiǎn)潔高效的產(chǎ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
數字通信相關(guān)文章:數字通信原理
通信相關(guān)文章:通信原理
評論