communication protocol

STM32 I2C Slave (HALL Lib)

前言 這邊因有I2C slave需求,但因之前使用的LL寫法在舊款MCU中部份Lib是沒有的,因此這邊只能使用HALL Lib撰寫,但HALL Lib限制就是不指定長度接收寫法相對複雜很多,這邊因使用情境式類似sensor 方式,因次HALL Lib是相對足夠的 STM32CubeMX Setup 這邊沒有麼特別的,只有跟LL Lib相同需要留意Slave address不能為0x00另外中斷部分需要開啟,包含ERROR部分因為Slave傳輸資料時候會使用到 Sample Code (HALL Lib) 這邊需要注意是中斷在主程式中是需要被開啟的這個Function是會常使用到的 這邊會宣告一個陣列去接要發送的data 另外他的Call Back也會使用到 首先要先針對Address 的Callback這邊會判讀收還是發,但這邊不管是收data還是發data都一開始都會先進到I2C_DIRECTION_TRANSMIT判讀這邊可以撰寫第一筆資訊去區分是要做哪個動作也就是RxData[0],其中參考網路範例他第一筆data是用來判讀發送data的第幾個位置這邊可以依據需求修改或刪除 傳輸資料的CallBack比較簡單,這邊只要留意是I2C_NEXT_FRAME,這邊實際去量測會發現最後一筆都是NACK但不影響Master判讀 因為傳輸最後一筆會NACK所以這邊會進到ERROR CallBack這邊主要2個ERROR要注意一個是AF和BERR,其中進到ERROR後藥劑的再把中斷開啟 結論 這邊會依照不同需求可以選用LL或HAL去撰寫I2C Slave code,HAL Lib比較麻煩的地方在於接收部定長度資料部分,會很容易卡住假如不知道傳輸資料長度,會比較建議使用LL Lib方式撰寫,但如果是依據sensor方式讀取這邊HAL其實會比較直覺化,另外一個小要點就是在傳資料與接收資料地方不要寫其他動作會延遲訊號傳輸,容易導致傳輸失敗或訊號判讀錯誤另外我非常推薦下面參考部分的影片她非常好的講述流程 參考

STM32 I2C Slave (HALL Lib) Read More »

STM32 FDCAN Introduction difference CAN lib

前言 FDCAN(Flexible Data-Rate CAN)是CAN的升級版。特點包括 FDCAN格式 CAN-FD 與 CAN 2.0 的幀架構比較 在標識符之後,CAN 2.0 和 CAN-FD 有一個不同的操作: CAN-FD 與 CAN 2.0 之間的主要差異 STM32CubeMX Setting 這邊可以參考網路上H7的設定選項,使用G4或G0會缺少Messge Ram分配這區塊設定,其他部分雷同 FDCAN傳輸參考程式 這邊可以參考輸出如下 讀取如下 參考

STM32 FDCAN Introduction difference CAN lib Read More »

QSPI Flash(Quad Serial Peripheral Interface)

