⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430f169的i2c程序(仅供参考).c

📁 MSP430F169的i2c程序
💻 C
📖 第 1 页 / 共 2 页
字号:

        //  I2CTCTL |= I2CSTP;    //I2CRM =1模式中,在发送最后一个数据之前将停止位置位,*特别注意,必须
          I2cBusSendByte(*ps);
          while((I2CIFG  & 0x02) == NACKIFG)   // 等待数据的应答
              {
              I2CTCTL |= I2CSTP;  // 无应答,结束总线
              return(0);  
              }
          return(1);
      }

      //------------------写at24c512----
      void I2cWrAt24c512(void)
      {
          unsigned int j=0;
          unsigned char m,n;
          unsigned int tempAddr;
        
          for (j = 0;j <462;j++)            // page write
              { 
              tempAddr = 128*j;      
              while (I2CBUSY & I2CDCTL);            // I2C ready?
              I2cSendSubAddr(tempAddr,0x80);
              I2cSendStr(FPGACfg+tempAddr,0x80);    
              P4OUT ^= 0x80;    
              for (m=0;m<125;m++) {for (n=0;n<110;n++);}
              P4OUT ^= 0x80;        
              } 
          
          tempAddr = 128*j;
          while (I2CBUSY & I2CDCTL);            // I2C ready?
          I2cSendSubAddr(tempAddr,0x4f);
          I2cSendStr(FPGACfg+tempAddr,0x4f);    
          P4OUT ^= 0x80;    
          for (m=0;m<125;m++) {for (n=0;n<110;n++);}
          P4OUT ^= 0x80; 
      }
      /*-------------------------- MSP430 I2C 
读取数据-----------------------------*/
      /*---------------------------------------------------------------------
      --子程标号      :I2cSlaSubAddr                                          
      --子程功能      :主器件发送从机器件地址和子地址                         
      --入口参数      :unsigned int suba                    
      --参数说明      :子地址                                         
      --子程调用      :I2cBusSendByte                                       
      --子程序状况    :Y                                                      
      --说明          :完成地址信息的定位,先确定顺序读写的起始地址                                   
      ---------------------------------------------------------------------
      --*/
      void I2cReceSubAddr(unsigned int suba)    // test 09-25 读之前先写地址
      {
          unsigned char Hi_suba,Lo_suba;
          P3OUT = 0x00;                 // clear P3 output register   
          P3SEL = 0x0A;                 // P3.1=SDA, P3.3=SCL,Select I2C pins,  Setup I2C module     
       
          U0CTL |= I2C + SYNC;           // select I2C mode;XA=0,7bit_addresing;
          U0CTL &= ~I2CEN;              // i2c功能使能无效 

          I2CTCTL =  I2CSSEL_2;        // I2CRM = 0,
          I2CNDAT = 2;                 // I2CRM = 0,2byte地址 + 128byte数据,固定字节
          I2CIFG = 0;
          I2CPSC = 1;                  // set scl
          I2CSA = 0xa0;                // Slave address of At24c512   
          U0CTL |= I2CEN;              // enable I2C module, 7 bit addr,  master  mode   08-26 
     
          U0CTL |= MST;

          Hi_suba = ( unsigned char )( suba >> 8 );
          Lo_suba = ( unsigned char )( suba & 0x00ff );
          
          while (I2CBUSY & I2CDCTL);    // I2C ready? 在空闲状态:0,空闲;1:忙
          I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ;  // I2CRM =0,启动总线,发送从器件地址
          while((I2CIFG & NACKIFG) == 0x02)   // ack 为低电平,等待地址应答位 ,判断 无应答NACKIFG = 1    
     
              { 
               I2CTCTL |= I2CSTP;    // 结束总线 
              }             
         
          I2cBusSendByte( Hi_suba );          //发送器件子地址  
          while((I2CIFG & NACKIFG) == 0x02)   // ack 为低电平,等待地址应答位 ,判断 无应答NACKIFG = 1  
     
              { 
               I2CTCTL |= I2CSTP;    // 结束总线
              }  
          I2cBusSendByte( Lo_suba );        //发送器件子地址
          while((I2CIFG & NACKIFG) == 0x02)   // ack 为低电平,等待地址应答位 ,判断 无应答NACKIFG = 1  
     
              { 
               I2CTCTL |= I2CSTP;    // 结束总线 
              }  
          DelayTime10us(250);
          DelayTime10us(250);
          DelayTime10us(250);
          DelayTime10us(250);
      }

      /*---------------------------------------------------------------------
      --子程标号      :I2cSlaSubAddr                                          
      --子程功能      :主器件接收初始化                       
      --入口参数      :无                                                             
                                                                    
      ---------------------------------------------------------------------
      --*/
      void InitI2cRece(unsigned char num)
      {
          P3OUT = 0x00;                 // clear P3 output register   
          P3SEL = 0x0A;                 // P3.1=SDA, P3.3=SCL,Select I2C pins,  Setup I2C module    
      
          U0CTL |= I2C + SYNC;           // select I2C mode;XA=0,7bit_addresing;
          U0CTL &= ~I2CEN;              // i2c功能使能无效 
         // I2CTCTL = I2CRM + I2CSSEL_2;  // I2CRM=1 x(x>256)字节模式 

          I2CTCTL =  I2CSSEL_2;           // I2CRM=0
          I2CNDAT = num;                   // 1个字节
          I2CPSC = 1;                    // set scl
          I2CIFG = 0;
          I2CSA = 0xa1;                 // Slave address of At24c512  
          I2CTCTL &= ~I2CTRX; 
          U0CTL |= I2CEN;               // enable I2C module, 7 bit addr,   master mode   08-26 
      
      }

      /*---------------------------------------------------------------
      --功能描述    : 读一个字节
      --子程序状况  :
      ------------------------------------------------------------------
      --*/
      unsigned char I2cReceSlaByte(void)
      {
          unsigned char ch;
          DelayTime10us(15);
          U0CTL |=  MST;                //主模式    
          while (I2CBUSY & I2CDCTL);    // I2C ready? 在空闲状态:0,空闲;1:忙
          I2CTCTL |= I2CSTT + I2CSTP;              // I2CRM =0; Receive, ST, SP (clears MST)
          while((I2CIFG & RXRDYIFG) != RXRDYIFG);  // 等待地址应答位 ,判断    
          ch = I2CDRB;  
          return(ch);   
      }

      /*---------------------------------------------------------------
      --功能描述    : 连续读数据
      --子程序状况  :
      ------------------------------------------------------------------
      --*/
      void I2cReceSlaStr(unsigned char num)
      {
          unsigned char i;
          DelayTime10us(15);
          U0CTL |=  MST;                //主模式    
          while (I2CBUSY & I2CDCTL);    // I2C ready? 在空闲状态:0,空闲;1:忙
          I2CTCTL |= I2CSTT + I2CSTP;   // I2CRM =0; Receive, ST, SP (clears MST)
          for (i=0;i<num;i++)
              {
              while((I2CIFG & RXRDYIFG) != RXRDYIFG);  // 等待地址应答位 ,判断    
              rxDataArray = I2CDRB;  
              }  
      }
void main()
{

   WDTCTL=WDTPW+WDTHOLD;
    I2cSendSubAddr(0x0000,0xa0);
    I2cSendStr(temp,0x80);
    DelayTime10us(250);
    I2cReceSubAddr(0x0000);
    InitI2cRece(1);
    I2cReceSlaByte();
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -