【STM32CUBEMX】 I2C Slave 實現

2020-12-25 電子工程世界網

背景

最近,在使用 STM32F030C8T6 做 I2C Slave 設備接口。在網上查了好多的資料,使用 STM32 硬體 I2C 的例程少之又少,對 STM32 硬體 I2C 的批判巨多,只能硬著頭皮,自己一步一步摸索。 

實際上,在這次硬體 I2C 調試之前,其實我已經通過 IO 模擬的方式實現了 I2C,但速率僅能實現 Standard-mode(up to 100 kbit/s)。對於 Fast-mode(up to 400 kbit/s),IO 模擬方式簡直是無能為力。同時,由於 IO 模擬 I2C 時並沒有充分的考慮架構,最終的實現結果是功能單一,客戶滿意度不好。


I2C 實現方式

經過多次糾結和考慮,我決定採用Dummy Write + Register 方式進行 I2C 通訊。這樣的好處,在於用戶使用方便,對於後續的功能增加或需求變化,對客戶接口完全無影響,只需要修改寄存器列表就 OK。這個也是參考了幾個 I2C接口的晶片決定的。


Dummy Write

Dummy Write 要求 Master 訪問 Slave 時,必須發送兩次的從機地址。同時對於 STM32 HAL 的 Slave Receive 或 Write ,都必須指定長度,因此,在 第一次寫操作中, Master 發送了 寄存器地址和寫入數據的長度。時序圖如下圖所示。 



程序源碼位於:https://github.com/CherryXiuHuaWoo/STM32F030C8-IIC-Slave 。


記錄各種坑爹

第 1 次調試結果:總線掛了

第一次 Master Write 時,通訊完成。

第二次 Master Write 時,在 Address + Write 後, SDA 被置為 Low,導致總線被佔用,無法再繼續通訊。 



 


第 2 次調試結果:基本調通了 Write/Read

通過在每次地址中斷回調函數HAL_I2C_AddrCallback處理完成後,增加 HAL_I2C_EnableListen_IT(&hi2c1),不再出現第一次調試問題,可反覆通訊。 


  


Bug 分析: 

通過查看調用HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode) 的代碼部分。 

發現,在I2C_ITAddrCplt 函數中,在調用 HAL_I2C_AddrCallback 回調函數前,有調用 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT)把中斷關了!!!!!!之後也沒有恢復中斷,所以用戶必須自行把中斷打開!!!!!!


第 3 次調試:DUMMYWrite 後,總線掛了

這個總線掛了是我還沒有編寫DuMMYWrite後的處理代碼所導致。 



第 4 次調試:DUMMYWrtie 讀寫正常

讀時序: 



寫時序: 


關鍵字:STM32CUBEMX  I2C  Slave 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040243678.html 本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站採用的非本站原創文章及圖片等內容無法一一聯繫確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速採取適當措施,避免給雙方造成不必要的經濟損失。

推薦閱讀

STM32CubeMX學習--(4)CAN使用

CUBE配置CAN參數配置配置引腳PD0 PD1為CAN功能。在Connectivity->CAN1中勾選Master Mode。在ParameterSettings中配置:NVIC Settings中勾選RX0中斷在NVIC中配置CAN1中斷組為2 2修改代碼添加bsp_can.c文件,代碼如下:#include "bsp_can.h" #include "main.h"#define CAN1FIFO CAN_RX_FIFO0#define CAN1FIF1 CAN_RX_FIFO1CAN_TxHeaderTypeDef TxMeg;CAN_RxHeaderTypeDef

發表於 2020-05-14

STM32CubeMX學習--(5)SPI讀寫W25Q128

