版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第10章 I2C總線接口及應用案例-GPIO軟件模擬I2C協(xié)議10.1 I2C總線規(guī)范10.2 應用案例(一):GPIO模擬I2C總線協(xié)議1)2)3)4)硬件驅動程序分層模型I2C總線應用開發(fā)主要工作內容I2C接口功能芯片GPIO模擬I2C電路實例5) 軟件模擬I2C協(xié)議代碼詳解10.3 GPIO應用案例(二):STM32片內I2C接口應用10.3.1 STM32 I2C接口控制器概述10.3.2 STM32 I2C控制器寄存器10.3.3 STM32 I2C控制器庫函數(shù)10.3.4 STM32 I2C接口應用案例10.1I2C總線協(xié)議規(guī)范I2C總線I2C接口是Philips推出的一種串行總線
2、方式,用于IC器件之間的通信。它通過SDA(串行數(shù)據(jù)線)和SCL(串行時鐘線)兩根線在連到總 線上的器件之間傳送信息,并通過軟件尋址識別每個器件,而不需要 片選線。I2C接口的標準傳輸速率為100Kbit/s,最高傳輸速率可達400Kbit/s。VDD主控制器件(RTC)從控制器件(LCD)R1R2SDABUSSCL從控制器件(ADC)主控制器件(MCU)從控制器件(EEPROM)從控制器件(SRAM)I2C電氣連接I2C總線接口均為開漏或開集電極輸出,因此需要為總線增加上拉電阻Rp??偩€速率越高,總線上拉電阻VDDRpRp就越小,100Kbit/s總線速率, 通常使用5.1K歐姆的上拉電阻I
3、2C BUSSDASDA SCLSCLSCL出SDA出器件1器件2SCL入SDA入I2C總線時序在數(shù)據(jù)傳送過程中,必須確認數(shù)據(jù)傳送的開始和結束,這通過起始和結束信號識別。發(fā)送起始信號后傳送的第一字節(jié)數(shù)據(jù)具有特別的意義,其中前七位為從機地址,最后一位為讀寫方向位(0表示寫,1表示讀)。第一字節(jié)從器件地址R/WSSDA SCLS P起始信號結束信號 I2C總線時序I2C總線數(shù)據(jù)傳送時,每傳送一個字節(jié)數(shù)據(jù)后都必須有應答信號(A)。主控器接收數(shù)據(jù)時,如果要結束通信時,將在停止位之前發(fā)送非應答信號(A)。SDASCLAA應答信號非應答信號I2C的一個完整幀結構停止信號起始信號STOPSTART.B0AB
4、7SDASCL . 9 1 8 I2C時序各種幀結構STM32在I2C通信中可以配置為主控器也可以作為被控器,那么它就具有4種操作模式:主發(fā)送模式、主接收模式、從發(fā)送模式和從接收模式。主機到從機A = 應答(SDA為低)S = 起始信號主機到從機A = 非應答(SDA為高)P = 停止信號RS = 重復起始信號從發(fā)送模式:PA數(shù)據(jù)A數(shù)據(jù)A從器件地址RS從接收模式:A/AP/RS數(shù)據(jù)A數(shù)據(jù)A從器件地址WS主接收模式:PA數(shù)據(jù)A數(shù)據(jù)A從器件地址RS主發(fā)送模式:PA/A數(shù)據(jù)A數(shù)據(jù)A從器件地址WS10.2 GPIO軟件模擬I2C協(xié)議1) 硬件驅動程序分層模型圖10-2-1 協(xié)議驅動軟件分層模型(1)應
5、用軟件層協(xié)議時序/信號功能測試軟件、EEPROM特定應用功能軟件等;SDA(2)高層協(xié)議實現(xiàn)層指定存儲單元字節(jié)數(shù)據(jù)讀寫函數(shù)、數(shù)據(jù)塊讀寫函數(shù);(3)低層協(xié)議實現(xiàn)層(S)、(P)、(A)、( )等信號的產(chǎn)生與發(fā)送、BIT位傳送、數(shù)據(jù)幀傳送等功能函數(shù);(4) 硬件驅動層SCL、SDA輸出高、低電平函數(shù),讀入SDA總線狀態(tài)函數(shù),GPIO端口初始化函數(shù)。GPIO硬件SCL2) 軟件編寫主要工作:(1) 硬件抽象層代碼編寫(基本I/O操作,與硬件實現(xiàn)有 關)(2) 協(xié)議底層功能函數(shù)編寫(基本I2C信號 實現(xiàn))(3) 協(xié)議高層函數(shù)編寫 (字節(jié)讀寫)(4) 數(shù)據(jù)塊讀寫高層接口函數(shù)讀寫(數(shù)據(jù)塊讀寫)3) I2C
6、接口功能芯片帶I2C從控制器的功能芯片比較多,比如I2C-EEPROM、I2C-ADC 、I2C-RFID閱讀器芯片、I2C-RTC,.,等。8-lead SOICA0 A1 A2GNDVDD WPSCL SDA圖10-2-2 AT24C01引腳功能182736454) GPIO模擬I2C電路實例5) 硬件抽象層主要需要實現(xiàn)下列9個函數(shù),實現(xiàn)之后就基本可屏蔽MCU的硬件細節(jié):delay5us(),延時基準函數(shù),400kbps,約5us傳輸1比特,若對速度要求不高,不需要很精確,軟件延時即可; I2C_Init(),I2C/GPIO端口引腳初始化函數(shù); SET_SDA(),在SDA總線上輸出數(shù)據(jù)
7、“1”函數(shù); CLR_SDA(),在SDA總線上輸出數(shù)據(jù)“0”函數(shù); IN_SDA(), 讀 入 數(shù) 據(jù) 線 狀 態(tài) 函 數(shù) ; SET_SCL(),在SCL總線上輸出高電平函數(shù); CLR_SCL(),在SCL總線上輸出低電平函數(shù); SET_SDA_OUT_MODE(),設置SDA為輸出數(shù)據(jù)模式;SET_SDA_IN_MODE(),設置SDA為輸入數(shù)據(jù)模式。01/STM32基本定義02#include stm32f10x.h03/根據(jù)字地址轉定義IO寄存器04#define MEM_ADDR_TO_IO_REG(addr)05/字地址轉位地址計算公式06#define WORD_ADDR_TO
8、_BIT_ADDR(waddr, bitnum).0708/根據(jù)位地址定義位IO寄存器09#define BIT_IO_REG(waddr, bitnum) .1011/計算ODR、IDR絕對地址12#define GPIOC_ODR_Addr(GPIOC_BASE+12)13#define GPIOC_IDR_Addr(GPIOC_BASE+8)14/定義輸入輸出宏15#define PCout(n)BIT_IO_REG(GPIOC_ODR_Addr,n)/定義位輸出宏16#define PCin(n)BIT_IO_REG(GPIOC_IDR_Addr,n)/定義位輸入宏17/GPIOI2C
9、硬件抽象層代碼18/引腳定義19#define SCLPCout(0)/PC0 SCL_out20#define SDAPCout(1)/ PC1SDA_out21/延時函數(shù)定義,可軟件不精確實現(xiàn)或定時器精確實現(xiàn)22void delay5us()char i;for(i=20;i0;i-) i=i;23void delay1ms(int n) for(n=n*200;n;n-) delay5us();24/基本IO操作25#defien SET_SDA()SDA=126#define CLR_SDA()SDA=027#define SET_SCL()SCL=128#define CLR_SCL
10、()SCL=029int IN_SDA(void)SDA=1; return ( PCin(1) ); 30void I2C_Init(void) 31/(1)令GPIOC端口時鐘使能32RCC-APB2ENR |= (1APB2ENR-GPIOC口時鐘。33/(2)清除PC0、PC1 模式位34GPIOC-CRL &= ( 0x0FCRL &= ( 0x0FCRL |= (5CRL寄存器,3-0位=0101b,浮空開漏輸出模式38GPIOC-CRL |= (5CRL &= ( 0x0FCRL |= (8CRL &= ( 0x0FCRL |= (54*1);52SDA=1;/關閉SDA的OD輸
11、出門,由上拉驅動5354556)I2C協(xié)議底層信號要實現(xiàn)下列7個函數(shù)start() stop()ack()nack() getAck() sendByte() recvByte()void start() /START 信號SET_SDA();delay5us(); SET_SCL();delay5us(); CLR_SDA();delay5us(); CLR_SCL();/SDA = 1;/SCL = 1;/SDA = 0;/SDA/SCL = 0;void stop()/STOP信號/SDA = 0;CLR_SDA();delay5us(); SET_SCL();delay5us();SE
12、T_SDA();delay5us(); CLR_SCL();/SCL = 1;/SDA = 1;/SDA = 0;void ack() /主器件發(fā)應答信號CLR_SDA(); SET_SCL();delay5us(); CLR_SCL(); SET_SDA();/SDA = 0;/SCL = 1;/SCL = 0;/SDA = 1;void nack() /主器件發(fā)非應答信號SET_SDA();/SDA = 1;delay5us(); SET_SCL();/SCL = 1;delay5us(); CLR_SCL(); /SCL = 0;unsigned char getAck()unsigne
13、d char flag,i; delay5us();/獲取從器件應答信號SET_SDA_IN_MODE();delay5us(); SET_SCL();for(i=0;i10;i+)delay5us();flag = IN_SDA(); if(flag=0) break;/SCL = 1;CLR_SCL();delay5us(); ack_flag=flag; return flag;/SCL = 0;unsigned char sendByte(unsigned char dat)unsigned char i; for(i = 0; i 8; i+)delay5us();if( dat&0
14、x80 )else delay5us(); SET_SCL();delay5us(); CLR_SCL();dat = dat 1; SET_SDA(); CLR_SDA(); /SCL = 1;/SCL = 0;return getAck();在時鐘上升沿前輸出SDA數(shù)據(jù)unsigned char recvByte()unsigned char i, tmp, dat; SET_SDA_IN_MODE();for(i = 0; i 8; i+)delay5us(); SET_SCL();delay5us(); if(IN_SDA() = 1)tmp = 1; else tmp = 0;dat
15、 = (dat 1) | tmp; CLR_SCL();return dat;在時鐘下降沿前取樣SDA7)主控制器高層I2C協(xié)議實現(xiàn)writeByte(),讀指定存儲單元數(shù)據(jù)readByte(),寫指定存儲單元數(shù)據(jù)writeBlock(),讀指定位置數(shù)據(jù)塊readBlock(),寫指定位置數(shù)據(jù)塊#define #define #defineSLAVE_ADDR 0xA0 CMD_WRITE 0x00 CMD_READ 0x01/ AT24C02 /AT24C02 EEPROMvoid writeByte(unsigned char addr,unsigned char dat)start();
16、 SendByte(SLAVE_ADDR|CMD_WRITE);/delay2Ms();sendByte(addr); /寫地址計數(shù)器/delay2Ms();sendByte(dat); stop();/delay2Ms();/寫存儲數(shù)據(jù)主發(fā)送模式:PA/A數(shù)據(jù)A數(shù)據(jù)A從器件地址WSunsigned char readByte(unsigned char addr)unsigned char dat; start();sendByte(SLAVE_ADDR|CMD_WRITE);sendByte(addr); stop();start();/寫AT24C02地址計數(shù)器sendByte(SLAV
17、E_ADDR|CMD_READ); dat = recvByte();nack();stop(); return dat;主接收模式:PA數(shù)據(jù)A數(shù)據(jù)A從器件地址RSvoid writeBlock( unsigned char addr, unsigned char * dats, unsigned char length)unsigned char i;start(); sendByte(SLAVE_ADDR|CMD_WRITE); sendByte(addr);start(); sendByte(SLAVE_ADDR|CMD_WRITE);for(i = 0; i length; i+) s
18、top();delay10Ms();sendByte(datsi);主發(fā)送模式:PA/A數(shù)據(jù)A數(shù)據(jù)A從器件地址WSvoid readBlock( unsigned char addr,unsigned char * buffer, unsigned char size) int i; start();int count = size - 1;sendByte(SLAVE_ADDR|CMD_WRITE); sendByte(addr);stop();start(); sendByte(SLAVE_ADDR|CMD_READ);for(i = 0; i count; i+) bufferi = recvByte(); buffercount = recvByte();nack
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新版人教版四年級語文下冊期末綜合考試題
- 羅湖事業(yè)編招聘2019年考試真題及答案解析【下載版】-
- 大體積混凝土溫控施工技術重點
- 2021-2022年人教版六年級語文上冊期末考試卷及答案下載
- (完整版)一年級上冊數(shù)學應用題60道及答案【名師系列】
- 2025 小學三年級科學下冊月季嫁接初步嘗試觀察課件
- 2026屆北京市西城區(qū)高三上學期期末考試歷史試題(含答案)
- 汽車機修考試試題及答案
- 工業(yè)機器人操作與運維 知識測評試題及答案匯 項目1-8
- 2026年深圳中考語文核心素養(yǎng)檢測試卷(附答案可下載)
- 黑山峽工程施工方案
- 工業(yè)電路布線技術標準與示例
- 國家稅務總局公告2025年第12號附件1.納稅繳費信用評價指標和評價方式
- 2024-2025學年河南省南陽市油田七年級上學期期末教學質量檢測數(shù)學試卷(含答案)
- 道路應急處理培訓
- DB4403-T 364-2023 智能網(wǎng)聯(lián)汽車V2x車載信息交互系統(tǒng)技術要求
- 2024年衛(wèi)生高級職稱面審答辯(呼吸內科)(副高面審)經(jīng)典試題及答案
- 幼兒園流感培訓知識課件
- 蘄春縣國土空間總體規(guī)劃(2021-2035)
- 一年級上冊語文 快樂讀書吧《和大人一起讀》必考考點知識梳理
- 車位轉讓車位協(xié)議書
評論
0/150
提交評論