久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8644|回復: 1
收起左側

【NUCLEO-L476RG開發】硬件I2C

[復制鏈接]
ID:127084 發表于 2016-6-17 15:27 | 顯示全部樓層 |閱讀模式
NUCLEO-L476RG到手一段時間了,今天來測試一下硬件I2C的操作,聽說很多BUG,試一試看如何。

準備用I2C來訪問AT24C02 EEPROM,將數據寫入到EEPROM中,然后再讀取出來,驗證讀寫操作的正確性。

硬件平臺如下


NUCLEO-L476RG

162307bzoojnw6fflnouob.png

前段時間FSL的KL02Z套裝,上面的MINIDOCK擴展板上恰好有AT24C02,所以借過來用一下,FSL不要生氣啊

162303id22yx1yxz1d2qyi.png

標準的ARDUINO接口,放到哪都行。合體照。

162310jkwumomm5oohmoat.png

硬件連接及原理圖

MINI DOCI上的AT24C02連接

163132q6vdfvdd3shh9srl.png

ARDUINO接口:SCL及SDA

163133i9ppcq5qqr7gbp9s.png

NUCLEO-L476RG上對應的接口

163132xxs5hsv4g0uv9vn5.jpg


寫程序之前,要了解硬件的基本特性,首先是STM32L476RG上I2C接口支持的特性;其次是AT24C02的特性。

STM32L476RG的I2C功能框圖如下

163800kzr7rxy1huwrmxkq.png

值得一提的是,L4的I2C有自己獨立的內核時鐘,可以在SYSCLK、PCLK及HSI中任選一種做為I2C的內核時鐘。另外L4的I2C支持三種不同的通信速率:100KHZ, 400KHZ,1MHZ。由于AT24C02只支持最高400KHZ,所以這里就選擇400KHZ做為內核時鐘。

創建I2C測試工程,建立過程略。幾點要注意的地方。

首先,本例程中使用的是I2C1,對應的SCL及SDA引腳為PB8及PB9,時鐘配置后SYSCLK為80MHZ。

I2C硬件配置參數如圖

172553y1ik084akkux0ung.png

速度有三種可選:標準,快速,快速加。另外針對不同的特定應用,可以選擇設置上升和下降沿的時間,以納秒為單位,范圍為0-120納秒之間。注意這個TIMING參數,是灰色的,CUBEMX自動計算并設置該值,不像以前的F0和F3系列,需要一個專門的工具來設置TIMING的值,夠麻煩的。

下面是使用HAL庫與EEPROM通信的主要代碼。

  1. /* USER CODE BEGIN PV */
  2. /* Private variables ---------------------------------------------------------*/
  3. #define EEPROM_ADDRESS        0xA0
  4. #define EEPROM_PAGESIZE        0x11
  5. #define EEPROM_TIMEOUT        1000

  6. extern I2C_HandleTypeDef hi2c1;

  7. char msg[] = "This is a test!";

  8. char buf[40];

  9. int16_t Remaining_Bytes;
  10. uint16_t Memory_Address;

  11. uint16_t len;

  12. ......

  13. //write msg to eeprom
  14. Remaining_Bytes = strlen(msg);
  15. Memory_Address = 0;
  16.         
  17. while(Remaining_Bytes > 0)
  18. {
  19.       if(HAL_I2C_Mem_Write_DMA(&hi2c1, EEPROM_ADDRESS, Memory_Address, I2C_MEMADD_SIZE_8BIT, (uint8_t *)(msg + Memory_Address), EEPROM_PAGESIZE) != HAL_OK)
  20.       {
  21.               Error_Handler();
  22.                         
  23.        }
  24.                
  25.        while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
  26.        {
  27.        }
  28.                
  29.        while (HAL_I2C_IsDeviceReady(&hi2c1, EEPROM_ADDRESS, 10, 300) == HAL_TIMEOUT);
  30.                
  31.        while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
  32.         {
  33.         }
  34.                
  35.          Remaining_Bytes -= EEPROM_PAGESIZE;
  36.                
  37.          Memory_Address += EEPROM_PAGESIZE;
  38.         }
  39.         
  40. //read msg to buff

  41.   if(HAL_I2C_Mem_Read_DMA(&hi2c1 , EEPROM_ADDRESS, 0, I2C_MEMADD_SIZE_8BIT, (uint8_t*)buf, strlen(msg))!= HAL_OK)
  42.   {
  43.     /* Reading process Error */
  44.     Error_Handler();        
  45.   }
  46.   
  47.   /* Wait for the end of the transfer */  
  48.   while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
  49.   {
  50.   }
復制代碼




