1. 程式人生 > >微控制器模擬IIC時序讀寫24C02

微控制器模擬IIC時序讀寫24C02

一、什麼是IIC匯流排
IIC即積體電路匯流排,也是一種非常常用的匯流排是由飛利浦半導體公司在八十年代初設計出來的,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同時每個晶片都可以作為實時資料傳輸的控制源。

注意:IIC晶片在工業上的應用也是非常重要的,與串列埠、SPI、CAN等匯流排齊名。

二、IIC匯流排協議簡介

IIC序列匯流排一般有兩根訊號線,一根是雙向的資料線SDA,另一根是時鐘線SCL。所有接到IIC匯流排裝置上的序列資料SDA都接到匯流排的SDA上,各裝置的時鐘線SCL接到匯流排的SCL上。同時為了保證資料可靠地傳送,任一時刻匯流排只能由某一臺主機控制。


在I2C匯流排傳輸過程中,將兩種特定的情況定義為開始和停止條件:當SCL保持"高"時,SDA由"高"變為"低"為開始條件;當SCL保持"高"且SDA由"低"變為"高"時為停止條件。開始和停止條件均由主控制器產生。使用硬體介面可以很容易地檢測到開始和停止條件,沒有這種介面的微機必須以每時鐘週期至少兩次對SDA取樣,以檢測這種變化。且SDA線上的資料在時鐘"高"期間必須是穩定的,只有當SCL線上的時鐘訊號為低時,資料線上的"高"或"低"狀態才可以改變。輸出到SDA線上的每個位元組必須是8位,每次傳輸的位元組不受限制,但每個位元組必須要有一個應答ACK。如果一接收器件在完成其他功能(如一內部中斷)前不能

接收另一資料的完整位元組時,它可以保持時鐘線SCL為低,以促使傳送器進入等待狀態;當接收器準備好接受資料的其它位元組並釋放時鐘SCL後,資料傳輸繼續進行。



IIC資料傳輸格式如下:




三、24C02晶片介紹
24C02序列E2PROM是基於IIC匯流排的儲存器件,遵循二線制協議,由於其具有介面方便,體積小,資料掉電不丟失等特點,在儀器儀表及工業自動化控制中得到大量的應用。24C02在電路的作用主要是在掉電的情況下儲存資料,具體引數不進行詳細論述。詳細資料請參考24C02的datasheet。

相關控制需要的時序引數如下:










四、協議時序詳解


void start(void)
{
 sda=1;
 delay();
 scl=1;
 delay();
 sda=0;
 delay();
}


void stop(void)
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay(); 
}


void ack(void)
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<200))i++;
 scl=0;
 delay();
}


void noack(void)
{
 sda=1;
 delay();
 scl=1;
 delay();
 scl=0;
 delay();
}

void write_byte(uchar add,uchar dat)
{
 init();
 start();
 iicwr_byte(0xa0);
 ack();
 iicwr_byte(add);
 ack();
 iicwr_byte(dat);
 ack();
 stop(); 
}


uchar read_byte(uchar add)
{
 uchar a;
 init();
 start();
 iicwr_byte(0xa0);
 ack();
 iicwr_byte(add);
 ack();
 start();
 iicwr_byte(0xa1);
 ack();
 a=iicre_byte();
 noack();
 stop();
 return a; 
}
五、硬體電路設計


六、軟體程式設計

設計程式,系統每開關機一次,記錄一次並用數碼管顯示

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint unsigned int 

sbit sda=P1^1;
sbit scl=P1^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void iic_init(void);
void start(void);
void stop(void);
void ack(void);
void noack(void);
void iicwr_byte(uchar dat);
uchar iicre_byte(void);
void delay (void);
void init(void);
void delay1(void);
void write_byte(uchar add,uchar dat);
uchar read_byte(uchar add);
///////////////////////////////////

void delay1(void)
{
 uint a=30000;
 while(a--);
}

void delay (void)
{
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
}

void start(void)
{
 sda=1;
 delay();
 scl=1;
 delay();
 sda=0;
 delay();
}

void stop(void)
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay(); 
}

void ack(void)
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<200))i++;
 scl=0;
 delay();
}

