📄 scm2012_iic.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 + -