STM32 I2C總線通信與SPI總線通信專題講解_第1頁
STM32 I2C總線通信與SPI總線通信專題講解_第2頁
STM32 I2C總線通信與SPI總線通信專題講解_第3頁
STM32 I2C總線通信與SPI總線通信專題講解_第4頁
STM32 I2C總線通信與SPI總線通信專題講解_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第第頁STM32I2C總線通信與SPI總線通信專題講解

總線介紹:(I2C)(In(te)r-IntegratedCircuit)總線(也稱I(IC)或I2C)是由PHILIPS公司開發(fā)的兩線式串行總線(單雙工),用于連接微(控制器)及其外圍設(shè)備,在這兩根線上可以掛很多設(shè)備,同一時刻只能有一個節(jié)點處于主機模式,其他節(jié)點處于從機模式,總線上數(shù)據(jù)的傳送都由主機發(fā)起。I2C總線沒有片選(信號)線,所以需要通過協(xié)議來找到對應(yīng)操作的(芯片)。是微(電子)(通信)控制領(lǐng)域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有(接口)線少,控制方式簡單,期間封裝形式少,通信速率高等優(yōu)點。總線特征:1.兩條總線線路:一條串行數(shù)據(jù)(SD)A,一條串行(時鐘)線SCL(主從設(shè)備使用同一時鐘,屬于同步通信)來完成數(shù)據(jù)的傳輸及外圍器件的擴展

2.I2C總線上的每一個設(shè)備都可以作為主設(shè)備或者從設(shè)備,而且每一個設(shè)備都會對應(yīng)一個唯一的地址,通常是7位,有時候是10位

3.I2C總線數(shù)據(jù)傳輸速率在標準模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s。在開發(fā)配置的時候,最好檢查從設(shè)備的傳輸速率從而對主設(shè)備(一般是(MCU))進行相應(yīng)的配置。一般通過I2C總線接口可(編程)時鐘來實現(xiàn)傳輸速率的調(diào)整,同時也跟所接的上拉(電阻)的阻值有關(guān)。

4.I2C總線上的主設(shè)備與從設(shè)備之間以字節(jié)(8位)為單位進行單雙工的數(shù)據(jù)傳輸。

拓撲結(jié)構(gòu)——總線型I2C總線在物理連接上分別由SDA(串行數(shù)據(jù)線)和SCL(串行時鐘線)及上拉電阻組成,SCL由主機發(fā)出,SCL越快,通訊速率越快。通信原理是通過對SCL和SDA線高低電平時序的控制來產(chǎn)生I2C總線協(xié)議所需要的信號進行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時,這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。

//w25x16.c#include"w25x16.h"externSPI_HandleTypeDefhspi1;/*讀寫一個字節(jié)函數(shù),因為SPI讀和寫同時完成*//*發(fā)送數(shù)據(jù)一定會接收到一個數(shù)據(jù)*/uint8_tsFLASH_SendByte(uint8_tbyte){uint8_tTX_DATA=byte;uint8_tRX_DATA=0;HAL_SPI_TransmitReceive(returnRX_DATA;}/*等待擦除或者寫數(shù)據(jù)完成*/voidsFLASH_W(ai)(tF)orEnd(void){uint8_tsr_value=0;sFLASH_CS_LOW();sFLASH_SendByte(sFLASH_CMD_RDSR);//讀S0的值,為1表示忙碌,為0表示停止do{//發(fā)一個空字節(jié),得到S0的值sr_value=sFLASH_SendByte(sFLASH_DUMMY_BYTE);}while(sr_valuesFLASH_CS_HIGH();}voidsFLASH_WriteEnable(void){sFLASH_CS_LOW();sFLASH_SendByte(sFLASH_CMD_WREN);sFLASH_CS_HIGH();}/*讀設(shè)備ID*/uint16_tsFLASH_ReadID(void){uint16_tFLASH_ID;uint8_ttemp0,temp1;sFLASH_CS_LOW();sFLASH_SendByte(W25X_ManufactDeviceID);//讀設(shè)備指令后要發(fā)24位地址,所以要發(fā)三次sFLASH_SendByte(sFLASH_DUMMY_BYTE);sFLASH_SendByte(sFLASH_DUMMY_BYTE);sFLASH_SendByte(sFLASH_DUMMY_BYTE);//制造商IDtemp0=sFLASH_SendByte(sFLASH_DUMMY_BYTE);//設(shè)備商IDtemp1=sFLASH_SendByte(sFLASH_DUMMY_BYTE);sFLASH_CS_HIGH();FLASH_ID=(temp0

