我又來了,這節我們講怎麼用 ESP32 的 I2C 外設並移植江科大的 OLED 代碼。
首先江科大的 OLED 代碼是軟體 I2C,這邊先說一下軟體 I2C 怎麼移植。
我們要動的文件主要就是 OLED.c 和 OLED_Font.h 兩個文件。
首先是 OLED.c,這個文件我們主要就是更改初始化 OLED_I2C_Init () 函數以及 OLED_W_SCL (x) 和 OLED_W_SDA (x) 兩個宏定義。
我們先導入 "driver/gpio.h" 標頭文件(上節忘記提了),根據 OLED_I2C_Init () 原本的初始化內容,初始化兩個引腳,一個 SCL 一個 SDA,都配置為開漏輸出上拉模式。
然後 OLED_W_SCL (x) 和 OLED_W_SDA (x) 兩個宏定義則由原來的 GPIO_WriteBit () 改為 gpio_set_level () ,這樣 OLED.c 就改好了。
最終效果如下:
然後我們要動 OLED_Font.h 文件,就是要把裡面的二維數組的每一組給加好大括號,不知道為什麼要這麼搞,但編譯器就是要你這麼做()
完成這些後代碼就移植完畢了,下面我來說一下 I2C 外設怎麼用。
首先 ESP-WROOM-32 有且僅有一個 I2C 外設,引腳定義圖如下:
也就是 22 號引腳為 SCL,21 號引腳為 SDA。
那麼怎麼配置 I2C 外設呢?
首先我們要配置 i2c_config_t 結構體,這個結構體包括下面這些參數:
I2C_CONFIG_ST.clk_flags
時鐘選擇
I2C_CONFIG_ST.master.clk_speed
時鐘速度
I2C_CONFIG_ST.mode
I2C模式(主機從機)
I2C_CONFIG_ST.scl_io_num
SCL引腳號碼
I2C_CONFIG_ST.scl_pullup_en
是否使用SCL引腳內部上拉
I2C_CONFIG_ST.sda_io_num
SDA引腳號碼
I2C_CONFIG_ST.sda_pullup_en
是否使用SDA引腳內部上拉
配置好結構體後調用 i2c_param_config () 函數初始化 I2C。
然後我們調用 i2c_driver_install () 安裝 I2C 驅動。
接著我們調用 i2c_cmd_link_create () 創建 I2C 指令緩存區,並用一個 i2c_cmd_handle_t 變量儲存句柄。
然後我們用 i2c_master_start () 開始 I2C,用 i2c_master_write_byte () 和 i2c_master_read_byte () 進行讀和寫。
最後我們用 i2c_master_stop () 結束 I2C,用 i2c_master_cmd_begin () 把緩存區的指令發送出去,然後 i2c_cmd_link_delete () 清除緩存區。
這就是 I2C 外設使用的全流程,是舊版本寫法,新版本已經廢棄,不過因為新版寫法死活用不了,所以我最後還是用舊版。
下面是實際代碼:
仍然是在江科大源碼基礎上改的,把軟體部分修改成硬體。
下面是最終效果:
那麼今天就到這裡,886。