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

📄 i2c.c

📁 MSP430单片机I2C通用c程序,利用输入及输出模式切换实现0和1的状态,完全符合I2C标准
💻 C
字号:
#include "msp430x22x4.h"


#define I2C_SDA(operation) operation(3,1)
#define I2C_SCL(operation) operation(3,2)
#define PORT_SET(port,bit) P##port##OUT|=(1<<bit)
#define PORT_CLR(port,bit) P##port##OUT&=~(1<<bit)
#define SET_GPIO_MODE(port,bit) P##port##SEL&=~(1<<bit)
#define SET_OUTPUT_MODE(port,bit) P##port##DIR|=(1<<bit)
#define SET_INPUT_MODE(port,bit) P##port##DIR&=~(1<<bit)
#define DISABLE_PULL_RESISTOR(port,bit) P##port##REN&=~(1<<bit)
#define READ_PORT(port,bit) P##port##IN&(1<<bit)

void I2C_init()
{
  I2C_SDA(SET_GPIO_MODE);I2C_SCL(SET_GPIO_MODE);
  I2C_SDA(DISABLE_PULL_RESISTOR);I2C_SCL(DISABLE_PULL_RESISTOR);
  I2C_SDA(SET_INPUT_MODE);I2C_SCL(SET_INPUT_MODE);
  I2C_SDA(PORT_CLR);I2C_SCL(PORT_CLR);
}

void Start(void)
{

  I2C_SCL(SET_INPUT_MODE);        //SCL=1
  _NOP();
  I2C_SDA(SET_INPUT_MODE);        //SDA=1
  _NOP();
  I2C_SDA(SET_OUTPUT_MODE);       //SDA=0

}

void Stop(void)
{
  I2C_SCL(SET_OUTPUT_MODE);       //SCL=0
  _NOP();
  I2C_SDA(SET_OUTPUT_MODE);        //SDA=0
  _NOP();
  I2C_SCL(SET_INPUT_MODE);        //SCL=1
  _NOP();
  I2C_SDA(SET_INPUT_MODE);       //SDA=1
}


void Transfer(unsigned char data)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    I2C_SCL(SET_OUTPUT_MODE);               //SCL=0
    if(data&0x80)I2C_SDA(SET_INPUT_MODE);   //SDA=1
    else I2C_SDA(SET_OUTPUT_MODE);          //SDA=0
    data=data<<1;
    I2C_SCL(SET_INPUT_MODE);                //SCL=1
  }
}

unsigned char Acknowledge(void)
{
  I2C_SCL(SET_OUTPUT_MODE);                //SCL=0
  _NOP();
  I2C_SDA(SET_INPUT_MODE);                 //release SDA
  _NOP();
  I2C_SCL(SET_INPUT_MODE);                //SCL=1
  if(I2C_SDA(READ_PORT)) return 0xff;
  else return 0;
}


unsigned char I2C_Write_Byte(unsigned char device_address, unsigned char data)
{
  Start();
  Transfer(device_address&0xfe);
  if(Acknowledge()!=0)return 0x00;
  Transfer(data);
  if(Acknowledge()!=0)return 0x00;
  Stop();
  return 0xff;
}

unsigned char I2C_Write_Word(unsigned char device_address, unsigned int data)
{
  unsigned char LowByte, HighByte;
  LowByte=(unsigned char)data;
  HighByte=(unsigned char)(data >> 8);
  Start();
  Transfer(device_address&0xfe);
  if(Acknowledge()!=0)return 0x00;
  Transfer(HighByte);
  if(Acknowledge()!=0)return 0x00;
  Transfer(LowByte);
  if(Acknowledge()!=0)return 0x00;
  Stop();
  return 0xff;
}

⌨️ 快捷键说明

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