<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 深入了解PSoC?4A :基于SCB的串行通信設計

深入了解PSoC?4A :基于SCB的串行通信設計

作者: 時(shí)間:2014-10-16 來(lái)源:電子產(chǎn)品世界 收藏

  4. 基于模塊的I2C實(shí)現

本文引用地址:http://dyxdggzs.com/article/264012.htm

 ?、?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é)議標準。

 ?、?基于的I2C通信實(shí)現

  在圖2所示的配置框中,將配置為I2C模式,點(diǎn)開(kāi)出現的” I2C”菜單,配置基本的I2C通信參數,如圖8所示;需要注意的是,當配置為Master模式的時(shí)候,不需要設置地址,只有在配置為Slave模式時(shí),才需要7位地址。

  I2C只能支持半雙工通信,因此在同一時(shí)刻,數據發(fā)送和接收模式只能選擇一種。與UART相似,數據的發(fā)送和接收都可以用中斷與輪詢(xún)兩種方式來(lái)完成。

   Creator 3.0 本身帶有I2C半雙工數據處理的Example Project;點(diǎn)擊菜單File->Example Project,選擇 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)完成。

   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)文章:通信原理



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: PSoC SCB 串行通信

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>