我們今天來講I2C通信。那I2C通信的特點是什么能。我們一般使用的串口 (半雙工異步串行通信)與I2C 有什么區別呢。
串口(半雙工異步串行通信):就是好像朋友在對話。我可以主動和你講話,你也可以主動和我講話。
I2C:就好像上下級對話。一個領導面對一個或者多個員工。只有領導主動說話的份兒,下面的員工不能主動說話。只有領導問了,員工才能答。
I2C通信
I2C通信只需要兩個引腳 一個數據線,一個時鐘線。 數據線顧名思義就是用來傳遞數據的。時鐘線是來決定數據傳輸的速度。當時鐘線為高電平時,數據線上的數據才會被認為是有效的。
數據線的 數據有四種狀態 : 高電平,低電平,下降沿(高電平變低電平),上升沿(低電平變高電平)。
當時鐘線為高電平時候這四種狀態分別代表:1,0,起始位,停止位。
如果我們發送的數據為十六進制的0x88即是二進制為10001000的數據是怎么發送的呢?我們就以此為例一步步講解。
1、常態
在不發送任何數據的時候數據線和時鐘線都為高電平。一般為了保證能帶動128個從設備。大部分芯片的I2C通信接口都是用開漏輸出(只能接通地不能輸出高電平),所以數據線和時鐘線都要加上拉電阻。
2、起始
當開始發送數據的時候 時鐘線為高同時數據線從 高電平變低電平,代表開始發送數據。
3、發送數據
發送完起始位后 時鐘線變為低電平,在發送每一位的數據之前時鐘線有一段低電平,主要的作用是給數據線做電平變化用的。
我們現在要發送的第一個位是 1。
1、時鐘線為低,同時數據線從低電平變成高電平。
2、接著時鐘線變為高電平,此時接收方得知時鐘線為高,便查看數據線為高電平 說明數據為 “1”。
3、我們要發送的下一個位為0。時鐘線再變為低,同時數據線從高電平變成低電平。
4、接著時鐘線再變為高電平,此時接收方得知時鐘線為高,便查看數據線為低電平 說明數據為"0"。
5、再下一個為還為0。時鐘線再變為低,同時數據線一直保持低電平不變。
6、接著時鐘線再變為高電平,此時接收方得知時鐘線為高,便查看數據線為低電平 說明數據為”0“。
以此類推 直到發送完所有的位。
4,應答(ACK)
當接收方接收完一個字節的數據就要告訴對方我收到了。接收方如果接收到數據則控制數據線輸出低電平。否則為高電平。
5,停止
沒有下一個字節要發送,最后時鐘線變為高電平后,數據線從低電平變為高電平。代表數據發送停止。
實例講解: 使用單片機使用 RSM2257 電子音量控制芯片來控制音量。一個按鍵按下,聲音變大,一個按鍵按下,聲音變小。在加上一個按鍵,控制一個LED亮滅的程序。而且音量掉電保存。
介紹RSM2257.
子地址
在I2C通信中每一個從設備都有個子地址,因為I2C支持一主多從,也就是說有一個主機可以連接多個從機。每個從機,都有個地址。就好像每個人的名字一樣來區分不同的設備。下面是RSM2257接口協議,首先先發送RSM2257 設備地址 10001000.然后再發送數據。
數據
RSM2257的數據是用來表示音量大小的。我們控制兩個音頻通道,以10dB為單位降低或增加音量。從功能設置位表格中可知數據為 11100B2B1B0.
B2B1B0的數值決定了音量。請詳見 衰減設置位。
單片機I2C通信初始化設置
1、設置端口為輸入
TRISC0 = input;
TRISC1 = input;
2、設置模式
我們設置ssp1控制寄存器的 SSP1M<3:0>.我們需要的是I2C主模式。設置如下
SSP1CON1bits.SSPM0 = 0;
SSP1CON1bits.SSPM1 = 0;
SSP1CON1bits.SSPM2 = 0;
SSP1CON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1))
3、設置時鐘線頻率RSM2257最大為100KHZ,我選擇設置為50KHZ.
使用計算公式clock=Fosc/(4*(SSPxADD+1)) 計算出SSP1ADD的值為0x9F;
SSP1ADD=0x9F;
4、開啟I2C通信
SSP1CON1bits.SSPEN = 1;
單片機I2C發送程序
1、發送起始位
SSP1CON2bits.SEN = 1;//Start condition
while(SSP1CON2bits.SEN == 1);//waiting for Start condition completed.
2、發送地址
PIR1bits.SSP1IF = 0;
SSP1BUF = 0x88;//Device Address
while(PIR1bits.SSP1IF == 0);
PIR1bits.SSP1IF = 0;
// ~ACK 我們不理會接收方有沒有應答。
3、發送 10db音量控制的數據
SSP1BUF = tx_data;//Data 10db level
while(PIR1bits.SSP1IF == 0);
PIR1bits.SSP1IF = 0;
4、發送1db音量控制的數據
// ~ACK
SSP1BUF = 0xD0;//Data 1db level
while(PIR1bits.SSP1IF == 0);
PIR1bits.SSP1IF = 0;
5、發送停止位
// ~ACK
SSP1CON2bits.PEN = 1;//Stop condition
關于I2C通信協議,RSM2257,PIC MSSP 模塊設置成I2C,更詳細的內容就必須去看數據手冊了。
實例程序:程序分為main.c 和 define.h兩個文件 芯片PIC16LF1823,開發環境MPLAB X IDE.
define.h文件
/**********RA*********/
//B'1111,1000'H F8
#define LED_SW RA5//IN
#define UP_SW RA4//IN
#define DOWN_SW RA3//IN
#define LED RA2//OUT
//RA1
//RA0
/**********RC***********/
//H FF
//RC0 SCL
//RC1 SDA
#define input 1
#define LED_VALUE 1
#define UP_VALUE 2
#define DOWN_VALUE 3
#define key_delay 300
main.c文件
#include #include"define.h" __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON &CLKOUTEN_OFF&IESO_ON&FCMEN_ON); __CONFIG(PLLEN_OFF&LVP_OFF) ; void tx_pro(unsigned char tx_db); unsigned char DB_VALUE; void init_fosc(void) { OSCCON = 0xF0;//32MHZ } void init_gpio(void) { PORTA=0; LATA =0; ANSELA=0x00; TRISA =0xF8; PORTC=0; LATC=0; ANSELC = 0x00; TRISC =0xFF; } void init_i2c_master() { TRISC0 = input; TRISC1 = input; SSP1CON1bits.SSPM0 = 0; SSP1CON1bits.SSPM1 = 0; SSP1CON1bits.SSPM2 = 0; SSP1CON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1)) SSP1STATbits.SMP = 1; SSP1ADD = 0x9F;//SCL CLOCK Frequency 50KHZ SSP1CON1bits.SSPEN = 1; } void i2c_master_tx(unsigned char tx_data) { SSP1CON2bits.SEN = 1;//Start condition while(SSP1CON2bits.SEN == 1);//waiting for Start condition completed. PIR1bits.SSP1IF = 0; SSP1BUF = 0x88;//Device Address while(PIR1bits.SSP1IF == 0); PIR1bits.SSP1IF = 0; // ~ACK SSP1BUF = tx_data;//Data 10db level while(PIR1bits.SSP1IF == 0); PIR1bits.SSP1IF = 0; // ~ACK SSP1BUF = 0xD0;//Data 1db level while(PIR1bits.SSP1IF == 0); PIR1bits.SSP1IF = 0; // ~ACK SSP1CON2bits.PEN = 1;//Stop condition } void delay(unsigned int n) { while(n--); } unsigned char key_board(void) { if(LED_SW==1) { delay(key_delay); if(LED_SW==1) { while(LED_SW==1); return LED_VALUE; } } if(UP_SW==1) { delay(key_delay); if(UP_SW==1) { while(UP_SW==1); return UP_VALUE; } } if(DOWN_SW==1) { delay(key_delay); if(DOWN_SW==1) { while(DOWN_SW==1); return DOWN_VALUE; } } return 0; } void DB_INC(void) { if(DB_VALUE < 7) { DB_VALUE++; eeprom_write(0x00, DB_VALUE);//將音量值保存到EEPROM這樣掉電后數據也不會丟失。 tx_pro(DB_VALUE); } } void DB_DEC(void) { if(DB_VALUE > 0) { DB_VALUE --; eeprom_write(0x00, DB_VALUE); tx_pro(DB_VALUE); } } void tx_pro(unsigned char tx_db) { tx_db |= 0xE0; //將高三位設置為1。表示兩個音頻通道,以10dB為單位降低或增加音量 i2c_master_tx(tx_db);//I2C發送數據程序 } /* * */ int main(int argc, char** argv) { unsigned char keyvalue; init_fosc(); init_gpio(); init_i2c_master(); LED=0; DB_VALUE= eeprom_read(0x00);//讀eeprom 中保存的音量值 if(DB_VALUE > 7)//如果之前沒有設置過則音量不衰減 { DB_VALUE = 0; } tx_pro(DB_VALUE);//用I2C通信設置RSM2257的音量 while(1) { keyvalue=key_board();//判斷按鍵程序, switch(keyvalue) { case LED_VALUE://LED按鍵按下 { LED = ~LED; };break; case UP_VALUE://音量加 { DB_INC(); };break; case DOWN_VALUE://音量減 { DB_DEC(); };break; } } }
上一篇:[PIC12 CORE] PC=0x0002 Stack overflow executing CALL instruction 錯誤
下一篇:[MPLAB] 分享一款mplab x ide 插件------Code Configurator
推薦閱讀
史海拾趣
隨著市場需求的不斷增長,意普(ESPE)公司開始拓展產品線,推出了包括通用光柵、反射板等一系列光電保護產品。同時,公司注重產品創新,不斷引進國外先進技術,并結合國內市場需求進行改進,成功推出了多款具有競爭力的新產品。這些產品廣泛應用于機械加工、汽車制造等行業,有效提升了客戶的安全生產水平。
在電子行業中,技術創新是企業持續發展的關鍵。DAICO公司始終將研發創新作為核心戰略,不斷投入大量資源用于新技術和新產品的研發。通過持續的創新和積累,DAICO在中頻/射頻和微波控制領域取得了多項技術領先成果,成為行業內的佼佼者。
DAICO公司成立于XXXX年,最初是一家位于加利福尼亞的小型私營公司。在公司成立的初期,DAICO專注于研發和生產中頻/射頻和微波控制產品,以及放大器。這些產品主要用于國防電子和航空航天領域,為DAICO在電子行業中打下了堅實的基礎。
近年來,AVX在汽車領域的應用也取得了顯著進展。隨著汽車行業的快速發展,對電子元件的需求也日益增長。AVX憑借其卓越的技術和品質,成功為汽車安全性、發動機控制、信息娛樂和底盤控制技術的開發提供了關鍵支持。AVX的產品廣泛應用于各類汽車中,為提升汽車性能和安全性做出了積極貢獻。
以上五個故事展示了AVX公司在電子行業中的發展歷程和取得的成就。從創立初期到如今的全球化布局,AVX始終堅持以技術創新和市場拓展為核心,不斷推動公司的發展。同時,AVX也積極關注可持續發展和綠色技術,為行業的進步做出了積極貢獻。
BALLUFF公司的歷史可以追溯到1921年,由格布哈德·巴魯夫(Gebhard Balluff)創建的一家機械修理廠開始。這家修理廠起初規模較小,但巴魯夫憑借其對機械技術的精湛理解和不懈追求,逐漸將業務發展壯大。他通過不斷的技術創新和產品升級,使得修理廠逐漸轉型為一家專注于生產精密部件、車件和銑件的企業。這一轉變不僅奠定了BALLUFF公司的工業基礎,也為其日后在傳感器領域的崛起打下了堅實基礎。
信產部副部長奚國華在中國電信2006年度工作會議上“3G發牌決策時機已到”的表態使人們相信,3G最引人關注的“牌照發放”問題很快將水落石出。3G是否意味著小靈通的終結?這是超過8000萬小靈通用戶更為關心的問題。… 查看全部問答∨ |
|
QuartusII 10.0 的新穎之處的確吸引著大家,但是由于是用QT重寫了quartus,可能很多地方存在bug 1。有沒有安裝完10.0之后并口下載線無法找到的?我的bbii不能用了!!! 聲明一下,我的系統是重新裝的,沒有老版本的quartus存在!直接安裝的10. ...… 查看全部問答∨ |
wince 和 activesync連接不上,各位哥哥姐姐幫幫我把 1。前幾天是可以連接上的,昨天起連不上了,證明這個版本的wince是可以用的 2。我的系統上2440,我重新下載了wince5.0的鏡像文件,用的是usb下載方式,證明usb口和usb線是可以用的,用串口調試看 wince也啟動起來了 3。無論我是先啟動2440再插usb ...… 查看全部問答∨ |
請問有哪位大蝦在vxworks系統下的的目標板上使用過can總線,怎么才能把can總線安裝到目標板上實現通信,驅動程序是怎么搞定的,先謝了!! 請問有哪位大蝦在vxworks系統下的的目標板上使用過can總線,怎么才能把can總線安裝到目標板上實現通信,驅動程序是怎么搞定的,先謝了!!我現在要做的是在目標板上使用can總線來和外部器件進行通信,可是完全不知道怎么弄,那位大蝦能幫小弟解決這 ...… 查看全部問答∨ |
從“0x00,0x32”后面開始就不知道什么意思了 {0xff,0x03,0xc0,0x21,0x01,0x00,0x00,0x32,0x02,0x06,0,0,0,0,0x05,0x06,0x02,0xb6,0x5f,0x43,0x07,0x02,0x08,0x02,0x0d,0x03,0x06,0x11,0x04,0x06,0x4e,0x13,0x17,0x01,0x6c,0xf1,0x2d,0x0c,0x43,0x2 ...… 查看全部問答∨ |
請教一下quartus下下載的問題 用jtag模式都正確,下載.jic文件也可以 但是用as模式后就會出現不能識別id的錯誤 將*.sof轉換為jic再用jtag下載后,可以正常工作,但是拔掉下載線后系統就不工作了,請問下怎么回事?錯在哪兒? 配置芯片用萬用表 ...… 查看全部問答∨ |
32位處理器,16位外部數據總線,總線周期為0.00005s.該處理器可以支持的最大數據傳送速度為多少?外部數據總線增加到21位或者外部時鐘頻率增加,哪種更能提高處理器性能?… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析