BSP_W25Qx_WriteEnable(void){ uint8_t cmd[] = {WRITE_ENABLE_CMD}; uint32_t tickstart = HAL_GetTick(); /*Select the FLASH: Chip Select low */ W25Qx_Enable(); /* Send the read ID command */ HAL_SPI_Transmit(&hspi1, cmd, 1, W25Qx_TIMEOUT_VALUE); /*Deselect the FLASH: Chip Select high */ W25Qx_Disable(); /* Wait the end of

發表於 2020-05-14

STM32CubeMX學習--(6)USB大容量存儲設備

-------------------------------------------------------------*//* USER CODE BEGIN PV *//* Private variables ---------------------------------------------------------*//* USER CODE END PV *//** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY  * @brief Usb device.  * @{  *//** @defgroup USBD_STORAGE  * @brief Usb mass storage device module  * @{  *//** @defgroup

發表於 2020-05-14

STM32CubeMx開發之路—3發送USART數據和printf重定向

運行環境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15簡介本例程主要講解如何通過串口發送數據和重定向printfSTM32CubeMx基本配置基礎配置過程請參考 STM32CubeMx(Keil5)開發之路—1配置第一個項目STM32CubeMx USART1配置1——點擊USART1進行設置2——模式選擇Asynchronous異步傳輸3——可以看到右邊自動出現了Tx和Rx4——可以自行設置波特率,停止位,校驗位等參數代碼修改1——選擇main.c文件2——在USER CODE中添加如下代碼,重定向printfint fputc(int ch

發表於 2020-05-13

使用stm32cubemx的usb-host-cdc庫驅動EC20模塊

開發環境:開發板:正點原子F407探索者代碼生成工具:STM32CubeMX v5.4.0IDE: eclipse + ac6工具鏈實現功能:單片機可以通過usb接口和EC20的AT指令虛擬串口通訊。為了方便測試,配置串口2,將 模塊->單片機 方向的數據通過串口2發送到電腦,將電腦通過串口工具發送到單片機的數據,轉發給模塊。開始1、使用STM32CubeMX配置工程,生成基礎代碼1.1.1 配置晶振1.1.2 配置時鐘1.2.1 配置串口21.2.2 配置DMA1.2.3 開串口中斷1.3.1 配置USB Host_Only,不使用VBUS SOF1.3.2 在Middleware中選擇USB_HOST將Class for

發表於 2020-05-13

STM32CubeMx學習之-NVIC

NVIC(嵌套向量中斷控制器)NVIC就是控制中斷響應的。主要由三個參數,一個是中斷使能,一個是搶佔優先級,還有一個就是響應優先級。(優先級數值越小,優先級別越高)中斷使能:很好理解,就是是否開啟中斷,如果開啟中斷,則滿足中斷觸發條件時程序會跳到中斷服務程序運行,否則不響應中斷主程序繼續運行。搶佔優先級:是用來判斷一個中斷是否可以打斷另外一個中斷的中斷服務程序搶先運行。例如A中斷觸發,正在運行A中斷的服務程序,此時B中斷也觸發,如果B中斷的搶佔優先級比A的高,則程序會打斷A的中斷服務程序,去運行B的中斷服務程序,即中斷嵌套。等B的中斷服務程序運行完後繼續運行A的中斷服務程序。如果B的搶佔優先級沒有高過A的搶佔優先級,則程序不會打斷A

發表於 2020-05-13

相關焦點

  • 如何利用STM32CubeMX來自動生成STM32代碼
    」,這個 3.5 版本的固件庫到現在為止還是開發 STM32F1 系列單片機的首選。  STM32CubeMX 軟體是運行於 JRE 上面的軟體,因此我們在安裝 STM32CubeMX 這個軟體之前,現需要安裝 JRE。
  • STM32CubeMX升級至V5.2.0,STM32G4即將推出,STM32CubeIDE正式面世
    官網網址: www.st.com/stm32cubemx 這次STM32CubeMX其實是與STM32CubeIDE配合進行升級,下面重點講講STM32CubeIDE 2STM32CubeIDE第一版 今天,學習STM32的人,大不多都應該聽說了這個STM32CubeIDE工具。
  • STM32CubeMx入門教程(7) I2C的讀寫應用
    這兩個函數的實現採用HAL庫的這兩個函數:1)HALStatusTypeDef HALI2CMemWrite(I2CHandleTypeDef *hi2c, uint16t DevAddress, uint16t MemAddress, uint16t MemAddSize, uint8t *pData, uint16t Size, uint32_t Timeout);參數依次是
  • STM32CubeMX使用方法及功能介紹
    Ⅰ、寫在前面學習本文之前可以查看我前面的文章:STM32CubeMX介紹、下載與安裝主要講述STM32CubeMX菜單及相關功能,簡單講述一下新建工程,後面結合實際例子講述新建工程配置的具體細節。快捷按鈕欄和上面菜單欄一樣,打開軟體時和新建工程後存在差異,新建工程後增加一些快捷按鈕。 菜單每一個選項在下面章節(新建工程後)單獨講述。
  • stm32CubeMx CAN 發送數據
    平臺  STM32F429軟體  STM32CubeMx 5.0.0固件庫  STM32Cube_FW_F4_V1.23.0 目的: 實現 CAN 的發送 一  簡介  CAN是控制器區域網路(Controller Area Network, CAN)的簡稱,是由研發和生產汽車電子產品著稱的德國
  • RT-Thread I2C總線設備學習筆記
    這兩個功能之前我們都有在Keil MDK上結合stm32cubeMX實現過基於小熊派光強傳感器BH1750實踐(multi_timer+狀態機工程應用)基於小熊派光強傳感器BH1750狀態機驅動項目升級(帶LCD屏顯示)基於小熊派光強傳感器BH1750狀態機驅動項目再度升級(帶上位機曲線顯示)很多東西都已經有了
  • STM32F10x_硬體I2C讀寫EEPROM(標準外設庫版本)
    筆者提供的實例工程都是在板子上經過多次測試並沒有問題才上傳至360雲盤,歡迎下載測試、參照學習。 提供下載的軟體工程是基於Keil(MDK-ARM) V5版本、STM32F103ZE晶片,但F1其他型號也適用(適用F1其他型號: 關注微信,回復「修改型號」)。
  • 基於I2C總線性能問答集錦
    [答:Alex] CAN總線通過複雜的傳輸協議可以實現很高容錯性能,所以多用於對數據準確要求很高的場合,比如汽車,機械等領域,但是其速度很低,協議複雜。而I2C總線協議實現非常的簡單,速度更高,但是沒有提供如CAN那樣複雜的糾錯和檢測機制。所以綜合而言,CAN複雜,但是容錯度高,速度低。
  • 如何實現STM32F407單片機的ADC轉換
    用到的引腳是PA3也就是ADC1的通道3 1、ADC的主要參數 a、解析度----stm32f407的解析度有6位、8位、10位、12位,參考電壓如果是3.3 那麼最小解析度就是3.3/4095。 b、轉換時間----stm32f407的最高允許頻率是36M,最快轉換時間 = 3+12個周期 =0.71us。
  • STM32F103C8T6引腳功能分布
    0x08002800UL   大小:45K——0xB400——STM32的內置flash升級信息表:0x720000UL   大小:8K——0x2000——外置flash 發表於 2020-12-06 提高stm32f103c8t6
  • 關於STM32G0將會在今年爆發嗎?
    所以,在使用STM32F0、F1開發產品的軟硬體工程師,且你們公司對產品成本比較敏感,接下來有必要了解一下STM32G0,有可能它會給你公司帶來更大利潤。 2 介紹STM32G0 這裡我也列出一些知識要點,方便部分沒有了解過STM32G0的朋友。
  • 基於STM32F7通過cube軟體配置:讀寫QSPI接口64M flash和64M PSRAM參考教程
    32cubemx打開程序請使用keil5 MDK打開 NUCLEO-F767ZI2、 STM32CUBEMX的配置。(1) 晶片的選擇:選擇和板上同款的晶片型號(STM32F767ZI)對flash的操作過程,就是利用QSPI接口,往NM25Q64EB發送不同的指令碼,來實現不同的功能。基礎的功能包括:進入QPI,退出QPI,讀取ID,擦除,讀,寫等。接下來,我們舉幾個有特徵的指令進行說明。
  • 關於stm32f1ox.h頭文件啟動代碼與編譯器裡的宏定義
    今天調試stm32f107vc發現他的外部時鐘竟是25M,和之前的stm32f103rbt6的8M晶振有所區別。在此總結一下自己的發現。stm32f107vc屬於互聯性器件,他的啟動文件應該是.cl。
  • stm32CubeIDE如何修改文檔編碼,來解決文本注釋亂碼問題
    和stm32h743系列mcu還是沒有處理好通信問題.於是今天先不講技術問題了,說一個關於如何修改文檔編碼的小方法吧.02背景當您的項目是用keil5開發的,然後想用stm32cubeIDE打開或者再keil5
  • 「STM32CubeMonitor」 拍了拍你
    還有圖形化功耗測量軟體STM32CubeMonitor-Power, STM32WB FR性能測試軟體STM32CubeMonitor-RF等。設計模式下,最左邊一欄列出了所有當前可用的節點,我們可以通過拖拽不同的節點來創建或者編輯不同的邏輯數據流(Flow),來實現想要的功能。比如將要檢測的變量通過點線圖進行實時顯示,或者通過一個按鈕來控制某個GPIO口的狀態等。設計模式下最右邊一欄可以看到當前選中節點的使用說明和程序運行的調試信息等內容。
  • STM32啟動文件初探之startup_stm32f10x_hd.s(Reset_Handler函數)
    該文件主要實現目的:設置初始SP設置初始PC=Reset_Handler設置向量表入口地址,並初始化向量表調用SystemInit,把系統時鐘配製成72M,SystemInit在庫文件system_stm32f10.c定義調轉到標號_main,最終來到C程序文件
  • Linux驅動之I2C總線
    明確:struct i2c_board_info的分配,初始化和註冊三個步驟必須在平臺代碼中完成,不能以模塊加載的形式來實現! 對struct i2c_board_info的操作本質就是間接的在操作i2c_client。
  • STM32F429的定時器的使用方法
    用固件庫可以少一些錯誤,畢竟我們是做應用的,首先要學會使用CPU來實現我們要的功能。工程目錄如下:這裡使用最新的Keil MDK V5.17版本的,STM32F4XX的器件庫等還需要進一步下載。這裡使用的是自帶的ST-Link下載程序,當然使用Jlink也是可以的。
  • STM32F103單片機RTC結合time.h使用
    在使用stm32f103系列單片機的時候總是會碰到RTC計時的問題,103系列單片機的RTC使用的是秒計時在經過一段時間的研究,終於發現了一種比較簡單而且易於理解的使用方法,就是結合系統文件time.h的使用 首先要添加頭文件 #include  RTC的初始化和普通方式無區別
  • STM32開發筆記3: STM32F407定時器2-5的使用方法
    單片機型號:STM32F407    STM32F4有多種定時器,其中TIM2-TIM5稱為通用定時器,具有相似的軟體設置及使用方法。在這裡還需要注意的是TIM3和TIM4為16位定時器,TIM2和TIM5為32位定時器。