<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MSP430非模擬IIC總線控制程序

          MSP430非模擬IIC總線控制程序

          作者: 時間:2016-12-02 來源:網(wǎng)絡 收藏

          IIC.C

          #include
          #include "IIC.h"

          #define SLAVEADDR 0x50;

          int tx_count;
          int rx_count;
          unsigned char I2CBuffer[3];
          void Init_IIC(void)
          {
          //將P3.1和P3.3設置為I2C管腳
          P3SEL = 0x0A;
          //設置P3.1和P3.3管腳的方向
          P3DIR&= ~0x0A;
          //選擇為I2C模式
          U0CTL |= I2C + SYNC;
          //禁止I2C模塊
          U0CTL &= ~I2CEN;
          //設置I2C為7位地址模式,不使用DMA,
          //字節(jié)模式,時鐘源為SMCLK,
          //設置成傳輸模式
          I2CTCTL = I2CTRX + I2CSSEL_2;
          //定義從器件地址
          I2CSA = SLAVEADDR;
          //設置本身的地址
          I2COA = 0x01A5;
          //I2C時鐘為SMCLK / 160
          I2CPSC = 159;
          //SCL 高電平為:5 *I2C 時鐘
          I2CSCLH = 0x03;
          //SCL 低電平為:5 *I2C 時鐘
          I2CSCLL = 0x03;
          //I2C 模塊有效
          U0CTL |= I2CEN;
          tx_count = 0;
          rx_count = 0;
          }

          void I2CWriteInit(void) //對于AT24CXXX的寫操作是置成主模式并置位中斷使能.
          {
          //主(Master)模式
          U0CTL |= MST;
          //傳輸模式,R/W 為:0
          I2CTCTL |= I2CTRX;
          //清除中斷標志
          I2CIFG &= ~TXRDYIFG;
          //發(fā)送中斷使能
          I2CIE = TXRDYIE;
          }

          void I2CReadInit(void)
          {
          //接收模式,R/W 為:1
          I2CTCTL &= ~I2CTRX;
          //接收中斷使能
          I2CIE = RXRDYIE;
          }

          void EEPROM_ByteWrite(unsigned char nAddr, unsigned char nVal)
          {
          //等待I2C模塊完成所有操作 //在選定的地址寫入數(shù)據(jù).
          while (I2CDCTL&I2CBUSY) ;
          //設置地址數(shù)據(jù)
          I2CBuffer[1] = nAddr;
          //設置數(shù)據(jù)
          I2CBuffer[0] = nVal;
          //設置緩沖區(qū)指針
          tx_count = 1;
          //寫數(shù)據(jù)初始化
          I2CWriteInit(); //設置為主模式
          //發(fā)送數(shù)據(jù)的長度
          //1個控制字節(jié),2個數(shù)據(jù)字節(jié)
          I2CNDAT = 2;
          //開始和停止條件產(chǎn)生
          //開始I2C通信
          I2CTCTL |= I2CSTT+I2CSTP;
          return;
          }

          unsigned char EEPROM_CurrentAddressRead(void)
          {
          //等待I2C模塊完成所有操作
          while (I2CDCTL&I2CBUSY);
          //讀操作的初始化
          I2CReadInit();
          //主(Master)模式
          U0CTL |= MST;
          //接收1個字節(jié)的數(shù)據(jù)
          I2CNDAT = 1;
          //清除中斷標志
          I2CIFG &= ~ARDYIFG;
          //開始接收,產(chǎn)生重新起始和停止條件
          I2CTCTL |= I2CSTT + I2CSTP;
          //等待傳輸完成
          while ((~I2CIFG)&ARDYIFG) ;
          //返回數(shù)據(jù)
          return I2CBuffer[0];
          }

          unsigned char EEPROM_RandomRead(unsigned char nAddr)
          {
          //等待I2C模塊完成所有操作
          while (I2CDCTL&I2CBUSY);
          //設置地址
          I2CBuffer[0] = nAddr;
          //設置緩沖區(qū)指針
          tx_count = 0;
          //寫操作初始化
          I2CWriteInit();
          //傳輸數(shù)據(jù)長度
          //1個控制字節(jié)和一個地址數(shù)據(jù)
          I2CNDAT = 1;
          //清除中斷標志
          I2CIFG &= ~ARDYIFG;
          //起始條件產(chǎn)生
          I2CTCTL |= I2CSTT;
          //等待傳輸完成
          while ((~I2CIFG)&ARDYIFG);
          //讀操作初始化
          I2CReadInit();
          //接收一個字節(jié)的數(shù)據(jù)
          I2CNDAT = 1;
          //清除中斷標志
          I2CIFG &= ~ARDYIFG;
          //開始接收,產(chǎn)生重新起始和停止條件
          I2CTCTL |= I2CSTT + I2CSTP;
          //等待傳輸完成
          while ((~I2CIFG)&ARDYIFG);
          //返回數(shù)據(jù)
          return I2CBuffer[0];
          }

          void EEPROM_AckPolling(void)
          {
          unsigned int count;
          //等待I2C模塊完成所有操作
          while (I2CDCTL&I2CBUSY);

          count=0;
          //清除I2CEN位
          U0CTL &= ~I2CEN;
          I2CTCTL |= I2CRM;
          //使能I2C模塊
          U0CTL |= I2CEN;
          //設置NACKIFG標志
          I2CIFG = NACKIFG;
          while (NACKIFG & I2CIFG)
          {
          //清除中斷標志
          I2CIFG=0x00;
          //主(Master)模式
          U0CTL |= MST;
          //設置傳輸模式
          I2CTCTL |= I2CTRX;
          //產(chǎn)生起始條件
          I2CTCTL |= I2CSTT;

          //等待I2CSTT被清除
          while (I2CTCTL & I2CSTT) ;
          //產(chǎn)生停止條件
          I2CTCTL |= I2CSTP;
          //等待停止條件復位
          while (I2CDCTL & I2CBUSY) ;
          count = count + 1;
          }

          //清除I2CEN位
          U0CTL &= ~I2CEN;
          I2CTCTL &= ~I2CRM;
          //使能I2C
          U0CTL |= I2CEN;

          return;
          }


          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();