根據STD庫中用戶的反饋,I2C出錯的原因主要由幾方面造成,一是ST設計的I2C接口,通信過程中一些狀態變量及標志位的設置非常嚴格,如果程序邏輯考慮不周全,會導致I2C停止工作,需要軟復位后才能繼續;另一方面,I2C接口在處理單個,雙字節及多字節傳輸過程中要分開考慮,進一步將問題復雜化了;還有就是結合具體的I2C設備,不同的時序要求,進一步復雜化了通信過程。

這些問題在HAL庫中都得到了很好的解決,為此,HAL庫中設計了幾種不同類型的API函數供調用。一類是通用的接收和發送函數,這類API函數將I2C接口視為類似于“流對象”,通信時從流對象中接收或發送數據;另一類則是類似于EEPROM之類的特殊存儲對象,從這些存儲對象中接收或發送數據時,都需要提供一個地址,以便準確定位。使用EEPROM來實驗時,我們使用的是第二類API函數。兩個主要的API函數原型及參數如下。

  1.     /**
  2.       * @brief  Transmit in master mode an amount of data in non-blocking mode with DMA
  3.       * @param  hi2c : Pointer to a I2C_HandleTypeDef structure that contains
  4.       *                the configuration information for the specified I2C.
  5.       * @param  DevAddress: Target device address
  6.       * @param  pData: Pointer to data buffer
  7.       * @param  Size: Amount of data to be sent
  8.       * @retval HAL status
  9.       */
  10.     HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
復制代碼


  1.     /**
  2.       * @brief  Reads an amount of data in non-blocking mode with DMA from a specific memory address.
  3.       * @param  hi2c : Pointer to a I2C_HandleTypeDef structure that contains
  4.       *                the configuration information for the specified I2C.
  5.       * @param  DevAddress: Target device address
  6.       * @param  MemAddress: Internal memory address
  7.       * @param  MemAddSize: Size of internal memory address
  8.       * @param  pData: Pointer to data buffer
  9.       * @param  Size: Amount of data to be read
  10.       * @retval HAL status
  11.       */
  12.     HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
復制代碼

關于這兩個函數的更詳細的調用方法及說明,請參考API文檔。

注意在具體操作EEPROM的時候,還要注意,EEPROM分字節讀寫及頁面讀寫兩種類型,對HAL API的調用還要進行適當的修改。

由于ST HAL API做了大量的后臺工作,上面的代碼看起來過于簡單了。但實際上API函數在后臺做了大量的工作,這不正是我們期待的么!

最后來看看運行結果。

UART打印的寫入及讀取取結果

200806jezn1nzhe6rr2ydx.png

邏輯分析儀LA

202321hmzpld5lhln2sm8m.png

I2C通信全程,LA分析結果

200832s528zs8ls8qk9wwp.png

開始通信,順序依次是開始信號,地址,EEPROM寫入地址,第一個數據字節

200848lycrh44rrg7hh47f.png

字符0x0D, 0x0A, 結束信號。

200900j41pomr3m8r3io12.png

接收開始,順序依次是開始信號,地址,EEPROM讀取地址,第一個數據字節

200912ezdn2srjrd2tbah3.png

讀取結束

200921bglxydazegs68a8g.png


0.png
附工程
eeprom.zip (3.17 MB, 下載次數: 28)
回復

使用道具 舉報

ID:194824 發表于 2019-7-31 17:47 | 顯示全部樓層
樓主用的哪家的邏輯分析儀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 玖玖玖av| 欧美 日韩 中文 | av在线播放网 | 中文字幕国产一区 | 日韩成人 | 日韩三级在线观看 | 欧美美女爱爱 | 一区二区三 | 亚洲精品视频一区 | 奇米在线| 成人国产免费观看 | 久草在线 | 999精品视频在线观看 | 免费成人高清在线视频 | 国产高清视频在线播放 | 日本成人免费观看 | 2023亚洲天堂 | 久久精品中文字幕 | 国产精品一区在线 | 亚洲一区二区三区四区视频 | 激情欧美一区二区三区中文字幕 | 午夜视频在线播放 | 国产精品99久久久久久久久久久久 | 九九久久精品视频 | 亚洲国产18 | 欧美一区二 | 九九综合 | 国产日韩欧美一区 | 亚洲精品视 | 久久久久久久亚洲精品 | 最新中文字幕在线 | 国产精品久久久久9999鸭 | 欧美一级免费看 | 国产在线拍偷自揄拍视频 | 日本a视频 | 久久高清 | 午夜影视 | 国产一区二区三区久久久久久久久 | 翔田千里一区二区 | 特黄色一级毛片 | 亚洲国产视频一区二区 |