日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I2C读取IST8310

發布時間:2024/3/26 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I2C读取IST8310 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • I2C簡介
    • I2C傳輸過程
    • I2C仲裁
    • IST8310磁力計
    • Cube配置
    • 相關函數
      • HAL_I2C_Mem_Read函數
      • HAL_I2C_Mem_Write函數
      • IST8310的初始化
    • 程序流程
    • 代碼編寫

I2C簡介

  • 2C是一種半雙工雙向二線制的同步串行總線。

  • I2C只有兩根信號線,一根數據線SDC,一根時鐘線SCL。

  • 一般情況下,數據線SDA和時鐘線SCL都是處于上拉電阻狀態(因為在總線空閑狀態時,這兩根線一般被上面所接的上拉電阻拉高,保持著高電平)。

  • 當IIC總線的數據線SDA和時鐘線SCL兩條信號線同時處于高電平時,規定為總線的空閑狀態。

  • I2C允許掛載多個主設備(支持多主控),但總線時鐘只能由一個主設備產生。

  • 對于并聯在一條總線上的每個IC都有唯一的地址。

  • 在硬件上有I2C,也可以使用軟件的方式進行模擬(由于硬件I2C比較復雜且不穩定,所以我們一般使用軟件的方式進行模擬)

  • I2C通信的信號:

    • S:開始信號,當SCL處于高電平時,SDC從高電平拉低至低電平,代表數據傳輸的開始
    • P:結束信號,當SCL處于高電平時,SDC從低電平拉高至高電平,代表數據傳輸的結束

  • 數據信號:數據信號每次傳輸8位數據,每一位數據都在一個時鐘周期內傳遞(當SCL處于高電平時,SDC數據線上的電平需要穩定;當SCL處于低電平時,SDC數據線上的電平才能夠改變)
  • ACK/NACK:應答信號(每個應答由主機產生),是主機發送的8bit數據,從機對主機發送低電平,表示已經接收數據(應答信號為低電平時,規定為有效應答位(ACK,簡稱應答位),表示接收器已經成功地接收了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。)
  • 發送ACK的條件:接收器在第9個時鐘脈沖之前的低電平期間將數據線SDA拉低,并且確保在該時鐘的高電平期間為穩定的低電平。

I2C傳輸過程

I2C在進行數據傳輸時,當時鐘信號為高電平期間,SDA上的數據必須保持穩定;只有時鐘信號為低電平期間,SDA上的高低電平狀態才能改變(數據在時鐘線SCL的上升沿到來之前就需準備好。并在在下降沿到來之前必須穩定)。

在I2C傳送的每一位數據都有一個時鐘脈沖與之相對應(在SCL串行時鐘的配合下,在SDC上逐位地傳送,每一位數據,數據位的傳輸是邊沿觸發)



  • I2C總線上每個設備都可以作為主設備或者從設備,而且每一個設備都會對應一個唯一的地址,主從設備之間就通過這個地址來確定與哪個器件進行通信
  • 主設備在傳輸有效數據之前要先指定從設備的地址大多數設備的地址是7位的,協議規定給7位地址再添加一個表示數據傳輸方向的最低位(0表示主設備向從設備寫數據,1表示主設備向從設備讀數據)

主設備向從設備寫數據:

  • 淡藍色部分表示數據由主機向從機傳送,粉紅色部分則表示數據由從機向主機傳送。(寫用0來表示,為高電平;讀用1來表示,為低電平)

主設備從從設備中讀數據:

I2C仲裁

  • 在多主的通信系統中,總線上有多個節點,它們都有自己的尋址地址,可以作為從節點被別的節點訪問,同時它們都可以作為主節點向其它的節點發送控制字節和傳送數據。
  • 但是如果有兩個或兩個以上的節點都向總線上發送啟動信號并開始傳送數據,這樣就形成了沖突。
  • 要解決這種沖突,就要進行仲裁的判決,這就是I2C總線上的仲裁。

IST8310磁力計

磁力計是一種測量地球磁場強度的傳感器,又名電子羅盤,可用于計算機器人的朝向。

IST8310是一款由ISentek公司推出的3軸磁場傳感器,支持快速I2C通信,可達400kHz,14位磁場數據,測量范圍可達1600uT(x,y-axis)和2500uT(z-axis),最高200Hz輸出頻率。

使用IST8310磁力計可以檢測地磁場強度,用于計算磁場角度。

