版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 stm32之IIC應(yīng)實(shí)例(AT24C02芯,硬件和軟件式驅(qū)動(dòng))錄寫(xiě)完回頭看發(fā)現(xiàn)字?jǐn)?shù)還不少,如果你覺(jué)得字太枯燥,那么可以跳到后程序設(shè)計(jì),直接動(dòng)做實(shí)驗(yàn)。如果想仔細(xì)了解關(guān)于IIC協(xié)議的細(xì)節(jié),那么希望你能慢慢把看完,看完后定有所收獲。概述:IIC BUS(Inter Integrated Circuit BUS,內(nèi)部集成電路總線)是飛利浦公司推出的線制串?dāng)U展總線;在IIC總線上,只需要兩條線數(shù)據(jù)線SDA線和時(shí)鐘線SCL;多個(gè)器件可連接到同個(gè)IIC總線上,每個(gè)器件有個(gè)唯的識(shí)別地址,可對(duì)多、多對(duì)、對(duì)通訊;標(biāo)準(zhǔn)模式下傳輸速度為100Kb/s,快速模式下為400Kb/s。優(yōu)點(diǎn):引腳少,硬件實(shí)現(xiàn)簡(jiǎn)單,成本低。
2、關(guān)于IIC的接原理有些書(shū)可以描述出好頁(yè),但有時(shí)候看完了可能未必能懂,雖然看的時(shí)候每句話都能理解,但是看完了之后,想描述出來(lái)卻不知道從何說(shuō)起,腦海只是些零散的概念。所以下講述些關(guān)于IIC較核的東西。1.物理層:1. 它是種持多個(gè)通信主機(jī)及多個(gè)通信從機(jī)的總線。“總線”是指多個(gè)設(shè)備共的信號(hào)線。2. 個(gè)C總線只使兩條總線線路;條雙向串?dāng)?shù)據(jù)線(SDA),條串時(shí)鐘線(SCL)。3. 每個(gè)連接到總線的設(shè)備都有個(gè)獨(dú)的地址,總線上任設(shè)備可以利這個(gè)地址對(duì)其他設(shè)備進(jìn)交互。4. 總線通過(guò)上拉電阻接到電源。總線上的任設(shè)備,如果處于空閑狀態(tài)時(shí)。會(huì)輸出阻態(tài)。所以在總線空閑的時(shí)候兩條總線都呈現(xiàn)電平。5. 具有3種傳輸模式,標(biāo)
3、準(zhǔn)模式(100kbps)、快速模式(400kbps)、速模式(3.4Mbps,前多數(shù)不持)。、6. 連接到相同總線的設(shè)備數(shù)受到總線的最電容400pF限制。2.協(xié)議層:C的協(xié)議定義了通信的起始和停信號(hào)、數(shù)據(jù)有效性、響應(yīng)、仲裁、時(shí)鐘同步和地址播等環(huán)節(jié)。通訊的起始和停信號(hào) 因?yàn)樵O(shè)備發(fā)送數(shù)據(jù)的時(shí)候是連續(xù)字節(jié)的,接受端并不能提前知道發(fā)送者要發(fā)送的總字節(jié),所以接收端是從起始信號(hào)開(kāi)始接收,直到停信號(hào)為;且這兩種信號(hào)要與傳輸過(guò)程中的任何時(shí)間點(diǎn)的時(shí)序不能有沖突(獨(dú)特性),iic在數(shù)據(jù)傳輸?shù)倪^(guò)程中也保證了這點(diǎn)。通訊的起始:當(dāng)SCL線是電平時(shí)SDA線從電平向低電平切換。通信的停:當(dāng)SCL線是電平時(shí)SDA線由低電平向
4、電平切換??煽闯?,這兩種信號(hào)跟數(shù)據(jù)發(fā)送過(guò)程中的差異,在數(shù)據(jù)發(fā)送過(guò)程中,SDA線總是在SCL線在低電平的時(shí)候才變換。數(shù)據(jù)的有效性iic使SDA信號(hào)線來(lái)傳輸數(shù)據(jù),使SCL時(shí)鐘線進(jìn)數(shù)據(jù)同步。SDA數(shù)據(jù)線在SCL時(shí)鐘線的每個(gè)周期內(nèi)傳輸位,當(dāng)SCL時(shí)鐘線為電平時(shí),SDA數(shù)據(jù)線有效;即當(dāng)SCL為電平,若SDA為電平表數(shù)據(jù)“1”,若SDA為低電平表數(shù)據(jù)“0”。當(dāng)SCL時(shí)鐘線為低電平時(shí),SDA數(shù)據(jù)線,般這個(gè)時(shí)候SDA進(jìn)電平切換,為下次表數(shù)據(jù)進(jìn)準(zhǔn)備。應(yīng)答位從機(jī)每接收到個(gè)字節(jié)時(shí),都要作出應(yīng)答;主機(jī)這時(shí)候釋放SDA線的控制權(quán),由數(shù)據(jù)接收端控制SDA,若SDA為電平,表應(yīng)答信號(hào),低電平表應(yīng)答信號(hào)即傳輸成功。3.數(shù)據(jù)的
5、傳輸:由上介紹的協(xié)議基本理解了IIC通信的傳輸原理,在實(shí)際應(yīng)中,主機(jī)設(shè)備發(fā)送到從機(jī)設(shè)備的數(shù)據(jù)包括地址和數(shù)據(jù)。主機(jī)通過(guò)地址可找到對(duì)應(yīng)的從機(jī)設(shè)備,收到播地址的從機(jī)做出判決,若地址與地址匹配則做出應(yīng)答,若不匹配則忽略信息。主機(jī)向從機(jī)寫(xiě)數(shù)據(jù)上是主機(jī)對(duì)芯AT24C02存儲(chǔ)芯進(jìn)寫(xiě)操作時(shí)SDA的數(shù)據(jù)流,可以很清晰看出所發(fā)送的內(nèi)容。對(duì)照著圖來(lái)說(shuō),DEVICE ADDRESS設(shè)備地址可以是7位或10位,圖中所為7位,加上R/W傳輸向位(1為發(fā)送,0位接受)組成個(gè)字節(jié);圖中所有的ACK是等待從機(jī)應(yīng)答位,主機(jī)收到了應(yīng)答后才繼續(xù)發(fā)送后的內(nèi)容,從圖中可明顯看出,主機(jī)每發(fā)送個(gè)字節(jié)都必須等待從機(jī)做出個(gè)應(yīng)答;圖中的WORD
6、ADDRESS指的是主機(jī)往AT24C02存儲(chǔ)芯寫(xiě)的地址,后DATA就是寫(xiě)的內(nèi)容。不是所有的iic從設(shè)備都有這個(gè),如是頻的設(shè)備那么就不存在寫(xiě)地址。具體是要根據(jù)iic從設(shè)備的數(shù)據(jù)冊(cè)上的功能通信協(xié)議來(lái)定。主機(jī)向從機(jī)讀數(shù)據(jù) 上是主機(jī)對(duì)芯AT24C02存儲(chǔ)芯進(jìn)讀操作時(shí)SDA的數(shù)據(jù)流。對(duì)照著圖來(lái)說(shuō),先是發(fā)送從機(jī)地址DEVICE ADDRESS,接著給從機(jī)發(fā)送WORD ADDRESS是所讀取內(nèi)容的地址,這是告訴AT24C02接下主機(jī)需要的內(nèi)容,設(shè)置好地址之后,接著主機(jī)再發(fā)送個(gè)起始位,緊接著發(fā)送DEVICE ADDRESS,這時(shí)可以注意到傳輸向是READ(讀),那么主機(jī)釋放SDA線的控制權(quán),有從機(jī)給主機(jī)發(fā)送數(shù)
7、據(jù),可以連續(xù)發(fā)送多個(gè)字節(jié)數(shù)據(jù),當(dāng)主機(jī)期望停接收時(shí)作出個(gè)應(yīng)答,那么從機(jī)就停發(fā)送了。WORD ADDRESS不是所有主機(jī)向從機(jī)進(jìn)讀操作時(shí)都要發(fā)送這個(gè),具體是要看對(duì)是什么設(shè)備,就如上所說(shuō)需要依據(jù)設(shè)備的數(shù)據(jù)冊(cè)。個(gè)總結(jié)下,其實(shí)IIC是個(gè)常有意思的通信協(xié)議,起始位和停位之間肯定有個(gè)設(shè)備地址。對(duì)于個(gè)在總線上的設(shè)備,它需要隨時(shí)監(jiān)聽(tīng)總線上的起始位和停位,起始位旦出現(xiàn)就要進(jìn)接收數(shù)據(jù),不管地址是不是跟匹配,接下來(lái)都要關(guān)注停位的出現(xiàn),因?yàn)槿绻刂犯黄ヅ湓谕N怀霈F(xiàn)之前是不能占總線的,雖說(shuō)空閑的時(shí)候SDA和SCL必定都是電平,但SDA和SCL都是電平的時(shí)候總線未必空閑。我們可以直接控制任意兩個(gè)引腳,分別作SCL和SDA
8、,按照上述信號(hào)時(shí)序要求,就可以實(shí)現(xiàn)IIC通信。直接控制引腳需要CPU控制每個(gè)時(shí)刻的引腳狀態(tài),所以稱之為“軟件模擬協(xié)議”式。相對(duì)地,還有“硬件協(xié)議”式,STM32的IIC上外設(shè)專門負(fù)責(zé)實(shí)現(xiàn)IIC通信協(xié)議,只要配置好該外設(shè),它就會(huì)動(dòng)根據(jù)協(xié)議要求產(chǎn)通信信號(hào),收發(fā)數(shù)據(jù)并緩存起來(lái)。CPU只要檢測(cè)該外設(shè)的狀態(tài)和訪問(wèn)數(shù)據(jù)寄存器,就能完成數(shù)據(jù)的收發(fā)。這種由硬件外設(shè)處理的IIC協(xié)議的式減輕了CPU的作,且是軟件設(shè)計(jì)更簡(jiǎn)單。下分別介紹這兩種式在STM32上的實(shí)現(xiàn)。4.程序設(shè)計(jì)通過(guò)查閱AT24C02的數(shù)據(jù)冊(cè),該產(chǎn)品屬于2k容量,2k指的是bit,所以等于256字節(jié),需要個(gè)8位數(shù)據(jù)字進(jìn)尋址。另外設(shè)備地址可以在數(shù)據(jù)冊(cè)查
9、到。由上兩圖得知該設(shè)備地址為0 xA0,第0bit是讀寫(xiě)向位。 這SCL和SDA接了上拉電阻,然后分別接到stm32f103c8t6的PB6、PB7。軟件模式式 第步,通過(guò)cpu控制io模擬i2c協(xié)議,主要實(shí)現(xiàn)起始通訊函數(shù),停通訊函數(shù),發(fā)送字節(jié)函數(shù)和接受字節(jié)函數(shù)。在控制io是注意加延時(shí)以滿i2c的時(shí)序。創(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ā)送開(kāi)始信號(hào)extern void I2C_Stop(void); / 發(fā)送停信號(hào)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) / 概延時(shí)uint8_t i = 10;while(us-)while(i-); if(SDA_READ() /讀取SDA的電平ack = IIC_NO_ACK; /如果為1,則從機(jī)沒(méi)有應(yīng)答elseack = IIC_ACK; /如果為0,則從機(jī)應(yīng)答SCL_CLR();/時(shí)鐘線置低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í)鐘線置低,為傳輸數(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(); /時(shí)鐘線置,產(chǎn)上升沿,把數(shù)據(jù)發(fā)送出去delay(1);delay(1); SDA_SET();delay(1);第步,AT24C02的數(shù)據(jù)冊(cè),通過(guò)上的I2C通訊接跟AT24C02芯進(jìn)數(shù)據(jù)交互,包括單字節(jié)讀寫(xiě),多字節(jié)讀寫(xiě)函數(shù)接的實(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) / 概延時(shí)while(us-)while(i-);delay(1);I2C_Send_Byte(WriteAddr);/ 發(fā)送地址I2C_Send_Byte(DataToWrite); / 發(fā)送字節(jié)delay(100);/ 這個(gè)延時(shí)絕對(duì)不能去掉uint8_t AT24C02_ReadOneByte(uint8_t ReadAddr) / 從AT24C02指定的地址讀取個(gè)字節(jié)uint8_t temp=0;I2C_Start();/ 發(fā)送起始信號(hào)I2C_Send_Byte(AT24C02_ADDR); / 設(shè)備地址 且傳輸向位設(shè)
15、置為0delay(1);temp=I2C_Recieve_Byte(); / 接受個(gè)字節(jié)I2C_Stop();/產(chǎn)個(gè)停條件void AT24C02_Read(uint8_t ReadAddr,uint8_t *Buffer,uint16_t Num)/ 從指定地址連續(xù)讀取多個(gè)字節(jié)while(Num)*Buffer+=AT24C02_ReadOneByte(ReadAddr+);Num-;void AT24C02_Write(uint8_t WriteAddr,uint8_t *Buffer,uint16_t Num)/ 向指定地址連續(xù)寫(xiě)過(guò)個(gè)字節(jié)while(Num-)AT24C02_WriteO
16、neByte(WriteAddr,*Buffer);WriteAddr+; 第三步 ,配置個(gè)串輸出,于打印調(diào)試信息,驗(yàn)證實(shí)驗(yàn)。創(chuàng)建USART1.h#endif創(chuàng)建USART1.cGPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/配置串1 (USART1) 時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/配置串1接收
17、終端的優(yōu)先級(jí)/配置串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庫(kù)的fputc到串,那么使printf時(shí)就能將打印的信息從串發(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地址開(kāi)始連續(xù)讀取11個(gè)數(shù)據(jù)并通過(guò)串打印出來(lái),然后再往該地址寫(xiě)11個(gè)數(shù)據(jù),進(jìn)while循環(huán)后,將從串接收到的個(gè)字節(jié)數(shù)據(jù)寫(xiě)到AT24C02芯內(nèi),并讀取出來(lái)再通過(guò)串打印出來(lá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ā)來(lái)的數(shù)據(jù)AT24C02_WriteOneByte(0 x00, rece_data);/ 把串發(fā)來(lái)的數(shù)據(jù)寫(xiě)AT24C02地址0 x00處rece_data = 0;/ rece_data 清零將所有件加到程中: 編譯運(yùn),下載到開(kāi)發(fā)板上,連接上AT24C02芯,接上串調(diào)試轉(zhuǎn)接,那么就可以觀察實(shí)驗(yàn)了。AT24C02儲(chǔ)存芯掉電數(shù)據(jù)不丟失,可以適當(dāng)更改代碼驗(yàn)證。硬件協(xié)議式將調(diào)標(biāo)準(zhǔn)庫(kù)的函數(shù)進(jìn)IIC通信,所以將上的i2c.c、i2c.h移除,只需要更換AT24C02.c件就。創(chuàng)建static void delay(unsigned int us
21、) / 概延時(shí)while(us-)while(i-);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /使能iic外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE); /使能GPIO時(shí)鐘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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中歷史教學(xué)與校園周邊環(huán)境美化規(guī)劃研究教學(xué)研究課題報(bào)告
- 山科院現(xiàn)代紡織工藝與設(shè)備教案:機(jī)織教案
- 高中階段跨學(xué)科教學(xué)與人工智能融合的教學(xué)效果評(píng)估教學(xué)研究課題報(bào)告
- 安永會(huì)計(jì)師事務(wù)所的招聘及答案解析之內(nèi)部審計(jì)崗專場(chǎng)
- 2025年非遺木雕非遺技藝非遺傳承政策報(bào)告
- 2025長(zhǎng)虹美菱股份有限公司招聘操作工等崗位310人(四川)筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- 2025重慶機(jī)電控股集團(tuán)機(jī)電工程技術(shù)有限公司招聘11人筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- 心理咨詢專家面談技巧與答案
- 2025湖南永州市藍(lán)山縣城市建設(shè)投資開(kāi)發(fā)有限責(zé)任公司專業(yè)技術(shù)崗位招聘12人筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- 2025浙江臺(tái)州市三門縣人民醫(yī)院招聘4人筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- 健身房合伙協(xié)議書(shū)
- 美甲師聘用合同協(xié)議
- 《儲(chǔ)能電站技術(shù)監(jiān)督導(dǎo)則》2580
- 保安人員安全知識(shí)培訓(xùn)內(nèi)容
- 垃圾池維修合同范例
- DB31∕T 310001-2020 船舶水污染物內(nèi)河接收設(shè)施配置規(guī)范
- 北京市西城區(qū)2023-2024學(xué)年六年級(jí)上學(xué)期語(yǔ)文期末試卷(含答案)
- DB11T 850-2011 建筑墻體用膩?zhàn)討?yīng)用技術(shù)規(guī)程
- 2024年天津市南開(kāi)區(qū)翔宇學(xué)校四上數(shù)學(xué)期末檢測(cè)模擬試題含解析
- LNG加氣站管道工程施工方案
- 油漆作業(yè)風(fēng)險(xiǎn)和隱患辨識(shí)、評(píng)估分級(jí)與控制措施一覽表
評(píng)論
0/150
提交評(píng)論