最近坑了队友一把。
调试两个通过IIC连接的器件,一条总线,两个地址,分时访问。在测试板的时候,使用搭建的环境,访问两个器件,买的现成的集成了两个器件的小板,没有什么问题,不过用的MCU是stm32的。移植到正式版本,使用SAM4S的时候,使用的模拟IIIC,同样的时序,结果读出来的结果很不稳定。使用示波器测量IIC电平,发现除了代表高低电平的0和1,还出现了半高的中段电平,莫非我们整出来了量子态?
就因为这非0非1的电平,得到的数据忽上忽下,完全没法使用。由于程序是移植现成的,就一直怀疑硬件问题,改电阻换电容,折腾了好久。实在找不出原因,今天开始怀疑软件,是不是GPIO初始化问题。查找SAM4S总线对多器件的支持情况,终于发现,此时IO口必须使用双向口,开漏输出,不然只能支持单器件。端口供电不足?
找到原因就好办了,修改GPIO初始化:
- gpio_configure_pin(PIO_PB5_IDX, (PIO_OUTPUT_0|PIO_DEFAULT));
- gpio_configure_pin(PIO_PB4_IDX, (PIO_OUTPUT_0|PIO_DEFAULT));
- pio_set_multi_driver(PIOB, PIO_PB5, ENABLE);
- pio_set_multi_driver(PIOB, PIO_PB4, ENABLE);
写引脚电平按常规写入即可,没有特殊要求;但是在读取的时候需要先把GPIO置1,并且延时一段时间(我用的是延时1us),然后读取GPIO的电平,不然也会读取不稳定。