作者:新紀(jì)元 | 更新時(shí)間:2016-04-03 | 瀏覽量:3714
我們都知道ESP8266外圍管腳資源非常有限,但是本人的項(xiàng)目需要通過ESP8266控制15路繼電器,如果直接采用腳對(duì)腳方式 那不可能完成的。故此 采用兩級(jí)74HC595通過三根數(shù)據(jù)線外擴(kuò)16路IO
具體電路網(wǎng)上一大把,我就不浪費(fèi)時(shí)間(主要我是直接手動(dòng)焊接,并沒有具體畫電路圖)。管腳配置如下:
GPIO10 RCK
GPIO12 CLK
GPIO13 DAT
因?yàn)楸救耸褂密浖M方式,并沒有采用esp硬件SPI資源。然而通過使用官方提供的API進(jìn)行通信時(shí),通過示波器實(shí)測(cè) CLK時(shí)鐘只有不到500KHz(沒話說),所以控制io方面直接采用控制寄存器的方式了 具體如下:
#define GPIO_OUT_W1TS 0x60000304 /*寄存器地址*/ #define GPIO_OUT_W1TC 0x60000308 /*寄存器地址*/ /*eagle_soc.h文件中實(shí)現(xiàn)*/ //#define ETS_UNCACHED_ADDR(addr) (addr) //#define READ_PERI_REG(addr) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) //#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val) #define CLK_595_SET \ WRITE_PERI_REG(GPIO_OUT_W1TS,READ_PERI_REG(GPIO_OUT_W1TS) | ((uint32)1 << 12)) #define CLK_595_RESET \ WRITE_PERI_REG(GPIO_OUT_W1TC,READ_PERI_REG(GPIO_OUT_W1TC) | ((uint32)1 << 12)) #define DAT_595_SET \ WRITE_PERI_REG(GPIO_OUT_W1TS,READ_PERI_REG(GPIO_OUT_W1TS) | ((uint32)1 << 13)) #define DAT_595_RESET \ WRITE_PERI_REG(GPIO_OUT_W1TC,READ_PERI_REG(GPIO_OUT_W1TC) | ((uint32)1 << 13))
部分代碼如下:
void ICACHE_FLASH_ATTR
writeOneByte(unsigned char dat){
unsigned int tmp;
for(tmp = 8; tmp; tmp--){
CLK_595_RESET;
if(dat & 0x80){
DAT_595_SET;
}else{
DAT_595_RESET;
}
CLK_595_SET;
dat <<= 1;
}
//CLK_595_RESET;
}其實(shí)很簡(jiǎn)單,稍微懂點(diǎn)單片機(jī)的都知道?。≈皇切酒煌?qū)動(dòng)IO的方式不同罷了!如上代碼時(shí)鐘速度也僅僅達(dá)到1.1MHz左右(實(shí)測(cè)),如果想通過外擴(kuò)IO方式實(shí)現(xiàn)一些速度要求較高的通信,建議還是放棄吧!但對(duì)于 比如我只是控制繼電器這種 外擴(kuò)IO就是一種很明智的選擇了 通過兩級(jí)595就可以達(dá)到外擴(kuò)16路IO了(三級(jí)3*8 = 24 。。。),另外我的GPIO12 GPIO13是跟Nokia5110屏幕公用的(通過片選選著)讓各位大神見笑了