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

📄 scm2012_iic.txt

📁 单片机24系列实现主发主收
💻 TXT
字号:
/*************************************Copyright (c)*****************************
**                              
**
*******************************************************************************/

/*******************************************************************************
**-------------------------单片机2012 IIC通信-----------------------------------
** 文件名:		main.c
** 最后修改时间:        2008-11-27
** 最后修改版本:	1.0
** 版本改进:   
**------------------------------------------------------------------------------
** 创建者:	
** 建立时间:	2007-11-26
** 版本:	1.0
** 描述:	单片机2012在从模式给单片机2481和DSP发送时间信息。
*******************************************************************************/

/*******************************************************************************
** 功能   :单片机2012工作在从模式发送时间信息
** 说明   :波特率100kbps,简单的累加校验
** 全局变量:。。。。。。。。。
**		
** 中断:。。。。。。。。。。。
*******************************************************************************/

/*相关包含文件*/
#include  <msp430x20x2.h>

/*全局变量*/
char IIC_data_Tx[5] = {0x33,0x22,0x11,0x44,0x00};    //发送数组
char IIC_SLV_Addr = 0x90;  // Address is 0x48<<1 for R/W
int I2C_State = 0;  //IIC状态
int IIC_Tx_Num=0;       //发送计数

/*
********************************************************************************
** 函数名称 :main()
** 作者:    
** 修改时间 :2008-11-26
** 函数功能 :从发送模式寄存器设置
** 入口参数 :无 
** 出口参数 :无	
** 版本改进:  无  
** 数组、变量、中断情况:开USI_TXRX ()中断
**				
********************************************************************************
*/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog
  
  P1OUT = 0xC0;                        // P1.6 & P1.7 Pullups
  P1REN |= 0xC0;                       // P1.6 & P1.7 Pullups
  P1DIR = 0xFF;                        // Unused pins as outputs
  P2OUT = 0;
  P2DIR = 0xFF;

  USICTL0 = USIPE6+USIPE7+USISWRST;    // Port & USI mode setup
  USICTL1 = USII2C+USIIE+USISTTIE;     // Enable I2C mode & USI interrupts
  USICKCTL = USICKPL;                  // Setup clock polarity
  USICNT |= USIIFGCC;                  // Disable automatic clear control
  USICTL0 &= ~USISWRST;                // Enable USI
  USICTL1 &= ~USIIFG;                  // Clear pending flag
  
  IIC_data_Tx[4] = ( IIC_data_Tx[0] + IIC_data_Tx[1] + IIC_data_Tx[2] + IIC_data_Tx[3] ) & ( 0xFF ); 
   _EINT();

  while( 1 );
  
}
/*
********************************************************************************
** 函数名称 :USI_TXRX ()
** 作者:    
** 修改时间 :2008-11-26
** 函数功能 :从发送时间信息给DSP和单片机2012
** 入口参数 :无 
** 出口参数 :无	
** 版本改进:  无  
** 数组、变量、中断情况:无
**				
********************************************************************************
*/
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
  if ( USICTL1 & USISTTIFG )             // Start entry?  
    I2C_State = 2;                     // Enter 1st state on start 

  switch( __even_in_range( I2C_State , 12 ) )
    {
      case 0: //Idle, should not get here
              break;

      case 2: //RX Address
              USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, RX Address(将USICNT寄存器中的用于计发送bits的低五位先清零后置数)
              USICTL1 &= ~USISTTIFG;   // Clear start flag
              I2C_State = 4;           // Go to next state: check address
              break;

      case 4: // Process Address and send (N)Ack
              if (USISRL & 0x01)       // If read...
                IIC_SLV_Addr++;            // Save R/W bit
              USICTL0 |= USIOE;        // SDA = output
              if (USISRL == IIC_SLV_Addr)  // Address match?
              {
                USISRL = 0x00;         // Send Ack               
                I2C_State = 8;         // Go to next state: TX data
              }
              else
              {
                USISRL = 0xFF;         // Send NAck               
                I2C_State = 6;         // Go to next state: prep for next Start
              }
              USICNT |= 0x01;          // Bit counter = 1, send (N)Ack bit
              break;

      case 6: // Prep for Start condition
              USICTL0 &= ~USIOE;       // SDA = input
              IIC_SLV_Addr = 0x90;         // Reset slave address
              I2C_State = 0;           // Reset state machine
              break;

      case 8: // Send Data byte
              USICTL0 |= USIOE;        // SDA = output
              USISRL = IIC_data_Tx[IIC_Tx_Num++];
              if( IIC_Tx_Num == 5 )
                 IIC_Tx_Num = 0;             
              USICNT |=  0x08;         // Bit counter = 8, TX data
              I2C_State = 10;          // Go to next state: receive (N)Ack
              break;

      case 10:// Receive Data (N)Ack
              USICTL0 &= ~USIOE;       // SDA = input
              USICNT |= 0x01;          // Bit counter = 1, receive (N)Ack
              I2C_State = 12;          // Go to next state: check (N)Ack
              break;

      case 12:// Process Data Ack/NAck
              USICTL0 &= ~USIOE;       // SDA = input
              IIC_SLV_Addr = 0x90;         // Reset slave address
              I2C_State = 0;           // Reset state machine
              break;
    }

  USICTL1 &= ~USIIFG;                  // Clear pending flags
}

⌨️ 快捷键说明

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