EB配置I2c - 实现与PF8200的读写操作


->返回总目录<-

前言

最近领导要求I2c从软件模拟实现变更为硬件I2c实现。但是网上一搜索全是要钱的。心有不甘于是我自己小研了一下,也实现了,没啥大难点!!!
IIC实现方式一般有两种:
①, 基于硬件实现IIC通信(硬件GPIO引脚配置为I2c复用引脚)
②, 基于软件模拟IO实现IIC通信(代码控制SDA和SCL两个IO引脚的电平来模拟IIC时序)

本文章基于64pin的恩智浦 S32K146型号的芯片作为主机,从机是NXP的供电芯片PMIC(PF8200)
在本次实验中,我们将以使用EB工具链来配置硬件IIC通信。

具体实现流程包括如下几点:
1, EB配置 2, 代码编写 3, 测试验证

在这里插入图片描述

话不多说,走你~

一、EB工具链配置

1、I2c模块

1)新建模块

在EB工具中,新建I2c模块。如下图:
在这里插入图片描述

2)配置General

在这里插入图片描述①, 在AutoSar的配置工具中,常常看见PostBuild、Precompile、Linktime这三个影子。具体描述可以参考下面这篇博客。
链接地址

②, 开发者错误检测,常用于开发调试时候,当模块运行是出现了错误,会通过DET模块报错并使栈指针定位了DET模块的报错函数,可查看IIC出现了什么故障类型并进行维护。一般在软件释放时,应该取消该选项。

③, 是否使用DMA传输功能,勾选之后应该在MCL模块进行配置DMA通道。图片上我虽然勾选了,实际上并没有在MCL进行配置。用户可根据需求在选择。

④, 定义Timeout定时器。

3)配置I2cChannel

在这里插入图片描述
I2cChannelId:0
I2cHwChannel:LPI2C_0
I2cMasterSlaveConfiguration:MASTER_MODE(MCU配置为主机模式)
I2cOperatingMode:LPI2C_STANDARD_MODE(标准模式,通信频率100khz)

在这里插入图片描述

①: 选择MCU模块配置好的时钟源(选择SIRC时钟源)/Mcu/McuModuleConfiguration/McuClockSettingConfig/McuClockSettingConfig_0/McuPeripheralClockConfig
在这里插入图片描述

在这里插入图片描述

②: 选择IIC使用中断模式
③④ 两步骤都是为了配置出I2c的波特率100Kh。芯片手册有描述,如下图。详情见芯片手册。
在这里插入图片描述

2、Port模块

1)配置SDA

在这里插入图片描述

2)配置SCL

在这里插入图片描述
到此为止EB配置工作已经完成了,生成I2c,Port相关的代码文件。并集成到工程中。 MCAL的IIC静态代码I2c_TS_T40D2M10I1R0SW32K1_RTD_4.4_1.0.1中复制到工程中。

3、中断

打开platform模块,使能I2C的中断。如下图:
在这里插入图片描述
~

二、代码分析

从机设备地址:0x10
从机设备ID:0x48
从机设备ID寄存器:0x00
任务目标:通过使用I2c读取从机的设备ID号。带CRC校验功能的IIC读写操作。

I2c模块的读写操作共同使用同一个函数接口:

Std_ReturnType I2c_SyncTransmit(uint8 Channel, const I2c_RequestType * RequestPtr)

重点解析第二个形参,I2c配置结构体变量。
在这里插入图片描述

1、申明一个I2c配置结构体数组,用于I2c所有读操作。

在这里插入图片描述
从机地址0x10必须向右移位1bit 0x10 >> 1u(0x08u)
结构体数组中的第一个成员用于写从机地址和寄存器地址,实现与从机建立握手。
结构体数组中的第二个成员用于读取寄存器的数据,并存储在ReadDataBuf中。

结构体声明如下图
在这里插入图片描述

2、搭建读操作函数

I2c读寄存器数据通用接口,读取任何寄存器的数据,可以通过调用该接口
在这里插入图片描述
读PMIC设备地址的函数:
在这里插入图片描述

~
到此,代码编写就结束了,编译进行验证结果

三、测试验证

参考PF 8200的数据手册可知,读取寄存器数据的时序如下图
在这里插入图片描述
串口打印信息:
在这里插入图片描述
示波器测试数据:
同志们,别纠结下图中的CRC值0x62。上面的串口打印消息CRC值错误的,是因为硬件问题。下图是换了个硬件测出的数据(是我期待的)
在这里插入图片描述

Tips:
上图中,SDA有三条细细的上升波形。目前原因还未找到。都是在MCU收到从机的响应位之后产生的,并未对MCU采集数据产生影响。如果有谁也遇到过这情况并解决了,可以分享以下哈!

~

总结

写操作比较简单,只需要申明一个I2c配置结构体变量即可。
博主是AutoSar小白,刚开始接触NXP芯片,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在后面的博文再相会哈~
->返回总目录<-

  • 30
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&春风有信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值