测试目的:测试利用STM32F103CB的i2c2能否正确访问i2c外设。
测试方法:循环调用I2C_Comm_MasterRead()连续读13个寄存器,延迟100ms后显示。
结果如下:
0 !
10 !20 !1 !0 !20 !0 !20 !0 !20 !4 !0 !20 !0 !
上面这一行是正确的显示。每次系统复位后都会正确显示若干次,然后出现错误。如下
0 !
10 !20 !1 !0 !20 !0 !20 !0 !20 !7 !ff !ff !ff !
上面这一行后四位是错的。
0 !
10 !20 !1 !0 !20 !0 !20 !0 !20 !4 !0 !20 !0 !
有时,重新读会恢复。
多数情况完全不能恢复。如下:
0 !
10 !20 !1 !0 !20 !0 !20 !0 !20 !7f !ff !ff !ff !
3 !
0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !
2 !
0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !
改动一:
我在每次调用I2C_Comm_MasterRead()后,关闭(DISABLE)I2C,然后再打开(ENABLE),
再执行I2C_Comm_MasterRead(),读出乱码,但第一位始终是正确的。
0 !
10 !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !
0 !
10 !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !
0 !
偶尔会出现下面这样的错误。但都是可以恢复的。
4 !
0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !0 !
0 !
10 !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !
改动二:
我在每次调用I2C_Comm_MasterRead()后,关闭(DISABLE)I2C,然后再重新初始化I2C_Comm_Init(I2C2, 400000, 0xA0);,
这种情况,有大约10%左右的误码,如下第一行。虽然出现了误码,重新初始化可以恢复。
10 !20 !1 !0 !20 !f !ff !ff !ff !ff !ff !ff !ff !
0 !
10 !20 !1 !0 !20 !0 !20 !0 !20 !4 !0 !20 !0 !
改动三:
一次只读一个字节!
不再出现ff了,但也会有ADDR_MATCH_ERR或DATA_TIMEOUT错!这个问题不大。
改动四:
重新测试一次读13个字节的情况:
这回关了I2C后,同时关毕i2c时钟。RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C2 , DISABLE);
稍作延迟再打开,执行RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C2 , ENABLE);
然后再重新初始化I2C_Comm_Init(I2C2, 400000, 0xA0);结果出现了更多的类似下面几行的乱码。
0 !
10 !20 !3f !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !
0 !
10 !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !ff !
对于这个测试的结果,请大家帮助分析一下原因。 |