<em id="ri2my"></em>
  • <em id="ri2my"></em>
    <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
  • <em id="ri2my"><label id="ri2my"></label></em>
    <div id="ri2my"></div>
    1. <em id="ri2my"><label id="ri2my"></label></em>
    2. <em id="ri2my"><ol id="ri2my"></ol></em>
      <em id="ri2my"></em>

      1. 基于ESP8266的外擴IO程序

        作者:新紀元 | 更新時間:2016-04-03 | 瀏覽量:3135

            我們都知道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屏幕公用的(通過片選選著)讓各位大神見笑了

        595.zip




        評論:共6條

        貝殼物聯 評論于:2016-04-03 09:47:59
        大神啊,還不忘謙虛,多謝分享!
        ridxqqqq 評論于:2016-04-07 20:52:06
        論壇資料好少啊 有視頻教程就好了
        新紀元 回復于:2016-04-09 02:29:03
        回復 @ridxqqqq:來到這里玩的 還有誰教啊 都是看著一手看手冊一手看例程 外設驅動是最簡單的了 只要會驅動IO 什么外設都能驅動了
        ridxqqqq 評論于:2016-04-09 16:34:45
        唉 今天總算是有了點進步 慢慢學習吧 感謝你的回復
        simonc 評論于:2016-05-11 23:54:34
        如果是用595拓展io,那么拓展的io能不能用于各種不同的傳感器呢,如果能要怎么做,感覺和液晶這類串行數據輸入的有區別
        WECAN 評論于:2017-08-27 16:01:43
        感謝樓主的分享啊!
        返回頂部

        <em id="ri2my"></em>
      2. <em id="ri2my"></em>
        <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
      3. <em id="ri2my"><label id="ri2my"></label></em>
        <div id="ri2my"></div>
        1. <em id="ri2my"><label id="ri2my"></label></em>
        2. <em id="ri2my"><ol id="ri2my"></ol></em>
          <em id="ri2my"></em>

          1. 免费高清视频