>16)sFLASH_SendByte((SectorAddr>

>8)//傳送中8位sFLASH_SendByte((SectorAddr>

>0)//傳送低8位sFLASH_CS_HIGH();/*讀狀態(tài)寄存器,等待擦除完成*/sFLASH_WaitForEnd();}//讀數(shù)據(jù)//讀命令和讀地址發(fā)送后,芯片內(nèi)部會自動不斷遞增讀數(shù)據(jù)voidsFLASH_ReadBuffer(uint8_t*pBuffer,uint32_tReadAddr,uint32_tNumByteToRead){sFLASH_CS_LOW();sFLASH_SendByte(sFLASH_CMD_READ);sFLASH_SendByte((ReadAddr>

>16)//傳送高8位sFLASH_SendByte((ReadAddr>

>8)//傳送中8位sFLASH_SendByte((ReadAddr>

>0)//傳送低8位while(NumByteToRead--){*pBuffer=sFLASH_SendByte(sFLASH_DUMMY_BYTE);pBuffer++;}sFLASH_CS_HIGH();}//寫一頁最多只能寫256個字節(jié),一個扇區(qū)16頁,一個塊16個扇區(qū)voidsFLASH_WritePage(uint8_t*pBuffer,uint32_tWriteAddr,uint32_tNumByteToWrite){if(NumByteToWrite>sFLASH_SPI_PAGESIZE){NumByteToWrite=sFLASH_SPI_PAGESIZE;printf("寫數(shù)據(jù)量過大,超過一頁大小n");}sFLASH_WriteEnable();//開啟寫使能sFLASH_CS_LOW();sFLASH_SendByte(sFLASH_CMD_WRITE);sFLASH_SendByte((WriteAddr>

>16)//傳送高8位sFLASH_SendByte((WriteAddr>

>8)//傳送中8位sFLASH_SendByte((WriteAddr>

>0)//傳送低8位while(NumByteToWrite--){sFLASH_SendByte(*pBuffer);pBuffer++;}sFLASH_CS_HIGH();/*擦除和寫數(shù)據(jù)都涉及到寫動作,一定要等待完成*/sFLASH_WaitForEnd();}//寫任意地址、任意長度voidsFLASH_WriteBuffer(uint8_t*pBuffer,uint32_tWriteAddr,uint32_tNumByteToWrite){uint16_tNumOfPage,NumOfBytes,count,offset;//求WriteAddr在某一頁的位置offset=WriteAddr%sFLASH_SPI_PAGESIZE;//求某一頁剩余的大小count=sFLASH_SPI_PAGESIZE-offset;/*處理頁不對齊的情況,防止頁內(nèi)覆蓋*///先把某一頁剩下的部分寫掉,之后的就能新頁的起始處開始寫/*offset有值表示需要頁對齊,如果要寫的字節(jié)數(shù)小于某一頁剩余的部分,那就無需對齊*//*這兩個條件必須同時滿足*/if(offsetNumByteToWrite-=count;//去掉已經(jīng)寫了的,從新頁開始pBuffer+=count;WriteAddr+=count;}/*最多可分多少頁*/NumOfPage=NumByteToWrite/sFLASH_SPI_PAGESIZE;/*剩余多少字節(jié)*/NumOfBytes=NumByteToWrite%sFLASH_SPI_PAGESIZE;if(NumOfPage){while(NumOf){//每一頁都發(fā)起頁編程sFLASH_WritePage(pBuffer,WriteAddr,sFLASH_SPI_PAGESIZE);pBuffer+=sFLASH_SPI_PAGESIZE;WriteAddr+=sFLASH_SPI_PAGESIZE;}}if(NumOfBytes){sFLASH_WritePage(pBuffer,WriteAddr,NumOfBytes);}}為什么會有兩種寫操作函數(shù),是因為這里的寫操作有兩個特點:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論