📄 2812i2c.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 + -