娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年07月10日(星期三)

正在發生

2020年04月25日 | PIC單片機之I2C通信(主模式)

發布者:數字舞者 來源: eefocus關鍵字:PIC單片機  I2C通信  主模式 手機看文章 掃描二維碼
隨時隨地手機看文章

    我們今天來講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;

         }



    }



}

關鍵字:PIC單片機  I2C通信  主模式 引用地址:PIC單片機之I2C通信(主模式)

上一篇:[PIC12 CORE] PC=0x0002 Stack overflow executing CALL instruction 錯誤
下一篇:[MPLAB] 分享一款mplab x ide 插件------Code Configurator

推薦閱讀

一位正在某家傳統嵌入式系統廠商負責物聯網業務新部門的主管,分享了他從"戰場壕溝"看到的市場景象…“我穿著牛仔褲在這里的測試實驗室工作,協助一家自動化倉儲開發機箱,并執行智能攝影機的布線;”Rob Risany自我介紹。他是去年7月離開IBM的Watson部門,加入凌華科技(ADLink)這家工業計算機主板、網關供貨商,協助建立一個物聯網(IoT)新事業群。總部位...
一、UCOSIII任務調度1、可剝奪型任務調度定義:任務調度就是中止當前正在運行的任務轉而去執行其他的任務(UCOSIII是可剝奪型內核,因此當一個高優先級的任務準備就緒,并且此時發生了任務調度,那么這個高優先級的任務就會獲得CPU的使用權) UCOSIII中的任務調度是由任務調度器來完成的,任務調度器有2種:任務級調度器和中斷級調度器。 任務級調...
中國儲能網訊:本文在儲能參與電網調頻的控制方法中考慮了儲能電池的調頻死區,為充分發揮儲能快速、精準響應在電網調頻中的潛力,將儲能調頻死區的界限設置在常規機組死區的范圍內,有效改善電網頻率質量,并避免常規機組參與調頻的頻繁動作。 通過分析虛擬下垂與虛擬慣性控制對電網頻率的影響,提出一種將二者合理結合的控制方法,依據系統調頻需求,...
微美全息軟件有限公司(納斯達克: WiMi)(以下簡稱為“微美全息”或“公司”),一家領先的全息AR應用技術提供商,獲得霧化粒徑為2-4微米全息實時成像的專利。本專利為公司自主研發的成果,有利于公司進一步完善知識產權保護體系,保持技術領先地位,提升公司的核心競爭力。本專利提供的全息實時成像系統,其有益效果在于,利用空間光調制器取代傳統的全息...

史海拾趣

問答坊 | AI 解惑

IPTV - 新的博奕戰場

信產部副部長奚國華在中國電信2006年度工作會議上“3G發牌決策時機已到”的表態使人們相信,3G最引人關注的“牌照發放”問題很快將水落石出。3G是否意味著小靈通的終結?這是超過8000萬小靈通用戶更為關心的問題。…

查看全部問答∨

156最后一個

還想看看嗎。…

查看全部問答∨

這個圖小字部分看得清么?

小弟入行不深,在網上看到了這,但是最左邊是在看不清楚,請大大們幫忙解釋下。 …

查看全部問答∨

求助:plc 選型

主要是用PLC和觸摸屏做一個控制柜(用于水泥廠的立磨),沒有其他特別要求。總共I/O點數分別為:DI 101個,DO 32個,AI 58個,AO 7個。要求接口要有20%的冗余。 請大家支招,用哪個型號的PLC?謝謝!…

查看全部問答∨

QuartusII10.0 Bug匯總

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總線來和外部器件進行通信,可是完全不知道怎么弄,那位大蝦能幫小弟解決這 ...…

查看全部問答∨

麻煩幫分析一下這個ppp數據包

從“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 ...…

查看全部問答∨

FPGA用AS模式下載的問題

請教一下quartus下下載的問題 用jtag模式都正確,下載.jic文件也可以 但是用as模式后就會出現不能識別id的錯誤 將*.sof轉換為jic再用jtag下載后,可以正常工作,但是拔掉下載線后系統就不工作了,請問下怎么回事?錯在哪兒? 配置芯片用萬用表 ...…

查看全部問答∨

外部數據總線與處理器速度

32位處理器,16位外部數據總線,總線周期為0.00005s.該處理器可以支持的最大數據傳送速度為多少?外部數據總線增加到21位或者外部時鐘頻率增加,哪種更能提高處理器性能?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 河曲县| 贵港市| 桐梓县| 灵石县| 林州市| 当涂县| 碌曲县| 武宁县| 巩留县| 沙田区| 新邵县| 台山市| 怀仁县| 桐梓县| 永胜县| 繁峙县| 万荣县| 如皋市| 习水县| 临夏县| 朝阳县| 读书| 芦溪县| 凤台县| 涡阳县| 上思县| 始兴县| 囊谦县| 大庆市| 禹城市| 宁明县| 萨嘎县| 西乡县| 论坛| 沧州市| 江阴市| 垦利县| 前郭尔| 明水县| 永春县| 泗水县|