IIC通信---EEPROM24C02---STMF4

IIC通信協議

IIC是同步半雙工通信,一個數據線SDA和一個時鐘SCL線,可以接受和發送數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送。

空閑狀態

IIC總線的SDA和SCL兩條信號線同時處于高電平時,規定為總線的空閑狀態。

起始信號

當SCL為高期間,SDA由高到低的跳轉

在這里插入圖片描述
代碼實現為:

//產生IIC起始信號
void IIC_Start(void)
{SDA_OUT();     //sda線輸出模式IIC_SDA=1;	  	  IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據 
}	  
停止信號

當SCL為高期間,SDA由低到高的跳轉
在這里插入圖片描述
代碼實現:

//產生IIC停止信號
void IIC_Stop(void)
{SDA_OUT();//sda線輸出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; delay_us(4);			IIC_SDA=1;//發送I2C總線結束信號				   	
}
應答信號

發送器每發送一個字節,就在時鐘脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位,表示接收器已經成功接收到了該字節。應答信號為高電平時,規定為非應答位,一般表示接收器接收該字節沒有成功。
對于反饋有效應答位ACK的要求是,接收器第9個時鐘脈沖之前的低電平將SDA線拉低,并且確保在該時鐘的高電平期間為穩定的低電壓。
在這里插入圖片描述
代碼實現為:

//產生ACK應答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//不產生ACK應答		    
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}	
//等待應答信號到來
//返回值:1,接收應答失敗
//        0,接收應答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA設置為輸入  IIC_SDA=1;delay_us(1);	   IIC_SCL=1;delay_us(1);	 while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//時鐘輸出0 	   return 0;  
} 
數據的有效性

IIC總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平才允許變化。即數據在SCL的上升沿到來之前就需要準備好,并且在下降沿到來之前必須保持穩定。
在這里插入圖片描述

數據的傳送

在IIC總線上傳送的每一位數據都有一個時鐘脈沖相對應(同步控制),即在SCL串行時鐘的配合下,在SDA上逐位串行傳送每一位數據,數據位的傳輸是邊沿觸發。

發送一字節代碼實現為:

//IIC發送一個字節
//返回從機有無應答
//1,有應答
//0,無應答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT(); 	    IIC_SCL=0;//拉低時鐘開始數據傳輸for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1; 	  delay_us(2);   //對TEA5767這三個延時都是必須的IIC_SCL=1;delay_us(2); IIC_SCL=0;	delay_us(2);}	 
} 

數據傳輸之前IIC_SCL必須等于0,即時信號為低電平,然后準備一位數據,準備好之后,IIC_SCL=1,即時鐘信號為高電平,數據就傳輸過去了
對于下面的代碼:

IIC_SDA=(txd&0x80)>>7;
txd<<=1;

無符號類型左移丟棄最高位,低位補0,無符號類型右移丟棄最低位,低位補0,txd&0x80讓txd第8位數據不變,其他為變成0(txd的值不受影響),左移7位,將最高位的數據賦值給IIC_SDA,當IIC_SCL=1時,第八位數據就傳輸過去了,txd<<=1讓第7位數據變成第8位數據,下次循環就傳輸原來第7位數據了。循環8次將一字節數據傳輸完畢。

讀取數據代碼實現:

//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA設置為輸入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }					 if (!ack)IIC_NAck();//發送nACKelseIIC_Ack(); //發送ACK   return receive;
}

對于下面的代碼:

 receive<<=1;if(READ_SDA)receive++;   

READ_SDA是獲取SDA線上的電壓,高電壓說明說明傳送過來的數據是1,receive++,下一次的時候, receive<<=1,receive先右移一位,然后接受數據,這樣循環8次,就能保證接受的數據在原來的位置上了。

與EEPROM通信

硬件連接

在這里插入圖片描述
EEPROM是一種掉電后數據不丟失的存儲芯片,可以在電腦上或專用設備上擦除已有信息,重新編程。
24C02的總容量是256個字節,接口是IIC
在這里插入圖片描述

模式選擇

硬件連接中,A2=A1=A0=0(接地),所以,我們讀數據時,只需寫入0xA1,表示讀模式,寫數據時,只需寫入0xA0,表示寫模式
在這里插入圖片描述

寫時序

下面是寫入一個字節數據的過程
在這里插入圖片描述

  1. 一個IIC_START信號
  2. 寫入模式,寫入0xA0
  3. 等待一個ACK
  4. 發送寫入數據的地址(0~255)
  5. 等待一個ACK
  6. 發送一個字節
  7. 等待一個ACK
  8. 一個STOP信號
    具體代碼如下
