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