QSPI介面簡介 QSPI是Queued SPI的簡寫,是Motorola公司推出的SPI介面的擴充套件,比SPI應用更加廣泛。在SPI協議的基礎上,Motorola公司對其功能進行了增強,增加了佇列傳輸機制,推出了佇列序列外圍介面協議(即QSPI協議)。這邊針對QSPI是針對SPI FLASH儲存器做解說。 QSPI的使用(Flash) QSPI 使用 6 個I/O連接Flash,分别是四個數據BK1_IO0~BK1_IO3,一個CLK,選輸出(低電壓有效)BK1_nCS,作用介紹如下: BK1_nCS:選輸出(低電壓有效),適用於 FLASH 1。如果 QSPI 始终在雙閃存模式下工作,則其也可用於 FLASH 2從設備選擇信号線。QSPI通訊以BK1_nCS線置低電壓為開始信號,以BK1_nCS線被拉高作為结束信號。 CLK:時脈輸出,適用個2個存储器,用於通訊數據同步。它由通訊主機產生,决定了通訊的速率,不同的設備支持的最高時脈頻率不一樣,如STM32的QSPI时時脈頻率最大為fpclk/2,2個設備之間通訊時,通訊速率受限於低速設備。 BK1_IO0:在雙線 / 四線模式中為雙向 IO,單線模式中為串行輸出,適用於FLASH 1。 BK1_IO1:在雙線 / 四線模式中為雙向 IO,單縣模式中為串行輸入,適用於FLASH 1。 BK1_IO2:四線模式中為雙向 IO,適用於 FLASH 1。 BK1_IO3:四線模式中為雙向 IO,適用於 FLASH 1。 QSPI 命令序列 1. 指令階段 將在 QUADSPI_CCR[7:0] 寄存器的 INSTRUCTION 字段中配置的一條8 bit指令發送到 Flash,指定待執行操作的類型。儘管大多數 Flash 從 IO0/SO 信號(單線 SPI 模式)只能以一次 1 bit的方式接收指令,但指令階段可選擇一次發送 2 bit(在雙線 SPI 模式中通過 IO0/IO1)或一次發送 4 bit(在四線SPI 模式中通過IO0/IO1/IO2/IO3)。這可通過 QUADSPI_CCR[9:8] 寄存器中的 IMODE[1:0]字段進行配置。若 IMODE = 00,則跳過指令階段,命令序列從地址階段(如果存在)開始。 2. 地址階段 在地址階段,將1-4字節發送到Flash,指示操作地址。待發送的地址字節數在QUADSPI_CCR[13:12]寄存器的ADSIZE[1:0]字段中進行配置。在間接模式和自動輪尋模式下,待發送的地址字節在QUADSPI_AR寄存器的ADDRESS[31:0]中指定在内存映射模式下,則通過 AHB(來自於 Cortex ® 或 DMA)直接给出地址。地址階段可一次發送1 位(在單線SPI模式中通過SO)、2位(在雙線SPI模式中通過IO0/IO1)或4位(在四線 SPI 模式中通過 IO0/IO1/IO2/IO3)。這可通過QUADSPI_CCR[11:10]寄存器中的ADMODE[1:0]字段進行配置。若 ADMODE = 00,則跳過地址階段,命令序列直接进入下一階段(如果存在)。 2. 交替字節階段 在交替字節階段,將 1-4 字節發送到 Flash,一般用於控制操作模式。待發送的交替字節數在 QUADSPI_CCR[17:16] 寄存器的 ABSIZE[1:0] 字段中进行配置。待發送的字節在QUADSPI_ABR 寄存器中指定。交替字節數段可一次發送 1 位(在單線 SPI 模式中通過 SO)、2 位(在雙線 SPI 模式中通過 IO0/IO1)或 4 位(在四線SPI 模式中通過 IO0/IO1/IO2/IO3)。這可通過QUADSPI_CCR[15:14] 寄存器中的 ABMODE[1:0] 字段進行配置。若 ABMODE = 00,則跳過交替字節階段,命令序列直接進入下一階段(如果存在)。交替字節階段存在僅需發送單個半字節而不是一個全字節的情况,比如採用雙線模式並且僅使用兩個周期發送交替字節時。在這種情况下,固件可採用四線模式 (ABMODE = 11) 並發送一个字節,方法是 ALTERNATE 的位 7 和 3 置“1”(IO3 保持高電位)且位 6 和 2 置“0”(IO2 線保持低電位)。此時,半字節的高 2 位存放在 ALTERNATE 的位 4:3,低 2位存放在位 1 和 0 中。例如,如果半字節 2 (0010) 通过 IO0/IO1 發送,則 ALTERNATE 應設置為 0x8A (1000_1010)。 3. 空指令周期階段 在空指令周期階段,给定的 1-31 个周期内不發送或接收任何數據,目的是當採用更高的CLK頻率時,给 Flash 留出準備數據階段的時間。這一階段中给定的周期數在QUADSPI_CCR[22:18] 寄存器的 DCYC[4:0] 字段中指定。在 SDR 和 DDR 模式下,持續時間被指定为一定個數的全時鐘周期。若 DCYC 為零,則跳過空指令周期階段,命令序列直接進入數據階段(如果存在)。空指令周期階段的操作模式由 DMODE 確定。為確保數據信號從輸出模式轉變為輸入模式有足夠的“周轉”時間,使用雙線和四線模式從Flash 接收數據時,至少需要指定一个空指令周期。 4. 數據階段 在數據階段,可從Flash 接收或向其發送任意數量的字節。在間接模式和自動輪詢模式下,待發送/接收的字節數在 QUADSPI_DLR 寄存器中指定。在間接寫入模式下,發送到 Flash 的數據必須寫入 QUADSPI_DR 寄存器。在間皆讀取模式下,通過讀取 QUADSPI_DR 寄存器獲得從 Flash 接收的數據。在内存映射模式下,讀取的數據通過 AHB 直接發送回 Cortex 或 DMA。數據階段可一次發送/接收 1 位(在單線 SPI 模式中通過 SO)、2 位(在雙線 SPI 模式中通過 IO0/IO1)或 4 位(在四線 SPI 模式中通過 IO0/IO1/IO2/IO3)。這可通過QUADSPI_CCR[15:14] 寄存器中的 ABMODE[1:0] 字段進行配置。若 DMODE