//在AT24CXX指定地址寫入一個數據
//WriteAddr  :寫入數據的目的地址    
//DataToWrite:要寫入的數據
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{				   	  	    																 IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);	    //發送寫命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//發送高地址	  }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //發送器件地址0XA0,寫數據 	 IIC_Wait_Ack();	   IIC_Send_Byte(WriteAddr%256);   //發送低地址IIC_Wait_Ack(); 	 										  		   IIC_Send_Byte(DataToWrite);     //發送字節							   IIC_Wait_Ack();  		    	   IIC_Stop();//產生一個停止條件 delay_ms(10);	 
}
讀數據

下面是讀一個字節數據的過程
在這里插入圖片描述

  1. 產生一個START信號
  2. 寫入0xA0,表示是寫模式
  3. 等待一個ACK
  4. 寫入讀數據的地址
  5. 等待一個ACK
  6. 產生一個START信號
  7. 寫入0xA1,表示是讀模式
  8. 等待一個ACK
  9. 讀取數據
    實現代碼如下:
//在AT24CXX指定地址讀出一個數據
//ReadAddr:開始讀數的地址  
//返回值  :讀到的數據
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{				  u8 temp=0;		  	    																 IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);	   //發送寫命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//發送高地址	    }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //發送器件地址0XA0,寫數據 	   IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256);   //發送低地址IIC_Wait_Ack();	    IIC_Start();  	 	   IIC_Send_Byte(0XA1);           //進入接收模式			   IIC_Wait_Ack();	 temp=IIC_Read_Byte(0);		   IIC_Stop();//產生一個停止條件	    return temp;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實訓09.08:簡單的算法練習

/*final 關鍵字 修飾的變量值 后期不可更改 相當于定義常量常量 &#xff1a;不可更改*/final int a 10;//a 20; 報錯的值不可更改&#xff01;/*輸入函數* */System.out.println("請輸入數字&#xff1a;");Scanner scanner new Scanner(System.in);int b…

讓自己閃亮

轉載于:https://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html

Java中的wait()和sleep()方法之間的區別

Java中的wait()和sleep()方法 (wait() and sleep() methods in Java) First, we will see how wait() method differs from sleep() method in Java? 首先&#xff0c;我們將看到wait()方法與Java中的sleep()方法有何不同&#xff1f; wait()方法 (wait() Method) This metho…

離線使用iPhone SDK文檔的方法

在使用Xcode進行iPhone編程時&#xff0c;有時需要參考iPhone SDK的文檔&#xff0c;不過每次ControlClick后&#xff0c;Xcode都會試圖連接Internet&#xff0c;進行在線讀取。有什么方法能夠把資料下載到硬盤上進行離線閱讀嗎&#xff1f; 答案是肯定的。首先去Xcode的Prefer…

遠程連接sql server 2000服務器的解決方案

遠程連接sql server 2000服務器的解決方案2007-04-07 11:29遠程連接sql server 2000服務器的解決方案   一 看ping 服務器IP能否ping通。   這個實際上是看和遠程sql server 2000服務器的物理連接是否存在。如果不行&#xff0c;請檢查網絡&#xff0c;查看配置&#xff0c…

實訓09.10:HTML簡單表格設計

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>燕雨簡歷</title></head><body><table border"" cellspacing"" cellpadding"" width"400px" height"6…

LCD顯示實驗----STM32f4--HAL

步驟 LCD初始化 LCD_Init(); //LCD初始化此函數在lcd.c文件里面 2. 設置LCD背景顏色 LCD_Clear(WHITE);此函數在lcd.c文件里面 3. 設置字體顏色 POINT_COLORRED; 寫入要顯示的字體 LCD_ShowString(10,80,240,24,24,"LTDC TEST");LCD_ShowSt…

JavaScript | 使用提示從用戶輸入值

Example 1) Input name and print 示例1)輸入名稱和打印 Code (JS & HTML): 代碼(JS和HTML)&#xff1a; <!DOCTYPE html><HTML><HEAD><SCRIPT>var name prompt("Enter Your name:");var msg "Welcome "name;//alert(msg)…

一個游戲程序員的學習資料 (zz)

