📄 i2c.c
字号:
//==================================//
//通用MSP430—I2C程序
//收藏:清风徐徐
//QQ:78779514
//EMAIL:XSL88888@TOM.com
//2004.2.4
//===================================//
#include "MSP430x14x.h"
//P2.0 SCL
//P2.1 SDA
#define SDA_1 P2OUT |= BIT3 //SDA = 1
#define SDA_0 P2OUT &=~ BIT3 //SDA = 0
#define SCL_1 P2OUT |= BIT2 //SCL = 1
#define SCL_0 P2OUT &=~ BIT2 //SCL = 0
#define DIR_IN P2DIR &=~ BIT3; SDA_1 //I/O口为输入
#define DIR_OUT P2DIR |= BIT3 //I/0口为输出
#define SDA_IN ((P2IN >> 3) & 0x01) //Read SDA
unsigned int a[50];
static void Delay(unsigned int n)
{
unsigned int i;
for (i=0; i }
void Init(void)
{
SCL_1;
Delay(5);
SDA_1;
Delay(5);
}
void Start(void)
{
SDA_1;
Delay(5);
SCL_1;
Delay(5);
SDA_0;
Delay(5);
SCL_0;
Delay(5);
}
void Stop(void)
{
SDA_0;
Delay(5);
SCL_1;
Delay(5);
SDA_1;
Delay(5);
}
void WriteByte(unsigned char WriteData)
{
unsigned char i;
for (i=0; i<8; i++)
{
SCL_0;
Delay(5);
if (((WriteData >> 7) & 0x01) == 0x01)
{
SDA_1;
}
else
{
SDA_0;
}
Delay(5);
SCL_1;
WriteData = WriteData << 1;
Delay(5);
}
SCL_0;
SDA_1;
Delay(5);
Delay(5);
}
unsigned char ReadByte(void)
{
unsigned char i;
unsigned char TempBit = 0;
unsigned char TempData = 0;
SCL_0;
Delay(5);
SDA_1;
for (i=0; i<8; i++)
{
Delay(5);
SCL_1;
Delay(5);
DIR_IN;
if (SDA_IN == 0x01 /*sda==1*/)
{
TempBit = 1;
}
else
{
TempBit = 0;
}
DIR_OUT;
TempData = (TempData << 1) | TempBit;
SCL_0;
}
Delay(5);
return(TempData);
}
void ReceiveAck(void)
{
unsigned char i = 0;
SCL_1;
Delay(5);
DIR_IN;
while ((SDA_IN == 0x01 /*sda==1*/) && (i < 255)/*调试方便,可以不要*/)
{
i++;
}
DIR_OUT;
SCL_0;
Delay(5);
}
void Acknowledge(void)
{
SCL_0;
Delay(5);
DIR_OUT;
SDA_0;
SCL_1;
Delay(5);
SCL_0;
}
unsigned int ReadWord(unsigned char unit/*address*/)
{
unsigned char HighData = 0;
unsigned char LowData = 0;
unsigned int TempData = 0;
Start();
WriteByte(0xa0);
ReceiveAck();
WriteByte(unit);
ReceiveAck();
Start();
WriteByte(0xa1);
ReceiveAck();
LowData = ReadByte();
Acknowledge();
HighData = ReadByte();
Stop();
TempData = (HighData << 8) + LowData;
Delay(1000);
return(TempData);
}
void ReadWords(unsigned char unit/*address*/)
{
unsigned char i;
unsigned char HighData = 0;
unsigned char LowData = 0;
unsigned int TempData = 0;
Start();
WriteByte(0xa0);
ReceiveAck();
WriteByte(unit);
ReceiveAck();
Start();
WriteByte(0xa1);
ReceiveAck();
for (i=0; i<49; i++)
{
LowData = ReadByte();
Acknowledge();
HighData = ReadByte();
Acknowledge();
a[i]= (HighData << 8) + LowData;
}
LowData = ReadByte();
Acknowledge();
HighData = ReadByte();
Stop();
a[49] = (HighData << 8) + LowData;
Delay(1000);
}
void WriteWord(unsigned char unit/*address*/, unsigned int WriteData)
{
unsigned char LowData = 0;
unsigned char HighData = 0;
LowData = (unsigned char)WriteData;
HighData = (unsigned char)(WriteData >> 8);
Start();
WriteByte(0xa0);
ReceiveAck();
WriteByte(unit);
ReceiveAck();
WriteByte(LowData);
ReceiveAck();
WriteByte(HighData);
ReceiveAck();
Stop();
Delay(2000);
}
void Read24C64(unsigned int ADDR,unsigned char *s,unsigned char no)
{
// uchar ddata=0;
unsigned char ADDR_L,ADDR_H,i;
ADDR_L=ADDR%256;
ADDR_H=ADDR/256;
IIC_START ();
IIC_TX_DATA (0xA0);
delay(50);
IIC_TX_DATA (ADDR_H);
delay(50);
IIC_TX_DATA (ADDR_L);
delay(50);
IIC_START ();
IIC_TX_DATA (0xA1);
delay(50);
for(i=0;i<no;i++)
{
s[i]= IIC_RX_DATA();
if(i!=no-1)
{
IIC_ACK ();
}
}
delay(50);
IIC_STOP ();
}
void Write24C64(unsigned int ADDR,unsigned char *ddata,unsigned char no)
{
unsigned char ADDR_H,ADDR_L,i;
ADDR_L=ADDR%256;
ADDR_H=ADDR/256;
SDA_OUT;
IIC_START ();
IIC_TX_DATA (0xA0); // E2PROM 片选
IIC_TX_DATA (ADDR_H); // 大于256BIT的EEPROM需加地址高位
IIC_TX_DATA (ADDR_L);
for(i=0;i<no;i++)
{
IIC_TX_DATA(ddata[i]);
delay(50);
}
IIC_STOP ();
delay (0x3FFF); // 等待写时序
}
main()
{
unsigned char temp[32];
unsigned char temp1[32]={9,5,3,4,5,6,7,8,23,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29,30,11,33};
Write24C64(0x0030,temp1,8);
delay(0x5000);
Read24C64(0x0030,temp,8);
delay(1000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -