AUTOSAR中的IIC如何实现和配置

文章介绍了IIC在AUTOSAR架构中的地位,虽然非标准MCAL模块,但可以通过复杂驱动实现。文中详细讲解了IIC的MCAL实现方式,包括Channel和Sequence的概念,并提供了IIC在AUTOSAR中的配置方法。此外,文章通过实例展示了不同场景下的数据传输方式,帮助读者理解IIC在AUTOSAR系统中的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IIC不是AUTOSAR MCAL的标准模块,本文探讨IIC的MCAL实现方式,以及Vector AUTOSAR IIC的配置方法和步骤。

文末提供限时PDF版分享,敬请关注。

1. IIC在AUTOSAR中的“地位”

首先,我们看看AUTOSAR层次结构,绿色部分是MCAL。

按理说,IIC属于MCU的驱动层,应该在MCAL里面,但是AUTOSAR的标准模块里面并没有包含这个IIC。

如果非要按层次分,IIC只能安放在Complex Driver

也许你会很好奇,为啥?MCAL和CDD有啥不一样?如果你是初学者,建议你先把这问题放一放,看我下面的讲解。

2. IIC的MCAL实现方式

实际上IIC也可以按照MCAL的方式来实现,Vector就给出了直接的解决方案,就把IIC当MCAL来实现了。

下文,只针对AUTOSAR如何使用和配置IIC做讲解,不详细讲解IIC的底层通信原理,但可能会提到一些概念,如果对IIC的通信原理感兴趣,请在网上搜索学习。

AUTOSAR标准里面有很多MCAL的实现规范,其实IIC也可以参考其方式来实现,例如SPI。

传送门:点击链接查看《MCAL SPI Module原理和配置详解

AUTOSAR的SPI规范中提出了Channel和Sequence的概念。

同时在传输数据用的接口是这几个:Spi_SetupEB,然后Spi_AsyncTransmit

那么IIC也可以做这样的Channel和Sequence,也可以按照SPI的方法做I2c_SetupEB和I2c_AsyncTransmit这样的接口。

I2c_SetupEB 

I2c_SetupEBDynamic 

I2c_Asynctransmit 

I2c_GetResult 

I2c_GetStatus

I2c_Cancel

I2c_SequenceEndNotification

如果你没详细研究过这些概念或者接口,你肯定是一头雾水。

接下来简单讲解下。

Channel是IIC总线上的最小数据单位,这些创建好的Channels是用于各种用途的。

我们做IIC应用软件时,通常会用一个buffer存储数据然后发给IIC设备,而大部分IIC设备一般需要在传输data前,需要传输register或者address这样的内容,那么像这样的address和data就可以做成两个不同的channel。

理解channel的概念后,这样还可以拓展下另一个概念Channel lists,channel list是多个channel的组合,例如往IIC设备写数据,得先发address然后跟着数据,这是有顺序的一系列传输,即可以把这address和data两个channel组合起来成为一个Channel list。

怎么发送这个Channel lists呢,这就需要一个叫Sequence的东西了。

Sequence是IIC总线上传输的最小原子单位,即sequence里面包含的channel list内容是不希望被打断的。

能理解吗?有点绕?以IIC设备EEPROM讲解下可能更容易理解点。

  • Eep_WriteSequence

    • I2cChannelWriteCmd

    • I2cChannelWriteData (chained)

  • Eep_ReadSequence

    • I2cChannelReadCmd

    • I2cChannelReadData

  • Eep_AckSequence

    • I2cChannelAck

上面,怎么给EEPROM写数据呢?I2cChannelWriteCmd首先将EEPROM的address发过去,这个地址就是你想写数据的地址哈,接着再通过I2cChannelWriteData发想写入的data。(咦?上面的chained是啥玩意?等等别急。)

有那么一点点概念了吧。

接着,你又会问I2c_SetupEB和I2c_AsyncTransmit怎么跟这些Channel和Sequence扯上关系呢?

那就再拿出几个栗子来看看吧,手把手教到你懂。

以下按7-bit地址讲解。

例子1:给0x20地址设备发送10个字节的数据。

I2c_SetupEB(Channel, Buffer, NULL_PTR, 10)I2c_AsyncTransmit(Sequence) 

这个很简单,就是直接理解为IIC直接将address和data一起发出去。

*注:途中的S表示IIC的Start,RS表示ReStart,P表示Stop,下同

例子2:由两个不同Channel组成的Sequence,给0x20地址设备发送2和8个字节的数据。

I2c_SetupEB(CH01, Buffer0, NULL_PTR, 2)I2c_SetupEB(CH02, Buffer1, NULL_PTR, 8)I2c_AsyncTransmit(Sequence)

这个也很简单,不带Chain特性的,IIC会重新发起Start,即restart。

例子3:由三个不同Channel组成的Sequence,给0x20地址设备发送2、8和4个字节的数据。其中CH03这个Channel是带Chain的。

I2c_SetupEB(CH01, Buffer0, NULL_PTR, 2)I2c_SetupEB(CH02, Buffer1, NULL_PTR, 8)I2c_SetupEB(CH03, Buffer2, NULL_PTR, 4)I2c_AsyncTransmit(Sequence)

因为CH03带Chain,所以是接着CH02发的,没有restart。

Chain的特性就可以简单理解为,是跟上一个Channel链起来的,所以Chain是不可以在第一个Channel的。这个要注意。

上面讲的都是基于7-bit地址的,似乎都上send或者write数据的情况。

下面讲解8-bit地址,读数据回来的情景。

其实7-bit地址和8-bit地址没多大差别,看数值好像就是移了一位而已。

例子4:同样给0x20地址设备发送2、8个字节的数据。其中CH02这个Channel的方向发生了变化。

I2c_SetupEB(CH01, Buffer0, NULL_PTR, 2) (master transmitter)I2c_SetupEB(CH02, NULL_PTR, Buffer1, 8) (master receiver)I2c_AsyncTransmit(Sequence)

注意上面代码的buffer参数位置变了,即通信方向变了,下面的那个Channel CH02方向发生了改变,即IIC会重新发起start,即restart。

以上的例子应该很清晰了,我想你也应该理解了吧。

可以粗略总结下:

  1. 如果没有Chain的话,这个Channel在发送时,IIC会Restart;

  2. 如果几个不同Channel发送时,Channel的方向发生了变化,IIC也会Restart;

  3. 如果Channel带Chain,那么这个IIC是不会Restart的。

这里有个问题,如果两个Channel对应两个不同地址,后面的Channel带Chain,会发生什么情况呢?

例子5:Channel CH01地址是0x20,CH02地址是0x22,同时CH02是Chain的。

I2c_SetupEB(CH01, Buffer0, NULL_PTR, 2) (master transmitter)I2c_SetupEB(CH02, Buffer1, NULL_PTR, 8) (master transmitter)I2c_AsyncTransmit(Sequence)

从上面的推论,CH01到CH02切换时,方向没改变,而且是Chain的,所以波形是这样的。

这里的CH02的地址被忽略了!可以跟上面的案例一起对比理解下。

3. IIC的AUTOSAR配置

讲了这么多原理特点,那么这玩意在AUTOSAR是怎么配置使用的呢?总不能光说不练嘛!

(部分内容已省略……请关注同名公众号查看或下载pdf版阅读)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值