發表文章

目前顯示的是 2021的文章

FPGA sample - Lattice I2C IP (EFB) #2

圖片
  Lattice Diamond Setting Click "IPexpress button" and select "EFB" IPX Select "Project Path" (source code files), "File Name" and "Module Output" is Verilog Click "Customize" Select Primary I2C EFB have 2 I2C controller, suggestion use primary I2C "EFB Enable" tab  →  "EFB Function Enable" Field  → Click "Primary User"    Configuration Primary I2C Speed is 400KHz Slave Address is "0001001" "I2C" tab  → "Primary I2C " Field   → "I2C Bus Preformance" is 400KHz   → "Slave Address" is 7'b0001001 Click "Generate" to generate hardware I2C code Founad hardware I2C IPX in your project files   範例程式碼  宣告 EFB-IP /*********************************************************************** * * * EFB Module Instanitiation * *

FPGA sample - Lattice I2C IP (EFB) #1

圖片
Lattice I2C IP 話說原本使用 Verlog 寫了 I2C Slave 模組功能正常沒有太多的問題,有天同事問我如何做 I2C-stress 測試,協助設計了幾個指令,長時間 I2C  的 讀取測試,測試結果使用 Verlog I2C Slave 模組居然有幾次沒有 acknowledge,於是花了時間研讀 Lattice I2C IP (EFB),把原本的模組更換成 Lattice I2C IP,通過了 I2C-stress 的測試。當然,原本 Verlog I2C Slave 模組程式碼,也找到問題所在,修正並通過 I2C-stress 驗證。 EFB Block Diagram Lattice 提供了一個 EFB- IP  (Embedded Function Block)提供了 Serial Peripheral Interface (SPI),兩組 I2C (可以設定為 Master/Slave) 和 Timer/Counter。因此,在使用 EFB-IP 就和編寫 MCU 模組程式很像,要先做 EFB-IP 初始化(功能設定),再控制 EFB-IP 完成 I2C 功能。 Block Diagram             程式開發者利用 Wishbone bus 來初始化和控制 EFB-IP,Wishbone bus 包含 Wishbone address,Wishbone data input/output 和控制訊號,再使用 I2C_SDA/I2C_SCL 來連接外面的 I2C 裝置。 Wishbone bus 透過讀寫 EFB-IP 的暫存器來完成初始化和讀寫外部的 I2C  裝置,存取 EFI-IP 的訊號流程順序。 EFB-IP Register wb_adr Description MICO_EFB_I2C_CR 0x40 0x4A Control Register b[7] : I2C controller enable b[6] : I2C GC mode enable (I2C 廣播模式) b[5] : I2C controller wake-up enable MICO_EFB_I2C_CMDR 0x41 0x4B Command Register b[7] : STA - Generate (Repeated) STA

Atmel Tiny-88 MCU firmware architecture

圖片
 單晶片的靭體架構 單晶片的靭體架構可以分為兩類,一類是有 RTOS 的靭體駕架構,一類是沒有 RTOS 的靭體架構。對於沒有 RTOS 的靭體架構,就會依照程式開發者的經驗和知識來設計靭體架構,如下圖是設計開發用於車上娛樂機的經驗,分享給靭體開發者參考。 靭體架構流程 在單晶片上電之後,單晶片核心處理後,就由 Internal  Flash  載入到記憶體,進入靭體的PowerOnInit ,完成單晶片核心和模組初始化,接著 Main-Service,先執行中斷未完成程序,再執行固定時間需求的程序,程序都執行完成後,開啟中斷功能,若汔車是發動的,執行 Time-To-Idle 來節約單晶片的電源,當然在固定時間或突發事件就會中斷喚醒單晶片,進入 ISR,在 ISR 內部程式,只有設定 pend flag,然後進入 Main-Service 把中斷事件完成。 若汔車已經停車了,在經過 N sec  後,執行 Time-To-Shutdown 把單晶片斷電減少對汔車蓄電池的消耗。  Power-On-Init 電源一開始就清除變數,初始化各個模組,計時器,中斷等 .就進入 Main-Service. Main-Service 靭體的主要服務程式,首先確認有沒有 pend flag,或有 pend flag 表示有中斷事件未完成,就先完成中斷事件,再把其他事件完成,最後開啟中斷功能,進入單晶片節省電源功能。  Time-To-Idle 當汔車還在發動時,汔車仍由石油引擎供電或者高壓電池供電,所以單晶片可以不需節省電源或者做部分的節省電源 .在這個函式執行單晶片休眠 (Idle) 節省部分電源。 Time-To-Shutdown 當汔車已經停車之後,汔車仍有 12V 的蓄電池可以供電,但是大部分的主要系統都關電節省電源消耗,只留下一些小功率的單晶片,確認所有系統都正常關閉,裝置也都關閉後,最後再要求單晶片也完全斷電。在單晶片進入這個函式執行完成斷電電路,讓系統不再提供電源給單晶片 . Interrupt-Service-Routine(ISR) 讀取中斷資料,清除中斷的 Pend Flag,若中斷事件已處理完成,就不設定 Flag,若仍有中斷事件需要在  Main-Service 處理,就需要設定 Flag,然後進入    Main-Service.

