介绍一下开发环境及关键字:
MCU: S32K314
MCAL: EB配置,使用NXP提供的MCAL ,V2.0.3, AS4.4.0
IAM20381:加速计 X,Y,Z 轴 ±2g,4g,8g,16g 16-LGA(3x3)
I2C : 主机模式,与IAM20381连接,Port配置为开漏
I2C的数据传输方式先使用中断来传输,后续再更新为DMA,配置如下:
需要开启I2C的接收发送中断回调和错误回调,以便应用确认当前的传输状态
下面的I2C超时DEM的接口我们先不考虑,如果需要记录DTC可以打开;
选择好参考时钟,速率会自动帮你换算;
这里我们选择48M 64分频,得到125k的速率;
这个速率后期需要再根据MCU的时钟树来分频得到我们想要的大小,这里先不微调;
其他的参数可以根据对应调试芯片的参数来动态调整;
下面的高速模式,从机模式,10bit地址,先不配置后续更新;
如果使用autosar配置工具,请使能I2C中断:
中断标号:
S32K3XXRM.pdf S32K3xx_interrupt_map.XLSX
或者在Platform 使能I2C中断:
IAM-20381是一款三轴运动跟踪加速计
资料在官网,有提供官网例程,这里我们将官方提供的驱动移植到我们的设备上;
手册:ds-000216-iam-20381-typ-v1.0.pdf (tdk.com.cn)
例程:Software Downloads | InvenSense Developers (tdk.com) 找到如下卡片:
点击上述框内开始下载工程压缩包:eMD-SmartMotion-IAM20381-1.0.0-MP
下载完毕解压缩,工程目录如下:
Streamlined_eMD_IAM20381_Software_Guide.pdf : 软件手册,主要是对基于EVB的开发的说明和对3个例程的功能解释;
驱动路径如下: EMD-CoresourcesInvnDevicesDriversIAM20381
主要实现4个接口函数:
延时函数:
I2C写数据和读数据函数:
通过 SetupInvDevice注册
延时函数利用autosar的WaitEvent,GetEvent,ClearEvent实现
通过WaitEvent的等待时间来控制延迟的时间,
通过配置创建一个Extended类型 的task,创建两个事件,1.闹钟形式1ms触发一次处理数据,2触发事件等待初始化20381,
延时函数实现:
I2C接口实现:
I2C死锁问题:
I2C死锁一般发生在系统初始化、mcu软复位,硬件线路电平不稳定等情况下,从机设备将SDA拉低,而SCL保持为高,总线一直被占用,主机只能被动等待,无法对从及设备做控制,这时需要解锁;
1. 在初始化I2C之前,将SDA SCL初始化为IO,拉低拉高10次,解除锁定;
2.当产生I2C_MASTER_EVENT_PIN_LOW_TIMEOUT事件时,我们需要将i2c重新解锁;
我们需要配置如下参数:
设置为12个周期 :
10bit地址 + 1bit R/W + 1bit ACK
当产生I2C_MASTER_EVENT_PIN_LOW_TIMEOUT事件时,可以认为发生了死锁,我们需要在
I2C_CALLBACK 中去检查事件,当发生事件,则SetEvent在task AppTask_Sensor中处理;
初始化函数实现:
例程选择的23081的i2c pin配置为推挽输出,这里我们需要修改一下pin设置为开漏输出根据20381手册:
新增寄存器设置pin函数:
在inv_iam20381_init中最后一步添加:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/21244.html