最近领导要求I2c从软件模拟实现变更为硬件I2c实现。但是网上一搜索全是要钱的。心有不甘于是我自己小研了一下,也实现了,没啥大难点!!!
IIC实现方式一般有两种:
①, 基于硬件实现IIC通信(硬件GPIO引脚配置为I2c复用引脚)
②, 基于软件模拟IO实现IIC通信(代码控制SDA和SCL两个IO引脚的电平来模拟IIC时序)
本文章基于64pin的恩智浦 S32K146型号的芯片作为主机,从机是NXP的供电芯片PMIC(PF8200) 。
在本次实验中,我们将以使用EB工具链来配置硬件IIC通信。
具体实现流程包括如下几点:
1, EB配置 2, 代码编写 3, 测试验证
话不多说,走你~
在EB工具中,新建I2c模块。如下图:
①, 在AutoSar的配置工具中,常常看见PostBuild、Precompile、Linktime这三个影子。具体描述可以参考下面这篇博客。
链接地址
②, 开发者错误检测,常用于开发调试时候,当模块运行是出现了错误,会通过DET模块报错并使栈指针定位了DET模块的报错函数,可查看IIC出现了什么故障类型并进行维护。一般在软件释放时,应该取消该选项。
③, 是否使用DMA传输功能,勾选之后应该在MCL模块进行配置DMA通道。图片上我虽然勾选了,实际上并没有在MCL进行配置。用户可根据需求在选择。
④, 定义Timeout定时器。
I2cChannelId:0
I2cHwChannel:LPI2C_0
I2cMasterSlaveConfiguration:MASTER_MODE(MCU配置为主机模式)
I2cOperatingMode:LPI2C_STANDARD_MODE(标准模式,通信频率100khz)
①: 选择MCU模块配置好的时钟源(选择SIRC时钟源)
②: 选择IIC使用中断模式
③④ 两步骤都是为了配置出I2c的波特率100Kh。芯片手册有描述,如下图。详情见芯片手册。
到此为止EB配置工作已经完成了,生成I2c,Port相关的代码文件。并集成到工程中。 MCAL的IIC静态代码I2c_TS_T40D2M10I1R0从SW32K1_RTD_4.4_1.0.1中复制到工程中。
~
从机设备地址:0x10
从机设备ID:0x48
从机设备ID寄存器:0x00
任务目标:通过使用I2c读取从机的设备ID号。带CRC校验功能的IIC读写操作。
I2c模块的读写操作共同使用同一个函数接口:
Std_ReturnType I2c_SyncTransmit(uint8 Channel, const I2c_RequestType * RequestPtr)
重点解析第二个形参,I2c配置结构体变量。
从机地址0x10必须向右移位1bit 0x10 >> 1u(0x08u)
结构体数组中的第一个成员用于写从机地址和寄存器地址,实现与从机建立握手。
结构体数组中的第二个成员用于读取寄存器的数据,并存储在ReadDataBuf中。
I2c读寄存器数据通用接口,读取任何寄存器的数据,可以通过调用该接口
读PMIC设备地址的函数:
~
到此,代码编写就结束了,编译进行验证结果
参考PF 8200的数据手册可知,读取寄存器数据的时序如下图
串口打印信息:
示波器测试数据:
Tips:
上图中,SDA有三条细细的上升波形。目前原因还未找到。都是在MCU收到从机的响应位之后产生的,并未对MCU采集数据产生影响。如果有谁也遇到过这情况并解决了,可以分享以下哈!
~
写操作比较简单,只需要申明一个I2c配置结构体变量即可。
博主是AutoSar小白,刚开始接触NXP芯片,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在后面的博文再相会哈~