Atmel Tiny88 - software I2C master

  Software I 2 C (master) Microchip Tiny-88 只有一組 TWI master/slave 功能,在系統設計中,Tiny-88 一般做為電源管理,系統開關機,還有和系統主晶片組溝通。Tiny-88 和主晶片組溝通的介面會採用 TWI slave,當還需要再讀取系統溫度,系統電流,系統生產資料或者系統電池時,還需要一組 I2C master 去讀取系統的資料,只能使用 GPIO 來模擬 software I2C.    Software I2C header 宣告程式碼中,需要用到的變數和子函式,使用宣告的好處是日後若要更換成其他組的 GPIO 容易更換,也不容易有遺漏。 宣告 GPIO PORT 和接腳位置去模擬 software I2C 宣告 I2C 寛度的時間設定值 宣告 GPIO High / Low / Input 子函式 /* Constant Variable Define */ #define SW_I2C_DDR DDRD #define SW_I2C_DIN PIND #define SW_I2C_DOUT PORTD #define SW_I2C_SDA 6 #define SW_I2C_SCL 7 /** Bit to or with address for read start and read restart */ #define I2C_READ 1 /** Bit to or with address for write start and write restart */ #define I2C_WRITE 0 /** Delay used for software I2C */ #define I2C_DELAY_USEC 10 #define I2C_DELAY_CLKH 6 /* I2C Clock High Width */ /* I2C Clock Low Width (by instruction run time) */ #define I2C_DELAY_CLKL 0 /* I2C Clock Low Width for finial bit */ #define I2C_DELAY_CLKFL

Atmel Tiny 88 - TWI module (I2C Slave)

圖片
 Two-wire Serial Interface (TWI) TWI 由 clock (SCK) 和 data (SDA) 雙向的接腳所組成,TWI 接腳的設計為開路集閘需要外加 Pull-up 電阻才能資料傳遞。 TWI 的特性如下: 最多能支援 128 不同位址的裝置 相容於 Philips I2C protocol  支援 Standard model (< 100K bps) 和 Fast mode (< 400K bps) 支援 Address 喚醒裝置由 Sleep mode  TWI address 和 data packet format  TWI 資料傳輸由 Master 初始化,資料封包由 Start bit 開始,到 Stop bit 結束。 Start / repeat Start condition :  A high to low transition on the SDA line while SCL is high.    description SDA High >> Low SCL High Stop condition :  A low to high transition on the SDA line while SCL is high. description SDA Low >> High SCL High Data packet :   Read data bit : read SDA bit value when a low to high transition on the SCL  description SDA [ Read ] SCL Low >> High Write data bit : write SDA bit value when a high to low transition on the SCL description SDA [ Write ] SCL Low >> High Address packet  : 7-bit address bit + R/W bit  + ack/nack  Data packet : 8-bit data + ack/nack  Register TWI Status Register