IST8310的GPIO管腳各個功能及對應的MCU管腳如下表所示:

管腳功能MCU管腳
SCLI2C的時鐘線PA8
SDCI2C的數據線PC9
RSTNIST8310的RESET,低電平重啟IST8310PG6
DRDYIST8310的數據準備(data ready)PG3

Cube配置

PG3配置外部中斷,下降沿觸發

PG6配置成GPIO的輸出模式,上拉模式

I2C3配置成快速模式,通信頻率設置為400k,I2C地址配置成7位

對應引腳為PA8和PC9



這樣就完成了Cube配置。

相關函數

HAL_I2C_Mem_Read函數

格式:

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef*hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t*pData, uint16_t Size, uint32_t Timeout) 函數名HAL_I2C_Mem_Read
作用從I2C設備的寄存器讀取數據
返回值HAL狀態
參數1:hi2cI2C句柄
參數2:DevAddressI2C從機地址
參數3:MemAddress寄存器地址
參數4:MemAddSize寄存器地址增加大小
I2C_MEMADD_SIZE_8BIT:增加八位
I2C_MEMADD_SIZE_16BIT:增加十六位
參數5:pData數據指針
參數6:Size數據長度
參數7:Timeout超時時間

HAL_I2C_Mem_Write函數

格式:

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef*hi2c, uint16_t DevAddress, uint16_tMemAddress, uint16_t MemAddSize, uint8_t*pData, uint16_t Size, uint32_t Timeout) 函數名HAL_I2C_Mem_Write
作用往I2C設備的寄存器寫入數據
返回值HAL狀態
參數1:hi2cI2C句柄
參數2:DevAddressI2C從機地址
參數3:MemAddress寄存器地址
參數4:MemAddSize寄存器地址增加大小
I2C_MEMADD_SIZE_8BIT:增加八位
I2C_MEMADD_SIZE_16BIT:增加十六位
參數5:pData數據指針
參數6:Size數據長度
參數7:Timeout超時時間

IST8310的初始化

步驟語句功能
1. 初始化GPIO和通信ist8310_GPIO_init();
ist8310_com_init();
初始化管腳和I2C通信接口,保證正常通信。
2. 重啟設備ist8310_RST_L();
ist8310_delay_ms(sleepTime);
ist8310_RST_H();
ist8310_delay_ms(sleepTime);
通過IST8310重啟管腳進行重啟。
3. 驗證設備ID通過讀取WHO_AM_I寄存器判斷判斷IST8310通信是否正常
4. 配置IST8310的四個寄存器0x0B:中斷寄存器,配置成開啟中斷,中斷時為低電平;
0x41:采樣次數寄存器,配置成x,y,z均是2次采樣
0x42:需要配置成0xC0;
0x0A:配置成200Hz輸出頻率

程序流程

程序開始先進行HAL庫自帶的初始化,包括時鐘,GPIO,I2C3的初始化;之后完成配置IST8310,IST8310的DRDY引腳會產生200Hz的周期信號;當DRDY下降沿,會引起單片機的下降沿外部中斷;在外部中斷回調函數中,調用ist8310的讀取函數,便可以讀取磁場數據。

代碼編寫

首先調用官方封裝好的I2C讀寫函數,以及初始化函數,讀取磁場數據函數

/* USER CODE BEGIN Includes */ #include "ist8310driver_middleware.h" //官方提供I2C 讀寫函數的文件 #include "ist8310driver.h" //官方提供初始化函數,讀取磁場數據函數 /* USER CODE END Includes */

然后進行GPIO初始化,I2C3初始化,IST8310初始化

/* Initialize all configured peripherals */MX_GPIO_Init(); //GPIO初始化MX_I2C3_Init(); //I2C3初始化/* USER CODE BEGIN 2 */ist8310_init(); //IST8310初始化/* USER CODE END 2 */

當IST8310的DRDY引腳產生200Hz的周期信號時,使DRDY處于下降沿,會引起單片機的下降沿外部中斷;

然后在這個外部中斷回調函數中調用IST8310的讀取函數

/* USER CODE BEGIN 1 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //中斷回調函數{if (GPIO_Pin==IST8310_DRDY_Pin) //判斷是否為PG3的外部中斷{ist8310_read_mag(mag); //讀取磁場數據}}/* USER CODE END 1 */

總結

以上是生活随笔為你收集整理的I2C读取IST8310的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。