STC12C5A60S2使用模拟IIC通信与AT24C02芯片编程
文章目錄
- 一、前言
- 二、IIC通訊詳解
- 2-1、IC協(xié)議簡介
- 2-2、常用的IIC通訊設(shè)備
- 2-3、IIC物理層特點
- 2-4、IIC協(xié)議層特點
- 2-4-1、IIC基本讀寫過程
- 2-4-2、通訊起始和停止信號
- 2-4-3、數(shù)據(jù)有效性
- 2-5、IIC通信過程
- 2-6、IIC總線尋址方式
- 2-7、總結(jié)
- 三、AT24C02芯片介紹
- 四、例程參考
一、前言
使用STC12的模擬IIC與AT24C02編程并不是這一篇文章的重點,重點是能夠熟練掌握IIC通訊協(xié)議。學(xué)過編程的人應(yīng)該都有同樣一種體驗,當自己精通了一種編程語言的時候再去學(xué)習(xí)其他編程語言,就覺得非常的容易,雖然有一些差異,當基礎(chǔ)內(nèi)容相似。同樣的,同樣的我們掌握的AT24C02芯片的IIC讀寫功能,以后使用STM32、ESP8266控制其他設(shè)備的IIC也能得心用手。
二、IIC通訊詳解
2-1、IC協(xié)議簡介
IIC通訊協(xié)議(Inter - Integrated Circuit)是由Phiilps公司開發(fā)的,由于它引腳少,硬件簡單,可擴展性強,不需要搭載外部收發(fā)數(shù)據(jù)芯片,現(xiàn)被廣泛使用在系統(tǒng)多個集成電路的開發(fā)中。
2-2、常用的IIC通訊設(shè)備
AT24C02
MPU6050陀螺儀
BH1750
PCF8575模塊
…
2-3、IIC物理層特點
1、一條IIC總線可以掛載多個IIC設(shè)備。
2、IIC總線最多可以掛載多少個設(shè)備由它的地址決定的,8位地址,減去1位廣播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127個地址, 所以**理論上可以掛127個從器件** 。
3、IIC有兩條數(shù)據(jù)總線,一條雙向串行數(shù)據(jù)線(SDA),一條串行時鐘線。數(shù)據(jù)線用于標示數(shù)據(jù),時鐘線用于收發(fā)同步。
4、每個連接總線的設(shè)備地址都有一個獨立地址,主機可以利用這個地址進行不同設(shè)備之間的訪問。
5、總線通過上拉電阻接到電源,上拉電阻一般選擇4.7K。當IIC設(shè)備空閑時,會輸出高阻態(tài),相當于總線斷路。
6、多個設(shè)備同時使用總線時,為了防止數(shù)據(jù)沖突,會利用仲裁方式?jīng)Q定由哪個設(shè)備占用總線。總線之間是一個線與的特性。
7、IIC具有三種傳輸模式,標準模式100Kbit/s,快速模式400Kbit/s,高速模式3.4Mbit/s,但目前大多IIC設(shè)備不支持高速模式。
8、連接到相同總線的IIC數(shù)量受到總線最大電容400PF限制。
2-4、IIC協(xié)議層特點
IIC的協(xié)議定義了通訊的起始和停止信號、數(shù)據(jù)有效性、相應(yīng)、仲裁、時鐘同步和地址廣播等環(huán)節(jié)。
2-4-1、IIC基本讀寫過程
完整的IIC通訊過程是當主機發(fā)送起始信號啟動總線,然后主機發(fā)送一個字節(jié)數(shù)據(jù)指明從機地址和后續(xù)字節(jié)傳送方向,被尋址的從機發(fā)送應(yīng)答信號回復(fù)主機。現(xiàn)在就開始IIC的數(shù)據(jù)傳輸了,向從機發(fā)送/接收一個字節(jié)的數(shù)據(jù),當發(fā)送/接收完一個字節(jié)的數(shù)據(jù)后,主機/從機回復(fù)一個應(yīng)答信號,持續(xù)通訊重復(fù)此步奏即可,當IIC通訊完成后,回復(fù)一個非應(yīng)答信號,再發(fā)送停止信號結(jié)束總線。
2-4-2、通訊起始和停止信號
起始信號:當SCL線是高電平時,SDA線從高電平向低電平切換,這個情況表示通訊起始。
停止信號:當SCL是高電平時SDA線由低電平向高電平切換,表示通訊停止。
.
起始和停止信號一般由主機產(chǎn)生。
2-4-3、數(shù)據(jù)有效性
IIC數(shù)據(jù)有效性規(guī)定了SCL為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有SCL信號為低電平期間,SDA轉(zhuǎn)態(tài)才允許變化。
2-5、IIC通信過程
(循環(huán)步驟4-5)
n.通信完成后發(fā)送停止信號釋放總線
2-6、IIC總線尋址方式
2-7、總結(jié)
| 通訊速率 | 標準模式100Kbit/s,快速模式400Kbit/s,高速模式3.4Mbit/s |
| 總線最大掛載設(shè)備 | 127 |
三、AT24C02芯片介紹
AT24C02芯片手冊-百度百科
清翔51單片機開發(fā)板電路原理圖
由原理圖,查看芯片手冊可得知AT24C02芯片的硬件地址是0xa0
四、例程參考
# include <STC12C5A60S2.h> # include <intrins.h>#define uchar unsigned char #define uint unsigned int #define AT24C02_ADDR 0xa0 //AT24C02地址#define MAIN_Fosc 11059200L //宏定義主時鐘HZ //#define MAIN_Fosc 12000000L/*I2C IO口定義*/ sbit SDA = P2^0; sbit SCL = P2^1;//基于STC12單片機1us延時函數(shù) //函數(shù)說明:內(nèi)部調(diào)用 static void Delaym1us() {# if MAIN_Fosc == 11059200L//晶振11.0592MHz_nop_();#elif MAIN_Fosc == 12000000L//晶振12.000000MHZ_nop_();_nop_();#endif }//基于STC12單片機us延時函數(shù) //函數(shù)說明:外部調(diào)用 void Delay_us(uint time) {int i;for(i=0; i<time; i++){Delaym1us();} }/*5us延時*/ void delay_5us() {Delay_us(5); }/*1Ms延時*/ void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); }/*I2C初始化*/ void I2C_init() {SDA = 1;_nop_();SCL = 1;_nop_(); }/*I2C起始信號*/ void I2C_Start() {SCL = 1;_nop_();SDA = 1;delay_5us();SDA = 0;delay_5us(); }/*I2C終止信號*/ void I2C_Stop() {SDA = 0;_nop_();SCL = 1;delay_5us();SDA = 1;delay_5us(); }/*主機發(fā)送應(yīng)答*/ void Master_ACK(bit i) {SCL = 0; // 拉低時鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化_nop_(); // 讓總線穩(wěn)定if (i) //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機應(yīng)答{SDA = 0;}else {SDA = 1; //發(fā)送非應(yīng)答}_nop_();//讓總線穩(wěn)定SCL = 1;//拉高時鐘總線 讓從機從SDA線上讀走 主機的應(yīng)答信號delay_5us();SCL = 0;//拉低時鐘總線, 占用總線繼續(xù)通信_nop_();SDA = 1;//釋放SDA數(shù)據(jù)總線。_nop_(); }/*檢測從機應(yīng)答*/ bit Test_ACK() {SCL = 1;delay_5us();if (SDA){SCL = 0;_nop_();I2C_Stop();return(0);}else{SCL = 0;_nop_();return(1);} }/*發(fā)送一個字節(jié)*/ void I2C_send_byte(uchar byte) {uchar i;for(i = 0 ; i < 8 ; i++){SCL = 0;_nop_();if (byte & 0x80){ SDA = 1; _nop_(); } else{SDA = 0;_nop_();}SCL = 1;_nop_();byte <<= 1; // 0101 0100B }SCL = 0;_nop_();SDA = 1;_nop_(); }/*I2C 讀一字節(jié)*/ uchar I2C_read_byte() {uchar dat,i;SCL = 0;_nop_();SDA = 1;_nop_();for(i = 0 ; i < 8 ; i++){SCL = 1;_nop_();if (SDA) {dat |= 0x01; //}else{dat &= 0xfe; //1111 1110}_nop_();SCL = 0 ;_nop_();if(i < 7){dat = dat << 1; }}return(dat); }/*I2C發(fā)送數(shù)據(jù)*/ bit I2C_TransmitData(uchar ADDR, DAT) {I2C_Start();I2C_send_byte(AT24C02_ADDR+0);if (!Test_ACK()){return(0);}I2C_send_byte(ADDR); if (!Test_ACK()){return(0);}I2C_send_byte(DAT);if (!Test_ACK()){return(0);}I2C_Stop();return(1); }/*I2C接收數(shù)據(jù)*/ uchar I2C_ReceiveData(uchar ADDR) {uchar DAT;I2C_Start();I2C_send_byte(AT24C02_ADDR+0);if (!Test_ACK()){return(0);}I2C_send_byte(ADDR);Master_ACK(0);I2C_Start();I2C_send_byte(AT24C02_ADDR+1);if (!Test_ACK()){return(0);}DAT = I2C_read_byte();Master_ACK(0);I2C_Stop();return(DAT); }void main() {I2C_init();//I2C初始化if(!I2C_TransmitData(255,0xf0)); //往AT24C02第255個單元中寫入數(shù)據(jù)0XF0{P1 = 0;}delay(500);/**/P1 = I2C_ReceiveData(255);//從AT24C02第255個單元中讀取數(shù)據(jù)while(1); }文章理論參考資料《STM32庫開發(fā)實戰(zhàn)指南》
總結(jié)
以上是生活随笔為你收集整理的STC12C5A60S2使用模拟IIC通信与AT24C02芯片编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 中如何修改栈的深度
- 下一篇: 英伟达证书泄漏、CISA增加95个必修漏