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