欢迎来到天天文库
浏览记录
ID:5386577
大小:169.74 KB
页数:4页
时间:2017-12-08
《stm8调试硬件i2c心得》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、stm8调试硬件I2C心得这次调试stm8的硬件真是艰辛,没有想到这样恼火!整整搞啦我5天的时间,参考网上很多例子和风驰的stm8讲解!和自己的实践,终于搞通啦!特将自己在调试过程中一些心得希望的大家分享。由于本人水平有限也希望大家指出不足和错误的地方!Stm8不需要专门配置GPIO口,执行初始化就可以啦!有些stm8需要打开EEPROM设置I2C(看官方文档)。Stm8主要靠SR1和SR3状态寄存器判断I2C的情况(while(!XXXXX)就是出自这里),多半大家调不通!就是卡在这里(需要注意的是寄存器有些位,只要读寄存器就可以清除,在仿真的时候,最好不要打开寄存器页面)。这
2、里分软故障和硬故障:首先是硬故障:一般是stm8芯片IO口坏啦,有些时候stm8能够写程序而且IO别的功能都是好的,单单是I2C用不起!还有就是IO上拉电压不够!我就遇到这样的问题,我IO加上逻辑分析仪后就可以调通,不加就通不了。这个也搞啦我很久。软故障:一般主要是设置CR1和CR2问题,只要按照我的参考程序设置就可以!我详细的讲讲,寄存器I2c_CR2应答使能位(位2)ack。首先是理解:官方文档上面说的是ack应答使能,对是使能!很多人包括我自己开始都认为是发送ack,导致每次stm8收到数据后,我们都手动在每次收到字节后加I2C_AcknowledgeConfig(I2C_
3、ACK_CURR)无任何意义,因为在接收模式下,收到完整字节后,自动发送ack(提前是CR2ack位使能,不需要专门CR2ack位置1),都是软件虚拟I2C用多啦!想当然啦!还有就是使用这个ack!设置ACK都必须在接收字节前,也就是说为个在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后,必须清除ack位(ack=0)!设置ack同理!还有需要主要的地方如果设置ack=0;下次需要重新产生ack的时候!需要手动置位ack!记住在开始接收之前!如果你只有一个字节正确,后面全部是0xFF...可能就是这个问题(切记!切记!很多例子都没有加上这句,包括风驰的例子!!
4、不过他没有加循环!如果他再循环一次就会出现问题。)随便说说仿真调试!在调试过程中,最好不要打开I2C寄存器看!因为对寄存器的读,也会造成寄存器有些位重置!直接按Go,然后暂停。进去程序看卡在那里啦。操作库和寄存器编写程序,其实没有分别!不过为啦更好的理解,我在这里是操作寄存器!网上有人说加入中断会对I2C产生影响,我这里没有加中断。希望有后来人补全!反正我这几天运行没有发现问题!附录1主要I2C程序/********************************************************************************名称:Read_881
5、6*功能:读取温度数据*形参:*pBuffer返回读取数据指针index温度寄存器地址NumByteToRead需要读取字节数*返回:无*说明:该函数直接操作stm8寄存器!寄存器I2c_CR2应答使能位(位2)ack=1,当stm8接受到数据后,自动发送ACK.不需要手动ack为个在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后,必须清除ack位(ack=0)当接收到最后一个字节,需要重新使能ack=1.(如果不设置ack=1,循环开始后,收到第一个字节stm8不会发送ack,造成除每次循环第一个字节正常外,后面收到的数据都是0xFF....stm8一直不给
6、ack)需要注意的是寄存器有些位,只要读寄存器就可以清除(不需要专门写入寄存器,在仿真的时候,最好不要打开寄存器页面),******************************************************************************/voidRead_8816(u8*pBuffer,u8index,u8NumByteToRead){while(I2C->SR3&0x02);//等待总线空闲检测i2c-SR3busy位//以下见stm8s中文数据手册P251(图96主设备发送模式发送序列图)//S起始条件I2C->CR2
7、=0x01;//
8、产生起始位CR2start位//EV5:SB=1,读SR1然后将地址写入DR寄存器将清除该标志。while(!(I2C->SR1&0x01));//等待START发送完E5//ADDRESS(发送模式)I2C->DR=0x00;//发送MLX90615器件地址(最后一位是0,表示发送)while(!(I2C->SR1&0x02));//等特7位器件地址发送完并且收到ack,ADDR置1//EV6:ADDR在软件读取SR1后,对SR3寄存器读操作将清除改位I2C->SR1;//见P
此文档下载收益归作者所有