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

📄 msp430149_i2c.c

📁 TI的16位单片机的IIC驱动程序
💻 C
字号:
//******************************************************************************
//  MSP-FET430P440 Demo - USART0 UART 2400 Ultra-low Power Echo ISR, 32kHz ACLK
//
//  Description; Echo a received character, RX ISR used. In the Mainloop UART0
//  is made ready to receive one character with interrupt active. The Mainloop
//  waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after 
//  receiving one character which echo's back the received character.
//  ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO = 32xACLK = 1.048576Mhz  
//  Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh)
//  //*An external watch crystal is required on XIN XOUT for ACLK*//	  
//              
//                MSP430F449
//             -----------------
//         /|\|              XIN|-  
//          | |                 | 32kHz  
//          --|RST          XOUT|-
//            |                 |
//            |             P2.4|-----------> 
//            |                 | 2400 - 8N1
//            |             P2.5|<-----------
//
//       
//  M.Buccini
//  Texas Instruments, Inc
//  October 2003
//  Built with IAR Embedded Workbench Version: 1.26B
//  December 2003
//  Updated for IAR Embedded Workbench Version: 2.21B
//******************************************************************************

#include <msp430x43x.h>

#define iic_io_init P4DIR |= 0XC0   //定义I/O口接线
#define iic_set_sda P4OUT |= BIT7 
#define iic_clr_sda P4OUT &= ~BIT7
#define iic_set_scl P4OUT |= BIT6
#define iic_clr_scl P4OUT &= ~BIT6
#define iic_io_data P4IN & 0x80    //判断接受的数据是1还是0

unsigned char ack_flag;

//延时函数

void iic_delay(void)
{
   int i;
   for(i=0;i<5;i++);
}

//启动I2C

void start_iic(void)
{
   iic_io_init;
   iic_set_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
   iic_clr_scl;
   iic_delay();
}      

// 停止IIC

void stop_iic(void)
{
   iic_clr_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_set_sda;
   iic_delay();
   iic_clr_sda;
   iic_delay();
   iic_clr_scl;
}

//发送0

void send_zero(void)
{
   iic_clr_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
}

//发送1

void send_one(void)
{
   //iic_set_sda;
   //iic_delay();
   //iic_set_scl;
   //iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_set_sda;
   iic_delay();
   iic_set_scl;
   //iic_clr_sda;
   iic_delay();
}

//发送1字节数据

void send_char(unsigned char sendtmp)     //发送1字节程序,sendtemp是要发送的值
{
   unsigned char cnt,tmp=0x80;
   for(cnt=0; cnt<8; cnt++)
   {
      if((sendtmp & tmp)> 0)
      {
         send_one();
      }else
      {
         send_zero();
      }
      tmp /= 2;
   }
   iic_clr_scl;
   iic_set_sda;
   iic_delay();
   iic_delay();
}

//读1字节数据

unsigned char read_char(void)    
{
   unsigned char cnt,tmp=0x80,readtmp;
   readtmp = 0x00;
   for (cnt=0; cnt<8; cnt++)
   {
      iic_set_sda;
      iic_delay();
      iic_set_scl;
      iic_delay();
      if((iic_io_data) > 0x00)
      {        
         readtmp |= tmp;
      }
      iic_clr_scl;
      iic_delay();
      tmp = tmp/2;
   }
   
   return readtmp;    //返回读出来的值
}

//应答信号

void iic_ack(void)
{
   ack_flag = 0x00;
   //iic_set_sda;
   iic_clr_scl;
   iic_delay();
   iic_set_scl;
   P4DIR &= ~BIT7;
   iic_delay();
   if((iic_io_data) == 0x80 )
   {
      ack_flag = 0x01;
   }
   P4DIR |= BIT7;
   iic_clr_scl;
   iic_delay();
}

//iic_nack

void iic_nack(void)
{
   iic_set_sda;
   iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
}

//写一个数据到EEPROM中               
         
void write_eeprom(unsigned char ctrl_addres,unsigned char addres,unsigned char value) 
                                                                                    //ctrl_addres是控制字段
                                                                                    //addres 是地址
                                                                                    //value 是值
{
   unsigned char step_flag = 0x00;
   while(step_flag < 0x03)
   {
      if(step_flag == 0x00)
      {
         start_iic();
         send_char(ctrl_addres);
         iic_ack();
         if(ack_flag == 0) step_flag += 1;
      }else if (step_flag == 1)
      {
         send_char(addres);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {  
            step_flag = 0;
         }
      }else
      {
         send_char(value);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {
            step_flag = 0;
         }
      }
   }
   stop_iic();
}                     
            
//从EEPROM中读数据

unsigned char read_eeprom(unsigned char ctrl_addres,unsigned char addres)            
                                                                   //ctrl_addres 是控制字段
                                                                   //addres是地址
{
   unsigned char step_flag=0,value;
   while (step_flag <0x03)
   {
      if(step_flag == 0x00)
      {
         start_iic();
         send_char(ctrl_addres);
         iic_ack();
         if(ack_flag == 0) step_flag += 1;
      }
      else if (step_flag == 1)
      {
         send_char(addres);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {
            step_flag = 0;
         }
      }
      else
      {
         start_iic();
         send_char(ctrl_addres+1);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
            value = read_char();
            iic_nack();
         }
         else
         {
            step_flag = 0;
         }
      }
   }
   stop_iic();
   return value;
}                     
              
            
      
      
      
         
void main( void )
{  
   unsigned char iic_value;
   WDTCTL=WDTPW + WDTHOLD;
   write_eeprom(0xA0,0x02,0x20);
   iic_value = read_eeprom(0xa0,0x02);
   iic_value = iic_value;
   while(1);
}

⌨️ 快捷键说明

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