关于IIC的逻辑和底层协议可以看之前总结的
#IIC 通信协议
1、读写数据
1.1、写数据
发送N个字节程序的流程:
1、发送起始信号
2、发送从机地址和写
3、等待从机发回应答信号
4、发送第一字节数据 等待应答
5、发送下一字节数据 等带应答或非应答信号
6、发送停止信号停止发送
1.2、读数据
读取N个字节程序的流程:
1、发送起始信号
2、发送从机地址和读
3、等待从机发回应答信号
4、读取到第一字节数据 发送应答信号给从机
5、读取下一字节数据 发送应答信号/非应答信号
6、发送停止信号停止读取
1.3起始信号
SCL 为高电平 SDA 产生下降沿
1.4停止信号
SCL 为高电平 SDA 产生上升沿
1.5有效数据
SCL为低电平时 SDA数据无效可进行数据交换。
1.6 应答信号和非应答信号
SCL的第九个时钟时SDA为高电平那个表示非应答信号,SDA为高低平那个表示应答信号
2 程序
void MPU_IIC_Start(void)
{
MPU_SDA_OUT(); //sda线输出
MPU_IIC_SDA=1;
MPU_IIC_SCL=1;
delay_us(4);
MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
产生起始信号流程:
1、配置SDA为输出信号
2、SDA设置为高电平
3、SCL设置为低电平
4、延时4us 等待两条线电平稳定
5、SDA设置低电平 此时在SCL为高时SDA产生一个下降沿。
6、拉低SCL 钳住I2C 总线,因为SCL为低电平SDA上数据无效。
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void MPU_IIC_Send_Byte(u8 txd)
{
u8 t;
MPU_SDA_OUT();
MPU_IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
MPU_IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
MPU_IIC_SCL=1;
delay_us(2);
MPU_IIC_SCL=0;
delay_us(2);
}
}
写一个字节流程:
1、设置SDA为输出模式
2、将时钟线拉低
3、for循环8位数据
4、在其中一次循环中,首先取第七位然后右移7位,数据左移1位(第六位变为第七位),延时2us,保证数据正确,SCL产生2us高电平,然后拉低SCL延时2us,等待下次循环传输第六位使用。