最近调STM8的I2C简直是爽呆呆,一直不成功,收不到从机寄存器的数据,最后终于完成,究其原因可以总结为以下几个方面:
1、I2C配置问题,一定要注意配置问题,特别的是I2C的时钟,SCL时钟的高低电平占空比,如果采用100kHz,占空比为1:1,若为400KHz,高低占空比为1:2,配置好之后直接应答使能,方便后面通讯过程。注意配置好之后,程序运行到这里SCL和SDA就会置1,并且能用电压表和示波器查看电压和波形;一定要去ST官网下载资料查看寄存器的配置,否则容易出错。
2、I2C读数据通讯过程一定是包含这样几个过程:起始位,判断CR1_SB,发送从机地址(7bit+1bit写操作),判断ADDR,读SR3清寄存器,发数据,判断BTF是否成功发送,重复起始,再读SB,读操作,ADDR,SR3,判断RXNE,保存接收数据,最后结束位和重新应答使能;适当的加nop延迟,I2C来不及应答,注意不要多操作也不要少操作,严格按照流程来,不然就会出错。只要写能成功,读肯定没问题。
3、通过I/O口实现模拟I2C通讯,若实在是I2C硬件功能调不通,可先用对应的I/O模拟出I2C的通讯过程。编程也是按照I2C通讯协议一步步走,不要漏掉和多出什么,否则容易出错。基本过程如下:1.配置系统时钟(关键,时钟决定了I2C通讯的速率);2.配置延时程序(这一点必须配置好,否者无法通讯成功);3.I2C初始化程序;4.起始信号程序;5.结束信号程序;6.接收从机应答程序(给从机一个应答位,保证接收到应答才能进行下一步操作);7.主机发送ack和Nack程序;8.检测是否接收到应答(对应第6步,保证I2C数据传输正确,也可不要)9.写一个字节程序;10.读一个字节程序。
将所有的这些程序编写好之后就能按照I2C通讯过程进行调用和编写,网上程序很多可以对着看,就不贴源代码了。
|