I2C总线的标准收发代码

结合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();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值