【MCAL】TC397+EB-tresos之I2c配置實戰(同步、異步)

I2C總線是Philips公司在八十年代初推出的一種串行、半雙工的總線,主要用于近距離、低速的芯片之間的通信。本篇文章首先從理論講起,介紹了英飛凌TC3x系列芯片對應MCAL中對I2C驅動的定義與介紹,建議讀者在閱讀本篇文章之前對I2C有個簡單的認識,協議本身比較簡單,筆者就不在文章中贅述了。文章后邊主要介紹了I2c的EB配置,如果是異步則需要配置中斷和回調函數。文章的最后還是老樣子給讀者介紹了I2C驅動的調試代碼和測試結果,因為本系列是基于KIT_A2G_TC397XA_TFT開發板做的調試,所以就直接使用了開發板上接的MCP79411芯片來驗證I2C是否調通。PS:關于MCP79411芯片的一些I2C參數要求都源自其芯片手冊,文中就不截相關的圖了。

目錄

概述

依賴模塊?

I2C

SCU

Port

SRC

環境與目標

EB tresos配置

MCU

Port?

I2C?

General

I2cChannelconfiguration

IRQ

I2C驅動調試

測試代碼

測試結果


概述

MCAL實現的I2c驅動程序負責初始化I2c硬件模塊。它還提供將數據寫入從機并從從機讀取數據的服務,實現方式支持同步(數據傳輸不會發生中斷調用)和異步(數據將通過中斷調用傳輸)的讀寫操作模式。MCAL實現的I2c驅動程序不支持從機模式。
該驅動程序支持:

  • 主機模式
  • 標準模式數據傳輸速率高達100k bit/s(20k bit/s~100k bit/s)
  • 快速模式數據傳輸速率高達400k bit/s(100k bit/s~400k bit/s)
  • 7位I2c總線尋址

模塊軟硬件接口如下圖所示。

依賴模塊?

I2C

12C驅動程序使用的I2C硬件單元的關鍵特性有:

  • 主機模式
  • 標準模式數據傳輸速率高達100k bit/s(20k bit/s~100k bit/s)
  • 快速模式數據傳輸速率高達400k bit/s(100k bit/s~400k bit/s)
  • 7位I2c總線尋址
  • I2C時鐘的預分頻器(從0到255)
  • 通過分數除法器生成比特率

驅動使用的硬件事件包括(涉及的大寫標志位相關寄存的位域名稱):

  • 發送/接收完成時的TX_END標志。
  • 從發送模式切換到接收模式時的RX標志。
  • LSREQ_INT,SREQ_INT,LBREQ_INT,BREQ_INT標志,用于用確定的數據數填充FIFO。
  • 傳輸和接收過程中出現錯誤時的錯誤標志。

SCU

kernel_clk由來自fl2C的MCU驅動程序設置。內核時鐘對于保持l2C協議指定的比特率是必需的。
interface_clk直接連接到fSPB。interface_clk需要驅動FIFO、SFR和服務請求塊。

SCU模塊為所有外圍設備提供時鐘。MCU驅動程序負責時鐘樹的配置。

I2C驅動程序依賴于MCU驅動程序進行時鐘生成。fI2C定義了I2C核心的應用時鐘頻率。從PLL2(200MHZ)導出的fI2C獨立于fSPB,允許I2C以恒定的波特率(頻率)運行。此配置可以使用Tresos中MCU模塊中的Mcul2Cfrequency完成。頻率需要在MCU模塊配置參數McuClockRefSelection中簡歷對應引用,而McuClockRefSelection最終由Tresos中的I2C配置引用。

Port

I2C外圍設備的SCL、SDA引腳的方向和模式選擇由Port驅動器配置。PORT驅動程序配置整個微控制器的端口引腳。用戶必須在調用I2C初始化之前通過PORT配置引腳,并初始化端口引腳。
I2C驅動程序需要配置兩個引腳,SCL和SDA。SCL代表時鐘,SDA代表數據。由于I2C協議允許多主,因此需要將SDA配置為開漏以實現線與邏輯。

SRC

