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

📄 i2c.c

📁 MSP430 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 + -