结合I2C总线协议的知识,我们可以知道I2C写数据由一下10个步骤组成。
第一步,发送一个起始信号。
第二步,发送7bit从机地址,即OZ9350的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送寄存器地址,8bit数据。
第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,发送一个数据,8bit数据。
第七步,产生一个ACK应答信号,此应答信号为从机器件产生的应答信号。
第八步,发送一个CRC校验码,此CRC校验值为2、4、6步数据产生的校验码。
第九步,既可以发送一个应答信号,也可以发送一个无应答信号,均有从机器件产生。
第十步,发送一个停止信号。
接下来,按照以上十个步骤,可以写出i2c写数据的函数。
起始信号Star,SCL = 1;时钟总线为高电平,数据总线由高电平边为低电平时候SDA = 1 到SDA = 0;
void I2C_Star(void)
{
I2C_SCL = 1;
I2C_SDA = 1;
I2C_DELAY();
I2C_SDA = 0;
I2C_DELAY();
I2C_SCL = 0;
I2C_DELAY();
}
停止信号Stop,SCL = 1;时钟总线为高电平,数据总线由低电平变成高电平,SDA = 0 到SDA = 1;
void I2C_Stop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
I2C_DELAY();
I2C_SDA = 1;
I2C_DELAY();
}
发送一个8位的字节
u8 I2C_SendByte(uint8_t Byte)
{
uint8_t i;
for(int i; i < 8;i++)
{
if(Byte & 0x80)
{
I2C_SDA = 1;
}else{
I2C_SDA = 0;
}
I2C_DELAY();
I2C_SCL = 1;
I2C_DELAY();
I2C_SCL = 0;
I2C_DELAY();
if(i == 7)
{
I2C_SDA = 1;
}
Byte <<= 1;
I2C_DELAY();
}
}
从总线上读取一个字节 8位
u8 I2C_ReadByte(void)
{
uint8_t i;
uint8_t value
value = 0;
for(i = 0; i < 8;i++)
{
value <<= 1;
I2C_SCL = 1;
I2C_DELAY();
if(I2C_SDA_READ())
{
value++;
}
I2C_SCL = 0;
I2C_DELAY();
}
return value;
}
产生一个ACK应答信号
void I2C_ACK(void)
{
I2C_SDA = 0;
I2C_DELAY();
I2C_SCL = 1;
I2C_DELAY();
I2C_SCL = 0;
I2C_SDA = 1;
}
产生一个非应答信号
void I2C_NACK(void)
{
I2C_SDA = 1;
I2C_DELAY();
I2C_SCL = 1;
I2C_DELAY();
I2C_SCL = 0;
I2C_DELAY();
}