一個游戲程序員的學習資料//z 2012-4-19 14:39:51 PM IS2120CSDN想起寫這篇文章是在看侯杰先生的《深入淺出MFC》時, 突然覺得自己在大學這幾年關于游戲編程方面還算是有些心得&#xff0c;因此寫出這篇小文,介紹我眼中的游戲程序 員的書單與源代碼參考。一則是作為自己今后兩年…

項目管理中工作分解結構模型(WBSM)的應用

摘要 本文根據工作分解結構(WBS)的工作特點&#xff0c;運用系統工程的思想理論方法&#xff0c;構建了工作分解結構模型&#xff0c;并提出了模型算法;該模型方法的建立使得WBS工作更加簡單可靠、思路清晰、基于更加可靠的科學基礎之上。 1、工作分解結構模型(WBSM)方法工作程…

實訓09.11:java重點內容介紹

package test;/** * OP:面向對象的簡稱* 類&#xff1a;同一特征的屬性* * 類的定義&#xff1a;具有相同特征和行為的事物的抽象。&#xff08;不具體化&#xff09;* 對象&#xff08;實例對象&#xff09;&#xff1a;具體真實存在的實例。* 類是對象的實例&#xff1a;* *…

SPI通信原理---STM32F4--HAL

SPI接口原理 SPI是一種高速全雙工同步通信&#xff0c;在芯片管腳上占用四根線&#xff0c;主要應用在EEPROM、FLASH、實時時鐘、AD轉換器&#xff0c;還有數字信號處理器和數字信號解碼器之間。 SPI接口使用4根線通信。 MISO&#xff1a;主設備數據輸入&#xff0c;從設備數…

Linux 引導管理器 grub2 使用簡介

轉自&#xff1a;杜昌彬的空間 首先向其致敬&#xff01;有改動。 grub是Linux系統即其他類unix系統的主流bootloder&#xff0c;由于grub原來版本的設計存在很大缺陷&#xff0c;與以前的grub很不相同&#xff0c;其使用和配置也發生很大變化。現在很多Linux發行版本都使用了…

pata1015_ATA / PATA的完整形式是什么?

pata1015ATA / PATA&#xff1a;高級技術附件/并行高級技術附件 (ATA/PATA: Advanced Technology Attachment/Parallel Advanced Technology Attachment) ATA is an abbreviation of Advanced Technology Attachment. ATA has existed for a long time with the name PATA. Whe…

產品

總結一下&#xff1a;  1、核心功能要做透&#xff0c;做的人家追不上&#xff0c;自己的優勢要盡量的發揮&#xff1b;  2、產品口碑要建立&#xff0c;要關注高端用戶&#xff0c;要調整自己心態&#xff1b;  3、敏捷、快&#xff0c;產品迭代要快&#xff0c;快速實現…

FreeRTOS在STM32F429上移植

準備工作 FreeRTOS系統源碼基礎工程&#xff0c;這里我們用跑馬燈實驗 1.在工程里面添加FreeRTOS源碼 在工程里面新建一個名為FreeROTS的文件夾 將FreeRTOS源碼添加到這個文件夾里面 protable里面只需留下Keil、MemMang、RVDS文件夾 2、向工程分組中添加文件 FreeRTOS_C…

C++中的指針與引用(轉)

原文地址&#xff1a;http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html寫在前面 指針和引用形式上很好區別&#xff0c;但是他們似乎有相同的功能,都能夠直接引用對象&#xff0c;對其進行直接的操作。但是什么時候使用指針&#xff1f;什么時候使用引用呢&…

實訓09.11:數據庫一些簡單操作

new Database 新建數據庫 new Table 新建表 utf-8 編碼格式 primary key 主鍵&#xff1a;特點&#xff1a;在表中是唯一的不可重復的&#xff0c;一般都是學號&#xff0c;編號 auto increment 自增&#xff0c;一般都把主鍵設置為自增 allow nul…

c語言中將整數轉換成字符串_在C語言中將ASCII字符串(char [])轉換為八進制字符串(char [])...

c語言中將整數轉換成字符串Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in C. 給定一個ASCII字符串(char [])&#xff0c;我們必須在C中將其轉換為八進制字符串(char [])。 Logic: 邏輯&#xff1a; To convert an ASCII string t…

Javascript的IE和Firefox兼容性匯編收藏.txt

document.form.item 問題 現有問題&#xff1a;現有代碼中存在許多 document.formName.item("itemName") 這樣的語句&#xff0c;不能在 MF 下運行 解決方法&#xff1a;改用 document.formName.elements["elementName"] 集合類對象問題 現有問題&#xff…