I2C可以在多種事件發生時觸發中斷,每種I2C模塊的中斷情況都不同。對于這些中斷,I2C驅動程序依賴于中斷路由器進行中斷傳遞。中斷路由器的任何功能塊都不由I2C驅動程序管理。中斷路由器完全由IRQ驅動程序管理。中斷優先級和服務類型(TOS)在IRQ 驅動程序中集中配置,從而避免了資源沖突。I2C模塊有三個中斷線:

  • Protocol Interrupt:這個中斷源有七種,分別是:發送結束、接收模式、仲裁丟失、沒有ACK、地址匹配、通用調用和主碼構成。服務請求線SRC_I2C0P被用作協議中斷。MCAL提供的中斷處理函數為I2c_IsrI2cProtocol,用作在讀取且地址已經發出的情況下,進行包括I2C_NO_ACK、I2C_ARBITRATION_LOST等協議狀態獲取,并回調對應通道的通知函數。
  • Error Interrupt:這個中斷有四個來源。這個中斷是由傳輸溢出、傳輸下溢、接收下溢。服務請求線SRC_I2C0ERR用于錯誤中斷。用戶必須確保在發生錯誤中斷時調用12c驅動程序提供的錯誤中斷服務例程。MCAL提供的錯誤中斷實現函數為I2c_IsrI2cError。
  • Data transfer Interrupt:這個中斷有四個來源。這個中斷由任何類型突發請求、上次突發請求、單次請求、上次單次請求生成。服務請求線SRC_I2C0DTR用于數據傳輸中斷。MCAL提供的中斷處理函數為I2c_IsrI2cDtr,它負責處理I2C數據的連續寫入和讀取。

環境與目標

本文使用的為英飛凌提供的開發板KIT_A2G_TC397XA_TFT,使用X102上排針的P15.4和P15.5作為I2C使用引腳。

在TC397 KIT開發板上,P15.4和P15.5,不僅從X102引出,還連接到了RTC MCP79411。

涉及的軟件如下:

  • EB-tresos:用于生成動態代碼,具體工程搭建參考《【AUTOSAR MCAL】MCAL基礎與EB tresos工程新建》。
  • HighTech:用于編譯生成elf文件,具體的工程搭建參考《【MCAL】HighTec集成TC3xx對應MCAL的Demo》。
  • UDE 5.2:用于下載和調試程序。

涉及的參考文檔如下表。

序號參考資料內容
1《Infineon-AURIX_TC39x-UserManual-v02_00-EN》英飛凌TC39x用戶手冊
2《Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf》英飛凌TC3xx用戶手冊
3《Infineon-AURIX_TC3xx_Part2-UserManual-v02_00-EN.pdf》英飛凌TC3xx用戶手冊
4《Infineon-TC39x-DataSheet-v01_00-EN》英飛凌TC39x數據手冊
5《ApplicationKitManual-TC3X7-ADAS-V21.pdf》開發板KIT_A2G_TC397XA_TFT說明
6《MC-ISAR_TC3xx_UM_I2c.pdf》英飛凌提供的TC3xx芯片I2C用戶手冊
7《DS22266A_CN》MCP79410/MCP79411/MCP79412芯片手冊

配置目標如下:

  1. 通過I2C同步/異步讀取MCP79411芯片中6字節長度的ID值。

EB tresos配置

MCU

配置fI2C的頻率。


Port?

上圖是Port口的配置信息,根據的是下圖芯片DataSheet信息。

注意SDA需要配置成開漏輸出。?


I2C?

General

跟其他的模塊差不多,都是包含了一些API使能,錯誤檢測以及時鐘選擇等。


I2cChannelconfiguration

