最近做的一个项目,是依据IIC总线通讯的传感器体系。由于别的一个传感器运用的是类IIC协议,而不是规范IIC,所以MCU不能与其通讯,最终没有办法,只要经过I/O口模仿的方法完结IIC的总线通讯。详细的程序在我博客里在从前的早些时分现已贴出来了,如果有爱好的能够查看我的博客。
首要完结一下我在这个过程中遇见的问题
1、在写完数据(指令或许地址)后 没有应对信号
一般开端的时序依据手册里边的时序图很简单能够写出,第一个没有应对,就有或许向从器材写完数据今后。一般这个时分首要查看的是,上升沿和下降沿,看手册里边说的是上升沿读写仍是下降沿读写。我的项目中是上升沿读写数据,换一句话说,在上升沿的时分读写SDA线上的电平指示;下降沿的时分改动数据,其中有一点需求留意,便是先拉低SCL线发生下降沿,在程序中拉低之后要有必定的延时,由于I/O口安稳电平需求必定的时间。否则的话在SDA高的状况下,误拉低了SCL就会发生一个发动条件,天然写入的操作也就失利了。
2、在读取数据的时分数据不对
这样的状况是有数据可是不是有用的数据,一般这个时分就要看模仿的时序是否对了,要清晰的在上升沿的时间读取数据,然后留意的便是数据移位,每读取一位数据之后就要移位一个数据位,下面便是一段读取8位数据的代码。
for(i=0;i<8;i++)
{
IIC_SCL_HIGH(); //转化完结,SLAVE器材将数据线拉低,时钟线发生上升沿读取高8位数据
REC1=(REC1<<1)+IIC_SDA;
delay_us(5);
IIC_SCL_LOW(); //将时钟线拉低,等候下一个上升沿的到来
delay_us(5);
}
3、在用I/O操作的过程中,凹凸电平怎么书写
输入输出的I/O口都是有方向的,要留意方向的书写,引荐的一种写法便是高电平的写的时分将I/O装备为输入,这样上拉的效果就会向总线输出高电平,这样的优点便是能够在写完之后能够等候从器材对总线的操作,不会发生必定的抵触。下面便是一段高地电平的写法
#define IIC_SCL_HIGH() IIC_SCL_DIR = PORT_INPUT //时钟线拉高
#define IIC_SCL_LOW() IIC_SCL_DIR = PORT_OUTPUT;IIC_SCL=0//时钟线拉低
#define IIC_SDA_HIGH() IIC_SDA_DIR = PORT_INPUT //数据线拉高
#define IIC_SDA_LOW() IIC_SDA_DIR = PORT_OUTPUT;IIC_SDA=0//数据线拉低