用我的硬件平台测试了一下,读取到的数据全部是0xFF,并没出现你说的乘2现象。 用软仿真领导真调试了一下,驱动SCL和SDA线的高低变换都没问题,问题还是在接收数据字节的功能函数中。
看如下: for (__i = 0; __i < BITSOFBYTE; __i++) { __temp <<= 1;
SET_SCLEPR_HIGH; I2CEPR_DELAY ;
__temp1 = GET_SDAEPR_VALUE; __temp |= __temp1;
SET_SCLEPR_LOW; I2CEPR_DELAY ; }
中的 __temp1 = GET_SDAEPR_VALUE; 假设SDA接P2.4,则如果SDA为1,返回值为0x10,如果SDA为0,返回值为0x00 再看下一句 __temp |= __temp1;
此时将返回结果不是放在最低位,而是放置到与SDA引脚对应的位置了。 我测试和结果,低4位永远是0,得到的结果是0xF0
候改后的代码如下,请比对: __temp1 = GET_SDAEPR_VALUE; // __temp |= __temp1; if(_temp1 != 0) { _temp |= 0x01; }
SET_SCLEPR_LOW;
|