【MCAL】TC397+EB-tresos之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

涉及的参考文档如下表。

序号参考资料内容
1《MC-ISAR_TC3xx_UM_I2c.pdf》  英飞凌提供的TC3xx芯片I2C用户手册
2infineon-applicationkitmanual-tc3x7-usermanual-en.pdf开发板KIT_A2G_TC397XA_TFT说明
3Infineon-AURIX_TC39x-UserManual-v02_00-EN英飞凌TC39x用户手册

配置目标如下:

  • 通过I2C同步/异步读取MCP79411芯片中6字节长度的ID值。

EB tresos配置

MCU (configure the system clock)

配置fI2C的频率。

Port 

configure SCL and SDA lines.

用户必须通过PORT配置来设置I2C驱动程序使用的端口引脚,并在调用I2C初始化之前完成这些引脚的初始化。

I2C驱动程序需要配置两个引脚:SCL(时钟线)和SDA(数据线)。由于I2C协议支持多主机通信,SDA必须配置为开漏输出(Open-Drain)

P15.4 SCL(串行时钟线)配置为输出模式
P15.5 ​SDA(串行数据线)​​

必须配置为开漏输出以支持多主机通信

必须配置为开漏输出以支持多主机通信

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

P15.4 配置如下:

配置如下:

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则是中断的回调函数,若协议中断的返回不是

void I2cDemoInit()
{
#if I2CASYENABLE
    IrqI2c_Init();
    SRC_I2C0DTR.B.SRE = 1;
    SRC_I2C0ERR.B.SRE = 1;
    SRC_I2C0P.B.SRE   = 1;
#endif
    I2c_Init(&I2c_Config);
}
 
#define MCP79411_EEPROM_ADDRESS     0x57                        /* 7 bit slave device address for reading from EEPROM
                                                                   of 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 the
                                                                   requested 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 operation
    I2c_AsyncWrite(I2C_USER_CHANNEL0, &i2cTxBuffer[0], LENGTH_OF_ADDRESS, MCP79411_EEPROM_ADDRESS);//write read address
    while(I2c_GetStatus(I2C_USER_CHANNEL0) == I2C_BUSY);
    I2c_AsyncRead(I2C_USER_CHANNEL0, &g_macAddr[0], LENGTH_OF_MAC_ADDRESS, MCP79411_EEPROM_ADDRESS);//read register
    while(I2c_GetStatus(I2C_USER_CHANNEL0) == I2C_BUSY);
#else
 
    I2c_SyncWrite(I2C_USER_CHANNEL0, &i2cTxBuffer[0], 1, MCP79411_EEPROM_ADDRESS);//write read address
    I2c_SyncRead(I2C_USER_CHANNEL0, &g_macAddr[0], 6, MCP79411_EEPROM_ADDRESS);//read register
 
#endif
 
}
#endif
 
void 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已经通了。

荣耀路由XD21是一款设计简洁、功能全面的家庭无线路由器,旨在提供高速稳定的网络连接和便捷的设备管理体验。以下是对荣耀路由XD21的一些基本特点和操作指导。 ### 使用前准备: 1. **电源适配器**:确保您的电源适配器已经连接到路由器,并插好电源插座。 2. **网线**:准备一条直通网线用于连接电脑或其他设备到路由器的LAN口。 3. **手机或电脑**:您需要一台电脑或支持Wi-Fi的移动设备用于配置路由器和接入网络。 ### 配置路由器: #### 使用PC端配置: 1. **登录路由器管理界面**:将电脑通过网线连接到路由器的LAN口上。打开浏览器输入路由器默认IP地址(通常为192.168.3.1),按回车键进入登录页面。 2. **输入用户名和密码**:首次访问一般需要输入预设的管理员账号名和密码,默认可能为“admin”作为账号名,“admin”或“password”作为密码。如果之前已修改过,使用更改后的设置。 3. **开始配置**:登录成功后,您可以看到路由器的各种配置选项,包括网络设置、安全设置、无线频段调整等。根据个人需求进行相应的设置。 4. **保存并重启**:完成所有必要的配置后,记得保存设置并重启路由器,以便生效。 #### 使用手机APP配置: 1. **下载App**:从应用商店下载荣耀官方的路由器管理App,如荣耀智慧生活App。 2. **扫描二维码**:在路由器底部找到二维码图标并用手机扫描,或者手动输入路由器的MAC地址或IP地址加入WiFi连接路由器。 3. **绑定账户**:按照提示绑定荣耀账号,便于后续的远程管理和软件更新。 4. **配置路由器**:在App内可以直观地查看和调整各项设置,如网络名称、加密方式、Wi-Fi信号强度控制等。 ### 日常维护与使用: - 定期检查路由器固件更新,确保使用最新版本的功能和安全性提升。 - 清洁路由器散热孔,保持良好的通风环境,避免长时间高温导致性能下降。 - 如果多台设备同时在线,可能会对网络造成压力,注意合理分配带宽资源。 ### 相关问题: 1. **如何解决路由器频繁掉线的问题**? - 检查网络线路是否稳定可靠,是否存在干扰源。 - 检查路由器设置是否开启过多的安全防护措施,可能影响稳定性。 - 更新路由器固件至最新版本,修复潜在的技术缺陷。 2. **如何提高家庭Wi-Fi覆盖范围**? - 将路由器放置于开放空间,远离墙体和其他电子设备。 - 可考虑购买并安装Wi-Fi放大器或扩展器,增强信号强度和覆盖面积。 - 根据实际需要,增加路由器的数量或采用Mesh网络系统。 3. **路由器设置过于复杂,怎么简化操作流程**? - 利用路由器自带的向导模式进行快速设置,减少人工干预步骤。 - 学习使用路由器管理App,其图形化界面通常比Web端更直观易用。 - 查阅用户手册或官方教程,了解常用的快捷配置技巧和一键优化功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值