void noack(void)
{
 sda=1;
 delay();
 scl=1;
 delay();
 scl=0;
 delay();
}

void iic_init(void)
{
 sda=1;
 scl=1;
}

void iicwr_byte(uchar dat)
{
 uchar i;
 scl=0;
 for(i=0;i<8;i++)
 {
  if(dat&0x80)
  {
   sda=1; 
  }
  else 
  {
   sda=0;
  }
  dat=dat<<1;
  delay();
  scl=1;
  delay();
  scl=0;
  delay();    
 }
 sda=1;
 delay();
}

uchar iicre_byte(void)
{
 uchar i;
 uchar dat;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++)
 {
  scl=1;
  delay();
  dat=dat<<1;
  if(sda)
  {
   dat++;// 
  }
  scl=0;
  delay();
 }
 return dat;  
}


void main()
{
 uchar k;
 
 iic_init();
 k=read_byte(0x11);
 k=k%10;
 P1=smg_du[k];	//測試用,靜態顯示幾個算啦
 k++;
 write_byte(0x11,k);

 while(1);
}

void write_byte(uchar add,uchar dat)
{
 iic_init();
 start();
 iicwr_byte(0xa0);
 ack();
 iicwr_byte(add);
 ack();
 iicwr_byte(dat);
 ack();
 stop(); 
}

uchar read_byte(uchar add)
{
 uchar a;
 iic_init();
 start();
 iicwr_byte(0xa0);
 ack();
 iicwr_byte(add);
 ack();
 start();
 iicwr_byte(0xa1);
 ack();
 a=iicre_byte();
 noack();
 stop();
 return a; 
}

注意:並不是所有的24系列的儲存晶片都適用本程式的讀寫流程,有些晶片有部分不同,如24C64就分高低地址,要根據實際應用的晶片參考相關的晶片資料手冊,檢視訪問流程。

相關推薦

微控制器模擬IIC時序24C02

一、什麼是IIC匯流排 IIC即積體電路匯流排,也是一種非常常用的匯流排是由飛利浦半導體公司在八十年代初設計出來的,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同時每個晶片都可以作為實時資料傳輸的控制源。 注意

IIC AT24C02數據的一點小體會

