【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.mzph.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…