月份: 2021 年 5 月

[SN74HC595] 8-Bit Shift Registers with 3-State Output Registers 的使用

No Comments

擴展 GPIOs 的數量,就是使用到它。透過單支輸入腳位循序輸入欲輸出的,此例是 8 支輸出腳位,其各腳位的電平,以 1-to-8 的方法達成 GPIOs 數量的擴充。當然輸入訊號透過 clock 來分隔出各欲輸出腳位的電平。所以輸入端的時脈需至少是輸出端所需時脈的 8×2 倍,即以時間換取空間/更多可控腳位。而此 IC 只用於輸出擴展。
當用於通訊時,data 是一段一段輸出,故通常後級輸出要 pull-high/low,以讓前級釋放 data bus。而當用於後級的準位狀態保持時,Output-Enable 可能就必須一直保持著使能。畢竟用上這顆 IC,目的不外乎讓前級耗用的 GPIOs 數量更少。已知最多用上 5 支 GPIOs 才能控制這顆 IC。猜測最少 2 支。

本文依筆者理解的程度述說,不保證正確,僅供參考。
  • shift registers and storage registers 都是上緣 L->H 觸發作動,改變狀態儲存資料
  • SER 在 clock 於 H->L 的時間點,來改變資料或狀態。SRCLR,也在這個時間點作動
  • shift register 移位暫存器則在 L->H 的時間點,作準位的閂鎖或儲存
  • SER 在 SRCLK2 初(H->L)裝定準位,是一個 1 clock 的 high level data,data1,Bit1。此時 SRCLR 拉 high/disable;資料不被清除。OE 處於 low/enable;所以輸出準位是非浮動的,值未知(因此前儘管 SRCLR enable,但 RCLK 不動。事實上前 8 個 clock 的 SER 都是 low 的;從 Qi 的前狀態看出)
  • 當 SRCLK2 L->H 時,即於此 clock 半週時,data1 閂鎖儲存在 shift register1。此時我們有了第一筆有效資料 Bit1
  • 於 SRCLK3 初,第二筆 Bit2 將從 SER 進來(接著如前述幾點的作動),此時,RCLK 必須與 SRCLK 同步而反向,即 L->H,這個時間點,將會更新 storage register1 並且輸出至 Qa。所以從 SER 的裝定到出現在第一個輸出,將會有一個 clock 的延遲
  • 於 RCLK 半週時,縱觀 OE 的作動,就發生在 SRCLK/RCLK 半週處為佳
  • 於 SRCLK3 結束時及 SRCLK4 初,shift register1 有著 Bit2,shift register2 有著 Bit1,storage register1 有著 Bit1,Qa 輸出 Bit1
  • shift register1 將隨著 SRCLK,及前接的 SER 不斷地更新內容。shift register2 與 storage register1 將隨著前接的 shift register1 及各自的 SRCLK,RCLK 不斷地更新內容。shift register3 與 storage register2 將隨著前接的 shift register2 及各自的 SRCLK,RCLK 不斷地更新內容。以此類推遞移
  • 當 SRCLK10 初,所有 storage registers,將分別儲存並輸出著前 8 個 SRCLK 週期中 SER 的各個狀態;Qh 存 SRCLK2 的 SER Bit1(於 SRCLK2 時出現於 SER 上),Qg 存 SRCLK3 的 SER Bit2,Qf 存 SRCLK4 的 SER Bit3,Qe 存 SRCLK5 的 SER Bit4,以此類推
  • 此外我們看到 Qh-prime 會比 Qh 提早半週期出現有效資料,即於 shift register8 儲存後經過半週的時間;其用途於串接
  • 於 11 半週起至 13 半週,OE 是除能的,但期間的 12 週期,SER 及 RCLK 是作動的,data k。因此,在 13 後半週 OE 再次 enable,Qa 輸出有效且是所裝定值 data k
  • Qa 值 data k 保持至 15 半週前,並且因為從 11 半週起,只送了一個 RCLK,故 Qh 值歸零,Qa 值 data k 也無法遞移到 Qb。不過,data k 會從 shift register1 流至 shift register4 之前
  • 最後,我們看到 SRCLR 作動了一個週期, SRCLR 在 15 半週時致能,SRCLK L->H,其是針對 shift registers 正處於閂鎖時,則所有 shift registers 將清除。但 Qa 並不受影響。故於 16 週起,即此 SRCLR 的下半週,送出一個 RCLK,使得所有 storage registers 讀取所有 shift registers 因而也歸零。

實作考量

  • 內插計算 f_clock 於 3.3V 是最高 15.4MHz。就 ESP 而言至少需 6insts/80MHz,11insts/160MHz
  • 但根據前文章的實測,ESP GPIO 的變化至少就耗時 1us。。。咦,不對,應該要重測。之前的測試太大意了;應需多次變化來計算才是。因 ESP 最小計時單位是 1us。也不對,好像是用示波器量測的。。。
  • shift register 至少需 1/2 t_clock 才能傳遞 data 至 storage register。並且二者都是正緣觸發。考量兩種情況,若 RCLK 落後 SRCLK 半週,即二者反向,那麼資料的輸出將可達最快。並且,若二者同源,那麼多加個反向器應就可實現。不過同源會有一個最大的弊病,即,所有的 output 都將在每個週期就更新一次,雖然還有 OE 以掌控,但它使用的範圍便受限。若 RCLK 與 SRCLK 同步,則 output 將會落後一整個週期,即,當 8 bit 輸入完成後,再過一週期後才有完整的 8-bit 輸出
  • 因此,對於同源,是無法應用到輸出狀態的控制。RCLK 與 SRCLK 勢必異源。並且 RCLK 勢必不能隨 SRCLK 起舞,唯當 8 bits 都輸入 SER 後,才打出 一支 RCLK 週期使所有 storage registers 更新其所對應的 shift registers 資料來源
  • 此時,我們已用上了 3 支 GPIOs 了;SER,SRCLK,RCLK
  • 作 clear,我們可以全輸入 0 以達成
  • OE,除非後級有需要,不然是可以 always enabled
  • 因此結論是,我們得耗用 3 支 GPIO,來得到 8-3 額外的增加腳位 5 支,不過會犧牲點時間
  • 結論:這篇文章還沒完,例如同源的應用,timing requirement 的不抵觸,串接的考量等。

Categories: Arduino Arduino Brick

Tags:

PHP Code Snippets Powered By : XYZScripts.com