智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

PIC單片機之I2C(從模式)實例講解

來源:網絡

點擊:1765

A+ A-

所屬頻道:新聞中心

關鍵詞: PIC單片機,I2C

      網上有許多講解單片機實現I2C主模式,但是從模式的很少。我現在就來講講PIC單片機使用MSSP模塊實現I2C從模式。

      有關I2C協議的具體介紹可以看 《PIC單片機之I2C(主模式)》,我們這里直接講解實例

      實例講解:我們模仿 AT24C02 EEPROM 的協議。讓一個主模式的單片機,來讀取從模式單片機的數據。

      下面為AT24C02的隨機地址讀取的協議。

      第一個字節 :輸入7位地址和一位的寫狀態位,

      第二個字節:然后寫入EEPROM數據地址,

      第三個字節:輸入7位地址和一位的讀狀態位,

      第四~N個字節:讀出的EEPROM的數據。

    PIC單片機之I2C(從模式)實例講解

      我們來講解下程序的基本思路:我們使能了MSSP中斷,即是I2C接收中斷,當PIC單片機接收到一個數據后就會產生中斷。那是接收到設備地址,還是接收到數據,由SSP1STAT寄存器的狀態位來判斷。

      需要判斷的狀態位分別是 :

      數據和地址: 用來判斷接收到是地址還是數據

      啟動位: 用來判斷是否接收到啟動位

      讀寫: 用來判斷是寫狀態還是讀狀態。

      緩存滿: 用來判斷緩沖區是否滿

      我們以隨機地址讀取為例:講講程序執行的過程

      1,從單片機接收到啟示位和設備地址中斷:我們判斷SSP1STAT的狀態位為(寫狀態,地址,緩存滿,接收到啟示位) 然后讀取緩存中的設備地址, 接著在讀取 需要讀/寫的數據地址。

      2,單片機再次接收到設備地址:我們判斷是SSP1STAT的狀態為(讀狀態)然后從設備就輸出數據

    PIC單片機之I2C(從模式)實例講解

      我們以寫字節數據為例:

      1,從單片機接收到啟示位和設備地址中斷:我們判斷SSP1STAT的狀態位為(寫狀態,地址,緩存滿,接收到啟示位) 然后讀取緩存中的設備地址, 接著在讀取 需要讀/寫的數據地址。

      2,單片機判斷SSP1STAT的狀態位為(寫狀態,數據,緩存滿)那么單片機就接收輸入的數據。

      初始化設置:

      1,設置I2C通信的兩引腳為CLK SCL為輸入,

      TRISB6 = input;

      TRISB4 = input;

      2,將MSSP設置為I2C從模式,七位從地址

      SSP1CONbits.SSPM0 = 0;

      SSP1CONbits.SSPM1 = 1;

      SSP1CONbits.SSPM2 = 1;

      SSP1CONbits.SSPM3 = 0;// I2C slave mode ,7bit address

      3,使能CLK時鐘

      SSP1CONbits.CKP = 1; // enable clock

      4,設置從設備地址為 0xA0

      SSP1ADD =0xA0; //slave address is 0xa0

      5,開啟I2C

      SSP1CONbits.SSPEN=1;//enable I2c

      6,清楚狀態標志

      SSPSTAT=0;

      7,使能I2C中斷

      PIE1bits.SSP1IE = 1;//Enabe interrupt MSSP

      INTCONbits.PEIE = 1;

      INTCONbits.GIE = 1;

      如果你要使用PIC單片機I2C從模式只要使用下面的代碼:

      將void i2c_salve_interrupt_tx();void i2c_salve_interrupt_rx();放到中斷程序中,如下:

      void interrupt isr(void)

      {

      if(SSP1IE && SSP1IF)

      {

      i2c_salve_interrupt_tx();

      i2c_salve_interrupt_rx();

      SSP1IF=0;

      }

      }

      將初始化函數init_i2c_slave();放到主函數中

      void main()

      {

      init_i2c_slave();

      }

      頭文件 :i2c_salve.h

      #ifndef _I2C_SALVE_H

      #define _I2C_SALVE_H

      void init_i2c_slave();

      void i2c_salve_interrupt_tx();

      void i2c_salve_interrupt_rx();

      #endif

      代碼:i2c_salve.c

      #include ;

      #define input 1

      #define RX_BUF_LEN 29

      #define while_delay 6000

      unsigned char i2c_address,word_address,Register[29];

      unsigned char RANDOM_READ,i2c_counter;

      extern unsigned char A_readflag;

      /*I2C SALVE */

      void init_i2c_slave()

      {

      TRISB6 = input;

      TRISB4 = input;

      SSP1CONbits.SSPM0 = 0;

      SSP1CONbits.SSPM1 = 1;

      SSP1CONbits.SSPM2 = 1;

      SSP1CONbits.SSPM3 = 0;// I2C slave mode ,7bit address

      SSP1CONbits.CKP = 1; // enable clock

      SSP1ADD =0xA0; //slave address is 0xa0

      SSP1CONbits.SSPEN=1;//enable I2c

      SSPSTAT=0;

      PIE1bits.SSP1IE = 1;//Enabe interrupt MSSP

      INTCONbits.PEIE = 1;

      INTCONbits.GIE = 1;

      }

      /*I2C salve mode interrupt */

      void i2c_salve_interrupt_tx()//master read

      {

      unsigned char Temp;

      unsigned int timercounter;

      Temp=SSP1STAT;

      Temp &= 0x2D;

      if(SSP1STATbits.R_nW ==1)//Read operation.

      {

      A_readflag=0;

      SSP1IF = 0;

      i2c_address = SSP1BUF;

      i2c_counter = word_address;

      while(i2c_counter < RX_BUF_LEN)

      {

      SSP1BUF=Register[i2c_counter];//send data

      SSP1CONbits.CKP=1;// enable colck

      timercounter=while_delay;

      while(PIR1bits.SSP1IF == 0)

      {

      timercounter--;

      if(timercounter==0)

      {

      return;

      }

      }//waiting for ~ACK

      SSP1IF = 0;

      if(SSP1CON2bits.ACKSTAT == 1)

      {

      return ; //NOACK

      }

      else

      {

      i2c_counter++;//ACK

      }

      }

      SSP1IF = 0;

      }

      }

      void i2c_salve_interrupt_rx()//master writer

      {

      unsigned char rx_status;

      unsigned char Temp;

      unsigned int timercounter;

      rx_status=false;

      Temp=SSP1STAT;

      Temp &= 0x2D;

      if(Temp==0x09)//Write operation,last byte was an address,buffer is full

      {

      SSP1IF = 0;

      i2c_address = SSP1BUF;

      timercounter=while_delay;

      while(PIR1bits.SSP1IF == 0)

      {

      timercounter--;

      if(timercounter==0)

      {

      return ;

      }

      }//waiting for send ~ACK

      SSP1IF = 0;

      word_address = SSP1BUF;

      return ;

      }

      if(Temp==0x29)//Write operation,last byte was data,buffer is full

      {

      SSP1IF=0;

      Register[word_address]=SSP1BUF;

      word_address++;

      if(word_address>=RX_BUF_LEN)

      {

      word_address=0;

      }

      }

      }
     

    (審核編輯: 智匯李)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 气雾剂灌装机_二元喷雾灌装设备-武汉洁瑞仕 | 上海前 傲信息技术有限公司-企业信息化建设及品牌推广服务商 | 聊城市城乡规划设计研究院官方网站 | 检重秤,液化气充装秤,滚筒电子秤,汽车衡厂家|上海越衡实业 | 南京仁康体检--南京仁康门诊部有限公司 | 液压油缸生产厂家-常州辰佰液压机械有限公司 | 江苏圣博莱自动化科技有限公司 | 内蒙古燕雕机械设备有限公司 | 网站建设_定制网站_高端网页设计开发_建站公司_深圳湉晨网络 | 河南电梯公司_郑州电梯公司_河南家用别墅电梯厂家-郑州嘉祥机电设备公司 | 塑料模具公司,塑料包装桶厂家,PET打包带厂家,缠绕膜厂家-新疆福吉亚工贸有限公司 | 珠海拾比佰彩图板股份有限公司| 永光机械-小型建筑机械领航者,公司专注于小型建筑、工程机械的研发与制造 | 淘金车,移动式淘金车,大小型旱地采矿车-青州冠诚重工机械有限公司 | 全自动滤水器_射水抽气器_气液两相流疏水器-连云港神美电力辅机有限公司 | 无尘车间_洁净车间_净化车间_洁净室工程一站式净化服务商-深圳市美克威尔环境科技有限公司 | 模具架,模具货架,抽屉式模具架-模具架厂家 | 衢州网站建设_网络公司_做网站_网站制作_网页设计-优骆网络 | 聊城钢管厂,无缝钢管厂家-山东旺耀金属制品有限公司 | 无线对讲系统-海能达对讲机-广州中达慧通科技有限公司 | 真空热处理-渗碳热处理-氮化热处理-[东莞德亿]专业热处理加工厂家 | 通风方式信号控制箱_人防呼叫按钮_人防设备厂家–西安鼎兴自控工程有限公司 | 江苏保捷锻压有限公司(中国汽车零部件供应商,锻造,精加工,热处理) | 上海建发物资有限公司 | 烘干机|烘干房|网带烘干机|滚筒烘干机|炒货机-河南曼瑞通机械有限公司 | 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 - 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 | 气体检测仪_气体传感器_可燃气体检测仪-精讯畅通电子科技 | 聊城钢管厂,无缝钢管厂家-山东旺耀金属制品有限公司 | 郑州四棉纺织有限公司-现代化纺织企业| 易居房产律师网|北京房产律师|房产纠纷律师|房产律师 | 桶装水配送-瓶装水-净水器-厦门水之露商贸有限公司,电话:18205922444 | 面粉加工设备-面粉加工机械-面粉机组-面粉磨粉机-面粉机成套设备-河南粮院机械制造有限公司 | 升降机_举升机_液压升降机_化工防爆升降平台_山东华雄机械有限公司 | 中国水泥协会-官方网站| 装盒机_全自动装盒机-温州凯祥包装机械有限公司 | 江苏华海诚科新材料有限公司、连云港华海诚科新材料有限公司、连云港新材料 | 喜来顺财经-专注于财经领域的综合性网站 | 智能门锁管理-公寓管理软件-智能水电表管理系统-深圳安安智能 | 英格索兰隔膜泵_ARO气动隔膜泵_英格索兰隔膜泵配件【原厂正品】连续五年无投诉_英格索兰隔膜泵代理-苏州瑞晟茂环保设备有限公司 印刷公司,北京印刷厂,宣传画册手册印刷厂-和智印彩页设计 | 天津成考网-天津成人高考网 | 液体灌装机_全自动灌装机_大桶灌装机_200L灌装机_涂料油漆灌装机-昆山灌装自动化设备有限公司 |