ddr delay cuc div src timer amp focus har 一、寫數據 unsigned char I2CWriteByte(unsigned int mem_addr,unsigned char*DDATAp,unsigned int cou

STM3224c02總結

       這兩天學習STM32的IIC,實現讀寫24c02的資料,對IIC不是那麼的陌生,在這裡,將這兩天的學習的流程總結下,整理整理自己的思路。 簡潔       

STM32F0開發筆記9: 微控制器內部Flash的

本文介紹應用C語言進行微控制器內部Flash的讀寫技巧,將從檢視文件開始,到最終完成完整的程式。 微控制器型號:STM32F070F6P6 步驟如下: 1、檢視文件《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based

verilog中24LC04B iic(i2c)通訊設計步驟,以及程式常見寫法錯誤。

板子使用的是黑金的是xilinx spartan—6開發板,首先準備一份24LC04B晶片資料,讀懂資料後列出關鍵引數。 如下: 1、空閒狀態為SDA和SCL都為高電平 2、開始狀態為:保持SCL,SDA高電平不變,SDA 保持最少4us,之後SDA為低,保持最少4us

基於嵌入式linux iic 匯流排mpu6050

/************************************************************/ //檔名:mpu6050.c //功能:測試linux下iic讀寫mpu6050程式 //使用說明: (1) // (2) // (3) //

Linux ARM IIC I2C EEPROM 操作

linux arm iic i2c eeprom 讀寫操作檢測有幾組i2c總線root@beaglebone:~# i2cdetect -l i2c-0 i2c OMAP I2C adapter I2C adapter i2c-1 i2c OMAP

Java通過模擬緩存池

runnable 一個 nbsp 今天 ted pub 項目 時長 讀寫鎖 緩存池在項目開發中時長用到,在查看了一下相關的資料,發現很多博客中對緩存池的實現有存在著一些漏洞,今天花了點時間梳理一下,用JDK1.5中並發包中的ReentrantReadWriteLock實現

ARM裸板開發:07_IIC 通過IIC總線接口時鐘芯片時間參數實現的總結

乘法 說明 ash from 庫函數 != 函數 lock 除法 問題一:程序直接在iRAM內部可正常執行,而程序搬移(Nand ->SDRAM)之後,就不能正常運行了 #define NAND_SECTOR_SIZE 2048 /* 讀函數 */ vo

ASP.NET Core2InfluxDB時序資料庫

在我們很多應用中會遇到有一種基於一系列時間的資料需要處理,通過時間的順序可以將這些資料點連成線,再通過資料統計後可以做成多緯度的報表,也可通過機器學習來實現資料的預測告警。而時序資料庫就是用於存放管理這種有著時間順序資料的,時序資料庫一般都支援時序資料的快速寫入、持久化、多緯度的聚合查詢等基本功能。 &nb

1602時序,圖示時間P0=COM在E使能前

1602液晶引腳功能 從下表中可以看到,微控制器能控制的主要是RS.R/W和E三個引腳。怎麼控制它們呢?這需要從1602的讀寫時序圖中尋找答案。如何看懂時序圖是關鍵,操作一個器件的精華就蘊藏在時序圖中,看懂了時序,就很容易操控這個晶片了。 1602液晶引腳介面功能說明 1602寫時

LINUX系統識別外設(基於C的自動)(LINUX模擬U盤)【二】

前言 最近在開發基於量子隨機數的離線金鑰充值系統,主要功能是對外設進行充值隨機數金鑰。軟體部署在centos7系統上,因此需要軟體自動識別系統是否有外設通過USB口接入裝置。 在上一章中我簡單介紹瞭如何去對linux系統中的外來儲存裝置進行讀寫操作,在本章中我將繼續講解,

RT-Thread使用I2Ceeprom例程(24c02

實驗準備: 開發板:正點原子探索者 RT-Thread原始碼 env工具 env配置: 使能相關的uart,用於開啟控制檯 開啟I2C裝置: 實驗原始碼: #include <rtthread.h> #include <rtd

I2C 模擬程式碼

  static void Delay1us(void)//please revise this function according to your system { u8 i; for(i=0;i<15;i++); } void I2C_init(void)

深入解讀微控制器IO口模擬IIC程式設計

在微控制器的開發過程中,經常會使用IIC介面連線外部感測器獲得相應的資料。一旦我們的IIC介面數目較多而微控制器固有的IIC介面不夠的情況,這時一個微控制器普通IO口模擬IIC的做法可以解決我們的尷尬。這篇部落格詳細的介紹STM32F103的IO口模擬IIC的詳細做法。

51微控制器EEPROM(AT24C02)

AT24C02的儲存容量為2K bit,內容分成32頁,每頁8Byte,共256Byte,操作時有兩種定址方式:晶片定址和片內子地址定址。 (1)晶片定址:AT24C02的晶片地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0可程式設計地址選擇

AT24Cxx晶片--IIC匯流排

   型號               容量               器件定址位元組(8位)       一次裝載位元組數  AT24C01        128×8        1010A2A1A0 R/W                 8 AT24C02       256×8         1

STM32F103微控制器軟體模擬IIC並讀取TMP112數字溫度感測器

本文利用STM32F103系列微控制器讀取TMP112數字溫度感測器的溫度資訊,TMP112數字感測器採用IIC匯流排協議通訊。STM32自身含有硬體IIC資源,分別是PB6-->SCL、PB7-->SDA,硬體IIC的操作在STM32開發板對應的資料上均有給出

Java 模擬servlet執行、DTD約束、Schema約束、dom4j解析(xml)

模擬servlet執行 瀏覽器請求WEB伺服器上的資源,WEB伺服器返回給瀏覽器   瀏覽器的入口不同(訪問路徑),訪問的資源也不同。 我們需要使用xml約束(DTD或schema);為了獲得xml的內容,我們需要使用dom4j進行解析。   XML(不同路徑(/hello)執

51微控制器控制K9K8G08U0C NAND Flash程式

網上看到這個原始碼,雖然感覺51用到nandflash的情況不多,但是可以借鑑理解nandflash的讀寫流程 #include< STC12C5A60S2.H> #include< intrins.h> #include < SMG.h>