由于之前Arduino UNO(ATmega328P)
板子的SDA
和SCL
的錯位刚照,才導(dǎo)致了這篇文章的出現(xiàn)。
原理圖在此:
實際 | SDA | SCL | --> | 我的 | SDA | SCL |
---|---|---|---|---|---|---|
- | A4(PC4) | A5(PC5) | --> | - | A3(PC3) | A4(PC4) |
畫原理圖的時候沒注意,一不留神就錯位了阅酪,導(dǎo)致現(xiàn)在不得不使用軟件I2C
來與DS3231
來通信框全。
不過還好察绷,國外已有大神寫好了軟件I2C
的庫在這里
但是DS3231
的庫使用的是硬件I2C
,需要移植一下,好在Bernhard的軟件I2C
很好的適配了原硬件I2C
的Wire
庫津辩,移植只需做上圖的前三個步驟便可以了拆撼,很是方便。
需要注意的是:
1.他的軟件I2C
庫中的函數(shù)全部寫在了.h
頭文件中喘沿,這樣直接移植(只做以上三步)會導(dǎo)致文件被重復(fù)包含闸度,從而導(dǎo)致函數(shù)重復(fù)被定義的錯誤,需要對SoftI2CMaster.h
進行適當(dāng)?shù)男薷募纯伞?/p>
2.在SoftI2CMaster.h
文件中的函數(shù)定義前加上 inline
關(guān)鍵字即可解決重復(fù)定義的問題,也可以新建一個SoftI2CMaster.c
文件蚜印,將SoftI2CMaster.h
中的函數(shù)寫到SoftI2CMaster.c
中去莺禁,這樣也可以解決。
3.DS3231
庫函數(shù)的修改窄赋,這部分改動也較小哟冬。建議先把DS3231
整個庫文件復(fù)制出來,方便修改寝凌。
在DS3231.h
頭文件中柒傻,替換#include<Wire.h>
為#include<SoftWire.h>
,
在頭文件之前较木,先加入SCL_PIN
红符,SDA_PIN
,SCL_PORTX
,SDA_PORTX
相關(guān)的宏定義,不能在頭文件之后加入伐债,否則可能會報錯预侯,修改后的DS3231.h
頭文件部分如下:
#define SCL_PIN 4 //correspond with arduino IO instead of the avr chip pin.
#define SCL_PORT PORTC //the port of the pin
#define SDA_PIN 3
#define SDA_PORT PORTC
#include <SoftWire.h>
//#include <Wire.h>
4.接著需要在DS3231.c
文件中實例化一個 SoftWire
類,如下:
SoftWire Wire = SoftWire();
這樣移植工作就做完了峰锁。
但需要注意的是萎馅,在編寫Arduino
的.ino
文件時,需要對I2C
初始化虹蒋,這時候需要對SoftWire
實例化的類進行申明糜芳,如下:
extern SoftWire Wire;
至此飒货,整個軟件I2C
移植過程就完成了。
已經(jīng)修改好了的文件可從下面地址下載:
1.修改后的軟件I2C文件下載地址:SoftI2CMaster_Add_inline
2.修改后的DS3231文件下載地址:DS3231WithSoftI2C
注:
1.原SoftI2CMaster
庫制作者在此:SoftI2CMaster
2.原DS3231
庫文件是從Arduino IDE
中下載的峭竣。