前言
代码语言:javascript复制(向左滑动)今天遇到一个问题,存储芯片24C16存入数据后重新上电读取数据失败,用示波器刷抓取波形之后发现写数据没问题,但是读取数据部分有问题,来看看到底是怎么回事?
IIC读写时序
代码语言:javascript复制先来回顾IIC的读写时序,首先记住两句话:
①时钟SCL低,数据SDA发生变化;
②时钟SCL高,数据SDA保持稳定;
S | 器件地址 0 | A | 写入首地址 | A | DATA1 | A | ··· | DATAn | A | P |
---|---|---|---|---|---|---|---|---|---|---|
S | 0xA2 | A | 0x06 | A | 02 | A | ``` | 5A | A | P |
读取到写时序没问题,写入数据0x02,0x5a。 程序用伪代码表示: 读字节:
代码语言:javascript复制u8 IIC_readbyte()
{
IIC_start();//起始信号
IIC_putbyte();//器件地址
IIC_Putbyte();//首地址
IIC_stop();
IIC_start();
IIC_Putbyte();//器件地址 1
for( i = 0 ; i < length; i )
{
dataStart[i] = sw_i2c_readByte();
if(i!=length-1)//cyz:the last byte
{
sw_i2c_backACK();
}
}
IIC_stop();
}
u8 IIC_writebyte()
{
IIC_start();//起始信号
IIC_putbyte();//器件地址
IIC_Putbyte();//写入首地址
for(i=0;i<length;i )
IIC_putbyte();//写入数据
IIC_stop();
}
START | 器件地址 0 | A | 读出首地址 | A | 器件地址 1 | A | DATA1 | A | ··· | DATAn | !A | P |
---|---|---|---|---|---|---|---|---|---|---|---|---|
START | 0xA2 | A | 0x06 | A | 0xA3 | A | 00000000 | 00000000 |
可以看到读时序数据部分有问题,前面的都正常。 但是程序是从其他平台移植过来的,驱动函数没有改动,只是改了IO口输入输出配置的程序以及端口更改,所以软件部分实在是找不到原因了。于是检查硬件。
IIC硬件电路
参考网上一张图:
可以看到,在数据线跟时钟线上接了两个上拉电阻,在总线空闲时两条线为高电平。 而我电路上的存储芯片24C16没有接上拉电阻,所以我需要将单片机上的IO口设置为上拉。
于是,问题解决。
总结: 我们在调IIC协议的时候,应该先考虑硬件是否有问题,SDA跟SCL上拉是必要的。否则一直调时序也不会有结果