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

📄 2812i2c.c

📁 该程序完成了DSP2812对EEPROM的读和写操作
💻 C
字号:
// 启动EEPROM
void I2c_Start(void)
{
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK  
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
  Delay(1);
}

// 停止EEPROM
void I2c_Stop(void)
{
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
}

// 应答标志
void I2c_Ack(void)
{
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
  Delay(1);
}

// 无应答标志
void I2c_Nack(void)
{
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
  Delay(1);
}

void I2c_Send_Byte(uint Data)
{
  uint i=8;
  while(i--)
  {
    Delay(1);
	if(Data&0x80)
	{
	  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
	}
	else
	{
	  GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; // SDA
	}
	Delay(1);
    GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK
	Delay(1);
	GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
	Data=Data<<1;
  }
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
  Delay(1);
  I2c_Gpio_In();
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK
  Delay(1);
  if(GpioDataRegs.GPBDAT.bit.GPIOB0 == 0)
  {
    Delay(10);
  }
  else
  {
    Delay(10);
  }
  I2c_Gpio_Out();
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
  Delay(1);
}

uint I2c_Receive_Byte(void)
{
  uint i=8,Data=0;
  Delay(1);
  GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; // SDA
  Delay(1);
  I2c_Gpio_In();
  while(i--)
  {
    Data=Data<<1;
	Delay(1);
    GpioDataRegs.GPBDAT.bit.GPIOB2 = 1; // SCK	
	Delay(1);
	if(GpioDataRegs.GPBDAT.bit.GPIOB0)
	{
	  Data++;
	}
    Delay(1);    
    GpioDataRegs.GPBDAT.bit.GPIOB2 = 0; // SCK
	Delay(1);
  }
  Delay(1);
  I2c_Gpio_Out();
  return Data;
}

void AT24C128_Write(uint Data,uint AT24C128_Address)
{
  I2c_Gpio_Out();
  I2c_Start();
  I2c_Send_Byte(0xA0);
  I2c_Send_Byte(AT24C128_Address/256);
  I2c_Send_Byte(AT24C128_Address%256);
  I2c_Send_Byte(Data);
  I2c_Stop();
  Delay(10);
}

void AT24C128_Read(uint AT24C128_Address)
{ 
  I2c_Gpio_Out();
  I2c_Start();
  I2c_Send_Byte(0xA0);
  I2c_Send_Byte(AT24C128_Address/256);
  I2c_Send_Byte(AT24C128_Address%256);
  I2c_Start();
  I2c_Send_Byte(0xA1);
  AT24C128_Data=I2c_Receive_Byte();
  I2c_Nack();
  I2c_Stop();
  Delay(10);
}

// I2C SDA input
void I2c_Gpio_In(void)
{
    EALLOW;
  	GpioMuxRegs.GPBMUX.all = 0x0000; // 设置为GPIO功能
  	GpioMuxRegs.GPBDIR.all = 0xFFFE; // 输入设置为0输出设置为1
  	EDIS;
}

// I2C SDA output
void I2c_Gpio_Out(void)
{
    EALLOW;
  	GpioMuxRegs.GPBMUX.all = 0x0000; // 设置为GPIO功能
  	GpioMuxRegs.GPBDIR.all = 0xFFFF; // 输入设置为0输出设置为1
  	EDIS;
}

⌨️ 快捷键说明

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