版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 stm32之IIC應(yīng)實例(AT24C02芯,硬件和軟件式驅(qū)動)錄寫完回頭看發(fā)現(xiàn)字?jǐn)?shù)還不少,如果你覺得字太枯燥,那么可以跳到后程序設(shè)計,直接動做實驗。如果想仔細(xì)了解關(guān)于IIC協(xié)議的細(xì)節(jié),那么希望你能慢慢把看完,看完后定有所收獲。概述:IIC BUS(Inter Integrated Circuit BUS,內(nèi)部集成電路總線)是飛利浦公司推出的線制串?dāng)U展總線;在IIC總線上,只需要兩條線數(shù)據(jù)線SDA線和時鐘線SCL;多個器件可連接到同個IIC總線上,每個器件有個唯的識別地址,可對多、多對、對通訊;標(biāo)準(zhǔn)模式下傳輸速度為100Kb/s,快速模式下為400Kb/s。優(yōu)點:引腳少,硬件實現(xiàn)簡單,成本低。
2、關(guān)于IIC的接原理有些書可以描述出好頁,但有時候看完了可能未必能懂,雖然看的時候每句話都能理解,但是看完了之后,想描述出來卻不知道從何說起,腦海只是些零散的概念。所以下講述些關(guān)于IIC較核的東西。1.物理層:1. 它是種持多個通信主機(jī)及多個通信從機(jī)的總線?!翱偩€”是指多個設(shè)備共的信號線。2. 個C總線只使兩條總線線路;條雙向串?dāng)?shù)據(jù)線(SDA),條串時鐘線(SCL)。3. 每個連接到總線的設(shè)備都有個獨的地址,總線上任設(shè)備可以利這個地址對其他設(shè)備進(jìn)交互。4. 總線通過上拉電阻接到電源??偩€上的任設(shè)備,如果處于空閑狀態(tài)時。會輸出阻態(tài)。所以在總線空閑的時候兩條總線都呈現(xiàn)電平。5. 具有3種傳輸模式,標(biāo)
3、準(zhǔn)模式(100kbps)、快速模式(400kbps)、速模式(3.4Mbps,前多數(shù)不持)。、6. 連接到相同總線的設(shè)備數(shù)受到總線的最電容400pF限制。2.協(xié)議層:C的協(xié)議定義了通信的起始和停信號、數(shù)據(jù)有效性、響應(yīng)、仲裁、時鐘同步和地址播等環(huán)節(jié)。通訊的起始和停信號 因為設(shè)備發(fā)送數(shù)據(jù)的時候是連續(xù)字節(jié)的,接受端并不能提前知道發(fā)送者要發(fā)送的總字節(jié),所以接收端是從起始信號開始接收,直到停信號為;且這兩種信號要與傳輸過程中的任何時間點的時序不能有沖突(獨特性),iic在數(shù)據(jù)傳輸?shù)倪^程中也保證了這點。通訊的起始:當(dāng)SCL線是電平時SDA線從電平向低電平切換。通信的停:當(dāng)SCL線是電平時SDA線由低電平向
4、電平切換??煽闯?,這兩種信號跟數(shù)據(jù)發(fā)送過程中的差異,在數(shù)據(jù)發(fā)送過程中,SDA線總是在SCL線在低電平的時候才變換。數(shù)據(jù)的有效性iic使SDA信號線來傳輸數(shù)據(jù),使SCL時鐘線進(jìn)數(shù)據(jù)同步。SDA數(shù)據(jù)線在SCL時鐘線的每個周期內(nèi)傳輸位,當(dāng)SCL時鐘線為電平時,SDA數(shù)據(jù)線有效;即當(dāng)SCL為電平,若SDA為電平表數(shù)據(jù)“1”,若SDA為低電平表數(shù)據(jù)“0”。當(dāng)SCL時鐘線為低電平時,SDA數(shù)據(jù)線,般這個時候SDA進(jìn)電平切換,為下次表數(shù)據(jù)進(jìn)準(zhǔn)備。應(yīng)答位從機(jī)每接收到個字節(jié)時,都要作出應(yīng)答;主機(jī)這時候釋放SDA線的控制權(quán),由數(shù)據(jù)接收端控制SDA,若SDA為電平,表應(yīng)答信號,低電平表應(yīng)答信號即傳輸成功。3.數(shù)據(jù)的
5、傳輸:由上介紹的協(xié)議基本理解了IIC通信的傳輸原理,在實際應(yīng)中,主機(jī)設(shè)備發(fā)送到從機(jī)設(shè)備的數(shù)據(jù)包括地址和數(shù)據(jù)。主機(jī)通過地址可找到對應(yīng)的從機(jī)設(shè)備,收到播地址的從機(jī)做出判決,若地址與地址匹配則做出應(yīng)答,若不匹配則忽略信息。主機(jī)向從機(jī)寫數(shù)據(jù)上是主機(jī)對芯AT24C02存儲芯進(jìn)寫操作時SDA的數(shù)據(jù)流,可以很清晰看出所發(fā)送的內(nèi)容。對照著圖來說,DEVICE ADDRESS設(shè)備地址可以是7位或10位,圖中所為7位,加上R/W傳輸向位(1為發(fā)送,0位接受)組成個字節(jié);圖中所有的ACK是等待從機(jī)應(yīng)答位,主機(jī)收到了應(yīng)答后才繼續(xù)發(fā)送后的內(nèi)容,從圖中可明顯看出,主機(jī)每發(fā)送個字節(jié)都必須等待從機(jī)做出個應(yīng)答;圖中的WORD
6、ADDRESS指的是主機(jī)往AT24C02存儲芯寫的地址,后DATA就是寫的內(nèi)容。不是所有的iic從設(shè)備都有這個,如是頻的設(shè)備那么就不存在寫地址。具體是要根據(jù)iic從設(shè)備的數(shù)據(jù)冊上的功能通信協(xié)議來定。主機(jī)向從機(jī)讀數(shù)據(jù) 上是主機(jī)對芯AT24C02存儲芯進(jìn)讀操作時SDA的數(shù)據(jù)流。對照著圖來說,先是發(fā)送從機(jī)地址DEVICE ADDRESS,接著給從機(jī)發(fā)送WORD ADDRESS是所讀取內(nèi)容的地址,這是告訴AT24C02接下主機(jī)需要的內(nèi)容,設(shè)置好地址之后,接著主機(jī)再發(fā)送個起始位,緊接著發(fā)送DEVICE ADDRESS,這時可以注意到傳輸向是READ(讀),那么主機(jī)釋放SDA線的控制權(quán),有從機(jī)給主機(jī)發(fā)送數(shù)
7、據(jù),可以連續(xù)發(fā)送多個字節(jié)數(shù)據(jù),當(dāng)主機(jī)期望停接收時作出個應(yīng)答,那么從機(jī)就停發(fā)送了。WORD ADDRESS不是所有主機(jī)向從機(jī)進(jìn)讀操作時都要發(fā)送這個,具體是要看對是什么設(shè)備,就如上所說需要依據(jù)設(shè)備的數(shù)據(jù)冊。個總結(jié)下,其實IIC是個常有意思的通信協(xié)議,起始位和停位之間肯定有個設(shè)備地址。對于個在總線上的設(shè)備,它需要隨時監(jiān)聽總線上的起始位和停位,起始位旦出現(xiàn)就要進(jìn)接收數(shù)據(jù),不管地址是不是跟匹配,接下來都要關(guān)注停位的出現(xiàn),因為如果地址跟不匹配在停位出現(xiàn)之前是不能占總線的,雖說空閑的時候SDA和SCL必定都是電平,但SDA和SCL都是電平的時候總線未必空閑。我們可以直接控制任意兩個引腳,分別作SCL和SDA
8、,按照上述信號時序要求,就可以實現(xiàn)IIC通信。直接控制引腳需要CPU控制每個時刻的引腳狀態(tài),所以稱之為“軟件模擬協(xié)議”式。相對地,還有“硬件協(xié)議”式,STM32的IIC上外設(shè)專門負(fù)責(zé)實現(xiàn)IIC通信協(xié)議,只要配置好該外設(shè),它就會動根據(jù)協(xié)議要求產(chǎn)通信信號,收發(fā)數(shù)據(jù)并緩存起來。CPU只要檢測該外設(shè)的狀態(tài)和訪問數(shù)據(jù)寄存器,就能完成數(shù)據(jù)的收發(fā)。這種由硬件外設(shè)處理的IIC協(xié)議的式減輕了CPU的作,且是軟件設(shè)計更簡單。下分別介紹這兩種式在STM32上的實現(xiàn)。4.程序設(shè)計通過查閱AT24C02的數(shù)據(jù)冊,該產(chǎn)品屬于2k容量,2k指的是bit,所以等于256字節(jié),需要個8位數(shù)據(jù)字進(jìn)尋址。另外設(shè)備地址可以在數(shù)據(jù)冊查
9、到。由上兩圖得知該設(shè)備地址為0 xA0,第0bit是讀寫向位。 這SCL和SDA接了上拉電阻,然后分別接到stm32f103c8t6的PB6、PB7。軟件模式式 第步,通過cpu控制io模擬i2c協(xié)議,主要實現(xiàn)起始通訊函數(shù),停通訊函數(shù),發(fā)送字節(jié)函數(shù)和接受字節(jié)函數(shù)。在控制io是注意加延時以滿i2c的時序。創(chuàng)建0#define SCL_CLR() GPIOB-BRR = GPIO_Pin_6#define SCL_SET() GPIOB-BSRR = GPIO_Pin_6#define SDA_CLR() GPIOB-BRR = GPIO_Pin_7#define SDA_SET() GPIOB-
10、BSRR = GPIO_Pin_7#define SCL_READ() GPIOB-IDR & GPIO_Pin_6#define SDA_READ() GPIOB-IDR & GPIO_Pin_7#define AT24C02_SCL_PIN GPIO_Pin_4#define AT24C02_SCL_PORT GPIOC#define AR24C02_SCL_CLK RCC_APB2Periph_GPIOC/*SDA數(shù)據(jù)線*/#define AT24C02_SCL_PIN GPIO_Pin_4#define AT24C02_SCL_PORT GPIOC#define AR24C02_SCL
11、_CLK RCC_APB2Periph_GPIOCvoid I2C_Configuration(void);extern void I2C_Start(void); / 發(fā)送開始信號extern void I2C_Stop(void); / 發(fā)送停信號extern void I2C_Send_Byte(uint8_t sebyte); / I2C 發(fā)送字節(jié)數(shù)據(jù)extern uint8_t I2C_Recieve_Byte(void); / I2C 接收字節(jié)數(shù)據(jù)#endif創(chuàng)建#include i2c.h#include stm32f10 x_gpio.hstatic void delay(un
12、signed char us) / 概延時uint8_t i = 10;while(us-)while(i-); if(SDA_READ() /讀取SDA的電平ack = IIC_NO_ACK; /如果為1,則從機(jī)沒有應(yīng)答elseack = IIC_ACK; /如果為0,則從機(jī)應(yīng)答SCL_CLR();/時鐘線置低delay(1);return ack; / 返回讀取到的應(yīng)答信息void I2C_Send_Byte(uint8_t IIC_Byte)unsigned char i; / 定義變量for(i=0;i8;i+) /for循環(huán)8次SCL_CLR(); /時鐘線置低,為傳輸數(shù)據(jù)做準(zhǔn)備de
13、lay(1);if(IIC_Byte & 0 x80) / 讀取最位SDA_SET();elseSDA_CLR();IIC_Byte = 1; /數(shù)據(jù)左移1位delay(1);SCL_SET(); /時鐘線置,產(chǎn)上升沿,把數(shù)據(jù)發(fā)送出去delay(1);delay(1); SDA_SET();delay(1);第步,AT24C02的數(shù)據(jù)冊,通過上的I2C通訊接跟AT24C02芯進(jìn)數(shù)據(jù)交互,包括單字節(jié)讀寫,多字節(jié)讀寫函數(shù)接的實現(xiàn)。上已經(jīng)提到該芯是256字節(jié),所以地址范圍是0 x000 xFF,不可越界。創(chuàng)建extern void AT24C02_Init(void); / 初始化#endif創(chuàng)建
14、static void delay(unsigned int us) / 概延時while(us-)while(i-);delay(1);I2C_Send_Byte(WriteAddr);/ 發(fā)送地址I2C_Send_Byte(DataToWrite); / 發(fā)送字節(jié)delay(100);/ 這個延時絕對不能去掉uint8_t AT24C02_ReadOneByte(uint8_t ReadAddr) / 從AT24C02指定的地址讀取個字節(jié)uint8_t temp=0;I2C_Start();/ 發(fā)送起始信號I2C_Send_Byte(AT24C02_ADDR); / 設(shè)備地址 且傳輸向位設(shè)
15、置為0delay(1);temp=I2C_Recieve_Byte(); / 接受個字節(jié)I2C_Stop();/產(chǎn)個停條件void AT24C02_Read(uint8_t ReadAddr,uint8_t *Buffer,uint16_t Num)/ 從指定地址連續(xù)讀取多個字節(jié)while(Num)*Buffer+=AT24C02_ReadOneByte(ReadAddr+);Num-;void AT24C02_Write(uint8_t WriteAddr,uint8_t *Buffer,uint16_t Num)/ 向指定地址連續(xù)寫過個字節(jié)while(Num-)AT24C02_WriteO
16、neByte(WriteAddr,*Buffer);WriteAddr+; 第三步 ,配置個串輸出,于打印調(diào)試信息,驗證實驗。創(chuàng)建USART1.h#endif創(chuàng)建USART1.cGPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/配置串1 (USART1) 時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/配置串1接收
17、終端的優(yōu)先級/配置串1 發(fā)送引腳(PA.09)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/配置串1 接收引腳 (PA.10)/串1作模式(USART1 mode)配置USART_Cmd(USART1, ENABLE);/使能串USART_ClearFlag(USART1,0 x3FF);in
18、t fputc(int ch, FILE *f) / 重定向c庫的fputc到串,那么使printf時就能將打印的信息從串發(fā)送出去,在PC上同串助接收信息 USART_SendData(USART1, (unsigned char) ch);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);return (ch);return USART_ReceiveData(USART1);while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);while( USART_GetFlagS
19、tatus(USART1,USART_FLAG_TC)!= SET);Length-;第四步,先讀取AT24C02內(nèi)從0 x00地址開始連續(xù)讀取11個數(shù)據(jù)并通過串打印出來,然后再往該地址寫11個數(shù)據(jù),進(jìn)while循環(huán)后,將從串接收到的個字節(jié)數(shù)據(jù)寫到AT24C02芯內(nèi),并讀取出來再通過串打印出來。創(chuàng)建#include at24c02.huint8_t data11,str12=hello world;int main()uint8_t rece_data;AT24C02_Write(0 x00,str,11);UART_send(data,11); / 把讀出的數(shù)據(jù)返回電腦串;while(1)r
20、ece_data = UART_recive();/ 等待串發(fā)來的數(shù)據(jù)AT24C02_WriteOneByte(0 x00, rece_data);/ 把串發(fā)來的數(shù)據(jù)寫AT24C02地址0 x00處rece_data = 0;/ rece_data 清零將所有件加到程中: 編譯運(yùn),下載到開發(fā)板上,連接上AT24C02芯,接上串調(diào)試轉(zhuǎn)接,那么就可以觀察實驗了。AT24C02儲存芯掉電數(shù)據(jù)不丟失,可以適當(dāng)更改代碼驗證。硬件協(xié)議式將調(diào)標(biāo)準(zhǔn)庫的函數(shù)進(jìn)IIC通信,所以將上的i2c.c、i2c.h移除,只需要更換AT24C02.c件就。創(chuàng)建static void delay(unsigned int us
21、) / 概延時while(us-)while(i-);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /使能iic外設(shè)時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE); /使能GPIO時鐘I2C_DeInit(I2C1);I2C_GenerateSTART(AT24C02_I2Cx, ENABLE); /* 起始位*/ /*讀SR1*/I2C_GenerateSTOP(AT24C02_I2Cx, ENABLE); /* 停位*/whi
22、le(I2C_GetFlagStatus(AT24C02_I2Cx, I2C_FLAG_BUSY);I2C_Send7bitAddress(AT24C02_I2Cx, AT24C02_ADDR, I2C_Direction_Transmitter);while (!I2C_CheckEvent(AT24C02_I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);/*發(fā)送地址*/I2C_SendData(AT24C02_I2Cx, ReadAddr);while (!I2C_CheckEvent(AT24C02_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED);/* 數(shù)據(jù)已發(fā)送*/*起始位*/*器件讀*/I2C_AcknowledgeConfig(AT24C02_I2Cx, DISABLE); /* 最后位后要關(guān)閉應(yīng)答的 */I2C_GenerateS
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版節(jié)能環(huán)保設(shè)施運(yùn)營管理合同范本3篇
- 二零二五年汽車租賃公司兼職司機(jī)合同3篇
- 二零二五版家居用品寄售代理合同范本3篇
- 二零二五版草原生態(tài)補(bǔ)償機(jī)制承包合同3篇
- 二零二五版插畫師合作合同范本-漫畫創(chuàng)作合作與版權(quán)歸屬協(xié)議3篇
- 二零二五版建筑工程施工企業(yè)施工許可證注銷合同3篇
- 二零二五版安徽農(nóng)民工就業(yè)跟蹤服務(wù)合同范本3篇
- 2025版塊石石材礦山投資合作合同3篇
- 基于2025年度行業(yè)標(biāo)準(zhǔn)的招投標(biāo)實習(xí)合同3篇
- 二零二五年金融創(chuàng)新抵押借款合同范本分享3篇
- 蔣詩萌小品《誰殺死了周日》臺詞完整版
- TB 10010-2008 鐵路給水排水設(shè)計規(guī)范
- 黑色素的合成與美白產(chǎn)品的研究進(jìn)展
- 建筑史智慧樹知到期末考試答案2024年
- 金蓉顆粒-臨床用藥解讀
- 社區(qū)健康服務(wù)與管理教案
- 2023-2024年家政服務(wù)員職業(yè)技能培訓(xùn)考試題庫(含答案)
- 2023年(中級)電工職業(yè)技能鑒定考試題庫(必刷500題)
- 藏歷新年文化活動的工作方案
- 果酒釀造完整
- 第4章-理想氣體的熱力過程
評論
0/150
提交評論