我們需要關注的配置項包括:

  • I2cHwUnit:此參數選擇要分配給通道的硬件單元。
  • I2cSDASelect:該參數選擇SDA對應的引腳端口。
  • I2cSCLSelect:該參數選擇SCL對應的引腳端口。
  • I2CSpeed:定義了數據傳輸速度的模式信息,包括STANDARD_MODE、FAST_MODE、HIGH_SPEED_MODE。
  • I2cAddressingMode:這個參數定義了尋址模式(7/10位),需要尋址slave。
  • I2cFractionalDividerDec:該參數包含了小數分法器的DEC值。
  • I2cFractionalDividerInc:此參數包含了小數分發器的INC值。它跟I2cFractionalDividerDec、I2CSpeed共同決定了I2C的通信速率,下面是手冊中包含的計算方法。

  • I2cRmc:該參數包含CLC1寄存器的I2cRmc值。
  • I2cAsyncNotification?:是否啟用回調函數。
  • I2cPacketEndNotification:回調函數名。
  • I2cTxTimeOut:該參數包含寫操作的超時值。
  • I2cRxTimeOut:該參數包含讀操作的超時值。

IRQ

配置對應中斷優先級,打開相應中斷。


I2C驅動調試

測試代碼

測試代碼如下,可以看到它給MCP79411發送完I2C設備地址1010111(0x57)之后,在寫入了要讀取的EEPROM地址0xF2之后,然后再向同樣的設備地址發送讀取6字節ID數據。代碼分別實現了異步和同步I2C操作,通過條件編譯宏I2CASYENABLE區分。I2cDemoInit實現了I2C的初始化,異步的需要完成中斷的配置,I2C_DemoFunction完成使用I2C讀取MCP79411中設備的6字節ID數據(分為同步和異步),IoHwAb_I2cNotification0則是中斷的回調函數,若協議中斷的返回不是I2C_NO_ERR,則進入死循環。

