鳕鱼天空

This is Mr Wang's Tech Blog.

microbit I2C方法pins的使用备忘(DS1307时钟模块)

Microbit支持I2C方法,而且一共只有两个方法,一个是读数字,一个是写数字。

用ds1307和ds3231两个时钟模块进行了测试。

ds3231可以在写入0地址后连续读取7位的时间信息,但ds1307读出的信息一直怪怪的,经过仔细观察,发现竟然是隔了一位读出来的,(应该是秒,分,时,这样,ds1307读出来竟然是秒,时,日),然后用了写一次地址读一个数字的方法,竟然对了。

讲道理i2c的读取每次指针加一的,那么也许是芯片自身的关系,或者pins模块本身的一些bug,导致读取ds1307寄存器的时候发生跳读的问题,应该是指针加了二,这个在以后使用中需要注意。

18/4/3 22:33分修订:读出来的数据一致有觉得不对的地方,又仔细回去研究了DS1307的手册,并仔细核对了读取的数据,发现原来秒的最高位为1了,而这个位是CH位,当为1的时候需要置零进行复位,然后时钟就正常了(变1的可能性是断电而且电池没电过了,恰巧这个模块由于生产时焊接的原因电池一直是无效的),然后,DS1307依然要读一个后写一次地址,总觉得自带的计数器加2了,过几天试试新的模块会不会没有这个问题。

引用:要注意的是,00h 地址的第7 位为器件时钟允许位(CH),由于在在开始上电时内部RAM内容随机,所以在初始化时将CH 位设零(时钟允许)是非常重要的。

http://www.elecfans.com/yuanqijian/yinjiaotu/20180126623670.html

引用:由于 DS1307 的方波输出脚为集电极开路,故要在外部加上上拉电阻! 要注意的是,00h 地址的第 7 位为器件时钟允许位(CH),此位为 1 则芯片未开始工作,即时钟未走时,所以在上电时单片机要先读出秒,并判断位 7(CH)是否为 1,如为 1 要把该位清零写入秒寄存器(地址为 0),并把其他的时间单元设定为默认值。 如果上电复位时读出的秒的最高位 CH 为 0,说明时钟已工作(前已对 CH 清 0,且停电 后有备用电池),此时不能重写时间单元!

https://wenku.baidu.com/view/18c0391803d8ce2f00662366.html

 

另外通过对库的研究,从方法回到了硬件本身的通讯认识,高低电平的变化对地址设置和对寄存器的读取就是通讯的本质,这个可以好好研究下,果然学习得深入些才能看到本质,有真正的收获。

添加评论

Loading