作者:新紀元 | 更新時間:2016-04-03 | 瀏覽量:3100
我們都知道ESP8266外圍管腳資源非常有限,但是本人的項目需要通過ESP8266控制15路繼電器,如果直接采用腳對腳方式 那不可能完成的。故此 采用兩級74HC595通過三根數據線外擴16路IO
具體電路網上一大把,我就不浪費時間(主要我是直接手動焊接,并沒有具體畫電路圖)。管腳配置如下:
GPIO10 RCK
GPIO12 CLK
GPIO13 DAT
因為本人使用軟件模擬方式,并沒有采用esp硬件SPI資源。然而通過使用官方提供的API進行通信時,通過示波器實測 CLK時鐘只有不到500KHz(沒話說),所以控制io方面直接采用控制寄存器的方式了 具體如下:
#define GPIO_OUT_W1TS 0x60000304 /*寄存器地址*/ #define GPIO_OUT_W1TC 0x60000308 /*寄存器地址*/ /*eagle_soc.h文件中實現*/ //#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; }
其實很簡單,稍微懂點單片機的都知道!!只是芯片不同驅動IO的方式不同罷了!如上代碼時鐘速度也僅僅達到1.1MHz左右(實測),如果想通過外擴IO方式實現一些速度要求較高的通信,建議還是放棄吧!但對于 比如我只是控制繼電器這種 外擴IO就是一種很明智的選擇了 通過兩級595就可以達到外擴16路IO了(三級3*8 = 24 。。。),另外我的GPIO12 GPIO13是跟Nokia5110屏幕公用的(通過片選選著)讓各位大神見笑了