QSPI Flash(Quad Serial Peripheral Interface) Read More »

I2C Slave mode on STM32 Introduction

前言 I2C有2種不同模式可以操作使用master 與 slave模式,大部分在操控sensor MCU都是以master模式去做操控,部分EEPROM會需要搭配MCU作為slave操作,但當slave HAL會需要已知長度才能正常work,這邊會特別介紹LL模式修正不特定長度 STM32CubeMX Setting Stm32cubeMX上的設定Master與Slave基本上沒有太大差異,唯一要注意的是slave address不能為0x00 至於為甚麼Slave address為什麼不能為0目前猜測可能為下ST I2C slave addr 是用AND GATE,來跟OAR1作比對相同就成立中斷,而設定成0X00會造成永遠不中斷 STM32CubeIDE(HAL) 這邊(HAL)slave會用到函數如下 這邊用HAL_I2C_Slave_Receive做簡單示範一般會搭配中斷做撰寫 另外針對中段部分會使用到callback(HAL_I2C_SlaveTxCpltCallback()/HAL_I2C_SlaveRxCpltCallback()) STM32CubeMX(LL) Setting 這邊因為要編輯底層所以不選用HAL在設定上有以下2個地方的不同 把I2C修改成LL編輯 把.c/.h檔案分離出來方便單獨編輯 STM32CubeIDE(LL) 首先要開啟中斷並在中斷stm32g0xx_it.c後面_it.c內找到void I2C1_IRQHandler(void)編輯中斷要執行的事情,基本上會用到的是中斷flag判讀等等範例如下 注意事項 在執行中斷程式時要注意必須把I2C中斷打開與使用前建議會讓他重新開起reset確保訊號正常,其範例如下 參考 How to create an I2C slave device using the STM32Cube Library I2C: Inter-Integrated Circuit 【STM32CUBEMX】 I2C Slave 实现 STM32 I2C multi-device connection

I2C Slave mode on STM32 Introduction Read More »

Pull-up Resistors For I2C Bus

前言 I2C Bus 和 SPI 一樣也是主從式架構, 不過它不同於 SPI 的點對點或點對多點結構, 它是以匯流排型式介接, 同時匯流排上允許有多個 master (主設備) 和多個 slave 。I2C Bus其中最重要的是其外加電阻,但外加電阻需要加多少?這個問題是許多人的疑問,我不加或亂加會怎樣?這邊會一一解答這些問題並說明計算方式,讓閱讀完後能清楚明白我需要多少速度的傳輸需要搭配多少電阻 I2C Bus 結構 上圖中除了一對提升電阻 Rp 之外, 還有每個 I2C 設備依現況的需要可選擇加裝一對抗干擾用的電阻 Rs (尤其是當 SDA, SCL 的佈線繞經特殊干擾源時).應用 I2C 時, 最麻煩的是計算 Rp 的阻值, 及為各個晶片選擇合適的 Rs 阻值Rs 需要依照各個晶片實際受干擾的情況選擇, 但阻值一般會限制在 ≦ Rp/10 (或約 330 Ohm). 因為一但 Rs 不為 0, 晶片真正的 Rp(Total) 會變成是 Rp+Rs, 選擇太大的 Rs 會使得 Rp(Total) 偏離 Rp太多, 影響該晶片的運作. Rp 一般為 2K~7K Ohm,  深入探討I2C

Pull-up Resistors For I2C Bus Read More »

Shopping Cart