void I2cDemoInit()
{
#if I2CASYENABLEIrqI2c_Init();SRC_I2C0DTR.B.SRE = 1;SRC_I2C0ERR.B.SRE = 1;SRC_I2C0P.B.SRE   = 1;
#endifI2c_Init(&I2c_Config);
}#define MCP79411_EEPROM_ADDRESS     0x57                        /* 7 bit slave device address for reading from EEPROMof MCP79411 is 0b1010111 which is 0x57.          */
#define ADDRESS_OF_MAC_ADDRESS      0xF2                        /* Location of EUI-48 node address (MAC address)    */
#define LENGTH_OF_ADDRESS           1                           /* Length of address of the register, in which therequested MAC address is stored in bytes         */
#define LENGTH_OF_MAC_ADDRESS       6                           /* Length of the MAC address in bytes               */uint8 g_macAddr[LENGTH_OF_MAC_ADDRESS] = {0, 0, 0, 0, 0, 0};    /* Global parameter for 6-byte EUI-48 MAC address   */#define I2C_USER_CHANNEL0 (0)
I2c_ChannelStatusType I2c_GetStatuss = I2C_UNINIT;void I2C_DemoFunction(void)
{/* Address of 6-byte EUI-48 MAC address location */uint8 i2cTxBuffer[1] = {ADDRESS_OF_MAC_ADDRESS};#if I2CASYENABLE//Async read operationI2c_AsyncWrite(I2C_USER_CHANNEL0, &i2cTxBuffer[0], LENGTH_OF_ADDRESS, MCP79411_EEPROM_ADDRESS);//write read addresswhile(I2c_GetStatus(I2C_USER_CHANNEL0) == I2C_BUSY);I2c_AsyncRead(I2C_USER_CHANNEL0, &g_macAddr[0], LENGTH_OF_MAC_ADDRESS, MCP79411_EEPROM_ADDRESS);//read registerwhile(I2c_GetStatus(I2C_USER_CHANNEL0) == I2C_BUSY);
#elseI2c_SyncWrite(I2C_USER_CHANNEL0, &i2cTxBuffer[0], 1, MCP79411_EEPROM_ADDRESS);//write read addressI2c_SyncRead(I2C_USER_CHANNEL0, &g_macAddr[0], 6, MCP79411_EEPROM_ADDRESS);//read register#endif}
#endifvoid IoHwAb_I2cNotification0(I2c_ErrorType ErrorId)
{count++;if(ErrorId){while(1);}
}

測試結果

我們連接X102引出的引腳之后,可以通過邏輯分析儀測量實際的信號,可以得到如下的結果:

  • 發送:0xAE 0xF2
  • 接收:0xAF 0xE8 0xD6 0x36 0x11 0x04 0x66?

發送的地址為0x57,左移一位為0xAE,寫的話最低位為0,則發送的第一個字節為0xAE,然后再發送我們想發送的EEPROM地址為0xF2,接收發送的第一個字節為0xAE+1(最低位為1表示接收),然后后邊的6個字節即為地址0xF2下的6字節設備ID。

當然,您也可以在UDE觀察g_macAddr數組的值。一般讀取ID都是調試I2C的第一階段,讀到了就代表I2C已經通了。


十六宿舍 原創作品,轉載必須標注原文鏈接。

?2023 Yang Li. All rights reserved.

歡迎關注?『十六宿舍』,大家喜歡的話,給個👍,更多關于嵌入式相關技術的內容持續更新中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904931.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深拷貝與淺拷貝:理解 Python 中的對象復制機制

深拷貝與淺拷貝:理解 Python 中的對象復制機制 在 Python 編程中,對象的復制是一個常見的操作。然而,很多初學者在處理對象復制時會遇到困惑,尤其是在涉及到復雜數據結構(如列表、字典、自定義對象等)時。…

BeanPostProcessor和AOP

BeanPostProcessor Spring中有一個接口Oredr的getOrder()方法,這個方法返回值是一個int類型,Spring容器會根據這個方法的返回值 對容器的多個Processor對象從小到大排序,創建Bean時候依次執行他們的方法,也就是說getOrder()方法的…

拒絕服務攻擊(DoS/DDoS/DRDoS)詳解:洪水猛獸的防御之道

在數字時代,服務的可用性是衡量一個在線系統成功與否的關鍵指標之一。然而,存在一類被稱為"拒絕服務攻擊" (Denial of Service, DoS) 的網絡攻擊,其主要目的就是通過各種手段耗盡目標服務器或網絡的資源,使其無法響應正…

小剛說C語言刷題—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X時n的值

1.題目描述 求恰好使 s11/21/3?1/n 的值大于 X 時 n 的值。( 2≤x≤10 ) 輸入 輸入只有一行,包括 1個整數 X 。 輸出 輸出只有一行(這意味著末尾有一個回車符號),包括 1 個整數。 樣例 輸入 2 輸出 4 2.參考代碼(C語言…

深度學習中的目標檢測:從 PR 曲線到 AP

深度學習中的目標檢測:從 PR 曲線到 AP 在目標檢測任務中,評估模型的性能是非常重要的。通過使用不同的評估指標和標準,我們可以量化模型的準確性與效果。今天我們將重點討論 PR 曲線(Precision-Recall Curve)、平均精…

MySQL 1366 - Incorrect string value:錯誤

MySQL 1366 - Incorrect string value:錯誤 錯誤如何發生發生原因: 解決方法第一種嘗試第二種嘗試 錯誤 如何發生 在給MySQL添加數據的時候發生了下面的錯誤 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…

[ctfshow web入門] web70

信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");讀取的index.php error_reporting和ini_set被禁用了,不必管他 error_reporting(0); ini_set(display_errors, 0); // 你們在炫技嗎? if(isset($_POST[c])){…

Linux在web下http加密和配置虛擬主機及動態頁面發布

web服務器的數據加密 1.簡介:由于http協議以明文方式發送,不提供任何方式的數據加密,也不適合傳輸一些重要的信息,如銀行卡號、密碼等,解決該缺陷設計了安全套接字層超文本傳輸協議https; 2.https的握手流…

uni-app,小程序中的addPhoneContact,保存聯系人到手機通訊錄

文章目錄 方法詳解簡介 基本語法參數說明基礎用法使用示例平臺差異說明注意事項最佳實踐 方法詳解 簡介 addPhoneContact是uni-app框架提供的一個實用API,用于向系統通訊錄添加聯系人信息。這個方法在需要將應用內的聯系人信息快速保存到用戶設備通訊錄的場景下非…

NHANES稀有指標推薦:HALP score

文章題目:Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI:10.3389/fonc.2024.1419310 中文標題:HALP 評分與無前列腺癌的中老年人血清…

【django.db.utils.OperationalError: unable to open database file】

解決platform.sh 環境下,無法打開數據庫問題 場景 在platform.sh 執行python manage.py createsuperuser是提示 django.db.utils.OperationalError: unable to open database file 錯誤 原因 由于settings.py文件中 本地數據庫配置在線上配置后,導致…

【前端分享】CSS實現3種翻頁效果類型,附源碼!

使用 css 可以實現多種翻頁效果&#xff0c;比如書本翻頁、卡片翻轉等。以下是兩種常見的翻頁效果實現&#xff1a; 效果 1&#xff1a;書本翻頁效果 通過 transform 和 rotateY 實現 3D 翻頁效果。 html 結構 <divclass"book"> <divclass"page pa…

【部署滿血Deepseek-R1/V3】大型語言模型部署實戰:多機多卡DeepSeek-R1配置指南

大家好&#xff01;這里是迪小莫學AI&#xff0c;今天的文章是“”大型語言模型部署實戰&#xff1a;多機多卡DeepSeek-R1配置指南“” 前言 隨著大型語言模型的快速發展&#xff0c;如何高效部署這些模型成為技術團隊面臨的重要挑戰。本文將分享基于DeepSeek-R1模型的多機多…

IPM IMI111T-026H 高效風扇控制板

概述&#xff1a; REF-MHA50WIMI111T 是一款專為風扇驅動設計的參考開發板&#xff0c;搭載了英飛凌的IMI111T-026H iMOTION?智能功率模塊(IPM)。這個模塊集成了運動控制引擎(MCE)、三相柵極驅動器和基于IGBT的功率級&#xff0c;全部封裝在一個緊湊的DSO22封裝中。REF-MHA50…

Linux 阻塞和非阻塞 I/O 簡明指南

目錄 聲明 1. 阻塞和非阻塞簡介 2. 等待隊列 2.1 等待隊列頭 2.2 等待隊列項 2.3 將隊列項添加/移除等待隊列頭 2.4 等待喚醒 2.5 等待事件 3. 輪詢 3.1 select函數 3.2 poll函數 3.3 epoll函數 4. Linux 驅動下的 poll 操作函數 聲明 本博客所記錄的關于正點原子…

互聯網SQL面試題:用戶會話時長分析

這是一個基于用戶點擊信息進行會話時長分析的案例&#xff0c;常見于互聯網 App 使用分析。 問題描述 用戶的訪問記錄存儲在 user_access 表中&#xff0c;包含用戶編號&#xff08;user_id&#xff09;以及訪問時間&#xff08;access_time&#xff09;等信息。以下是一個示…

前端取經路——現代API探索:沙僧的通靈法術

大家好,我是老十三,一名前端開發工程師。在現代Web開發中,各種強大的API就像沙僧的通靈法術,讓我們的應用具備了超乎想象的能力。本文將帶你探索從離線應用到實時通信,從多線程處理到3D渲染的九大現代Web API,讓你的應用獲得"通靈"般的超能力。 在前端取經的第…

window 顯示驅動開發-AGP 類型伸縮空間段

AGP 類型的伸縮空間段類似于線性光圈空間段。 但是&#xff0c;內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;不會通過 AGP 類型的伸縮空間段公開 dxgkDdiBuildPagingBuffer 回調函數的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMEN…

從零開始學習three.js(15):一文詳解three.js中的紋理映射UV

1. UV 映射基礎概念 1.1 什么是 UV 坐標&#xff1f; 在三維計算機圖形學中&#xff0c;UV 坐標是將二維紋理映射到三維模型表面的坐標系統。UV 中的 U 和 V 分別代表2D紋理空間的水平&#xff08;X&#xff09;和垂直&#xff08;Y&#xff09;坐標軸&#xff0c;與三維空間…

代碼復用與分層

1. 代碼復用與分層 函數&#xff1a;將常用的代碼塊封裝成函數&#xff0c;提供自己或者團隊使用。 庫&#xff1a;將代碼打包成靜態或者動態庫&#xff0c;提供出來一個頭文件供自己或者團隊使用。比如stm32中的HAL庫。 框架&#xff1a;通常實現一個完整的系統性的代碼&am…