热度 14
2012-12-21 11:42
1735 次阅读|
3 个评论
近期做了一个运用PIC24F系列单片机内部的I2C模块进行和外界的具有I2C通信接口的温/湿度传感器通信,在项目实施的过程中对PIC单片机内部的I2C模块有了更深的了解,现将其写下,供大家分享,同时也希望各位能发表自己的看法,共同研究。 首先简述在这次项目中用到的具有I2C接口的传感器。本次采用的是芯科实验室的最新产品,温/湿度传感器SI7005,该产品利用I2C接口进行通信,功耗低,不需人为在进行校准,测量精度高,线性器件,可直接读出当前的温度,湿度等诸多优点。 单片机选择的是MICROCHIP公司的PIC24F32KA304单片机,该种类型的单片机基本上与MICROCHIP公司的PIC24F系列;单片机大同小异,但不支持外部引脚映射功能。在项目过程中遇到了如下的一些问题: (1).项目进行时,开始驱动程序写的很快,但在写完后进行调试时,第一步就无法实施。PIC单片机无法发出起始信号,由于这一问题的出现导致了后面几乎是举步维艰,完全死在了这里。出现这一问题之后首先想到的是程序中关于I2C时序不正确的问题,开始检查程序中关于I2C时序的每一句,进行修修改改,感觉没有什么问题,但运行时依旧不能发出起始信号。自己感觉程序方面没有问题,后来开始检查是否是硬件上的原因,经过查看PIC单片机的数据手册,发现上面所述的要求SDA ,SCL 的上拉电阻不能大于2.5K ,而电路板上却焊接的是10K 的电阻,便猜想是否是电阻过大了,无法将电平拉高。后来经过了解,有的地方说标准的I2C上拉电阻为4.7K ,也有的地方说是2.2K ,自己也不是很明白,就将电路板上的电阻改为了2.2K 可是可怕的事情依旧发生了电阻显然对这个无影响。还是很苦命的用万用表检查电路,有一种考试做不出来,认为试卷出的有问题......,后来看单片机的手册时无意的查看到了这个单片机的I/O端口部分,发现这个单片机和其它的稍微有一点差别,在I/O控制寄存器中多了一个ANSB寄存器,这一寄存器的功能进行I/O端口的模拟,数字功能选择,上电时单片机默认的是模拟功能,也就是说我的程序中根本就没有选通SDA SCL 作为数字通道,也就根本不可能发出正常的数字电平,从而单片机根本就发不出起始信号,此时才大彻大悟,就错在这一个微小的地方啊,天下大事必作于细啊! (2).前面的起始信号是发出去了,可接下来的问题又来了。单片机发出从机的地址字节后得不到从机的应答,又开始找程序问题,找不出来,又接着找硬件的问题,还是一头雾水,纠结啊!后来我们总监给了我厂家技术支持电话,要我学会解决问题的方法与途径。后来经过联系厂家的技术支持,那过边说如果没有应答的话可能是从机没有工作等原因。于是又开始检查硬件,确定从机的供电正常,SDA SCL 线连接正常,又陷入了一头雾水中。接着又开始看传感器的数据手册,发现是从机的地址发送错了,当初手册上的序列是发送地址0x40,也就没有多想,可现在再次看时发现虽然从机的地址确实是0x40但因为第一位是表明是主机是向从机写还是读,也就是说整体要向左移一位,也就是应该要发送地址字节为0x80,哎,当初看芯片资料时不用心啊,这一错误又浪费了许多时间。我们在对硬件写驱动程序时,当遇到问题时不要自己埋头苦干,也要学会通过各种方法来解决问题,比如通过产品的技术支持就是一个很好的方法,同样一定要仔细的看芯片资料,不要因为一个细节而出错.后来经过对程序的修修改改总算是能读出传感器的数据了,还有一点需要注意,在单片机I2C模块控制器的标志位写1时,一定要确认这一位已经清0,例如 RSEN RCEN ACKEN ,同样在I2C模块的状态寄存器中也要注意一定要等相关的状态标志位清0或者为1时,才进行下一步的操作,不然会出现冲突的情况出现. (3).程序算是写完了,也能进行正确的驱动,本来以为没什么问题了,可后来发现在I2C通信速率的选择上出现了问题。PIC24F系列单片机支持400K 100K 两种总线传输速率,但在这个项目中竟然400K的可以,而100K 却不行,很奇怪吧!不过在查找这个问题时还算是比较的轻松。关键在于在I2C寄存器中的TRSTAT ,TBF这两位上的区别,之前我是用TBF来查询主机是否发送完成,这种方式下400K 因为速度比较快,还没有什么影响,但到了用100K 时就出现了当主机的数据还没有完全发完时,主机就开始了下一步的操作,也就认IWCOL(写冲突位)置1,TBF 只能表明单片机内部了发送缓冲器已经空了,并没有表明数据已经在I2C总线上完全的发送完成,也就出现了冲突的出现,而TRSTAT则表示主机是 否已经全部发送完成。这两位的区别需要注意。 基本上一个温/湿度监测系统就完成了,但是还需要进一步的对其稳定性和精度进行测试。 第一次做项目,第一次写博客,欢迎大家对上述的项目提出建议和批评。