IIC不是AUTOSAR MCAL的標(biāo)準(zhǔn)模塊,本文探討IIC的MCAL實現(xiàn)方式,以及Vector AUTOSAR IIC的配置方法和步驟。
文末提供限時PDF版分享,敬請關(guān)注。
1. IIC在AUTOSAR中的“地位” 首先,我們看看AUTOSAR層次結(jié)構(gòu),綠色部分是MCAL。

按理說,IIC屬于MCU的驅(qū)動層,應(yīng)該在MCAL里面,但是AUTOSAR的標(biāo)準(zhǔn)模塊里面并沒有包含這個IIC。


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

也許你會很好奇,為啥?MCAL和CDD有啥不一樣?如果你是初學(xué)者,建議你先把這問題放一放,看我下面的講解。
2. IIC的MCAL實現(xiàn)方式
實際上IIC也可以按照MCAL的方式來實現(xiàn),Vector就給出了直接的解決方案,就把IIC當(dāng)MCAL來實現(xiàn)了。 下文,只針對AUTOSAR如何使用和配置IIC做講解,不詳細(xì)講解IIC的底層通信原理,但可能會提到一些概念,如果對IIC的通信原理感興趣,請在網(wǎng)上搜索學(xué)習(xí)。 AUTOSAR標(biāo)準(zhǔn)里面有很多MCAL的實現(xiàn)規(guī)范,其實IIC也可以參考其方式來實現(xiàn),例如SPI。 傳送門:點擊鏈接查看《MCAL SPI Module原理和配置詳解》 AUTOSAR的SPI規(guī)范中提出了Channel和Sequence的概念。

同時在傳輸數(shù)據(jù)用的接口是這幾個: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
如果你沒詳細(xì)研究過這些概念或者接口,你肯定是一頭霧水。
接下來簡單講解下。 Channel是IIC總線上的最小數(shù)據(jù)單位,這些創(chuàng)建好的Channels是用于各種用途的。 我們做IIC應(yīng)用軟件時,通常會用一個buffer存儲數(shù)據(jù)然后發(fā)給IIC設(shè)備,而大部分IIC設(shè)備一般需要在傳輸data前,需要傳輸register或者address這樣的內(nèi)容,那么像這樣的address和data就可以做成兩個不同的channel。 理解channel的概念后,這樣還可以拓展下另一個概念Channel lists,channel list是多個channel的組合,例如往IIC設(shè)備寫數(shù)據(jù),得先發(fā)address然后跟著數(shù)據(jù),這是有順序的一系列傳輸,即可以把這address和data兩個channel組合起來成為一個Channel list。 怎么發(fā)送這個Channel lists呢,這就需要一個叫Sequence的東西了。 Sequence是IIC總線上傳輸?shù)淖钚≡訂挝唬磗equence里面包含的channel list內(nèi)容是不希望被打斷的。 能理解嗎?有點繞?以IIC設(shè)備EEPROM講解下可能更容易理解點。
Eep_WriteSequence
I2cChannelWriteCmd
I2cChannelWriteData (chained)
Eep_ReadSequence
I2cChannelReadCmd
I2cChannelReadData
Eep_AckSequence
I2cChannelAck
上面,怎么給EEPROM寫數(shù)據(jù)呢?I2cChannelWriteCmd首先將EEPROM的address發(fā)過去,這個地址就是你想寫數(shù)據(jù)的地址哈,接著再通過I2cChannelWriteData發(fā)想寫入的data。(咦?上面的chained是啥玩意?等等別急。) 有那么一點點概念了吧。 接著,你又會問I2c_SetupEB和I2c_AsyncTransmit怎么跟這些Channel和Sequence扯上關(guān)系呢? 那就再拿出幾個栗子來看看吧,手把手教到你懂。 以下按7-bit地址講解。
例子1:給0x20地址設(shè)備發(fā)送10個字節(jié)的數(shù)據(jù)。
I2c_SetupEB(Channel,Buffer,NULL_PTR,10) I2c_AsyncTransmit(Sequence)
這個很簡單,就是直接理解為IIC直接將address和data一起發(fā)出去。

*注:途中的S表示IIC的Start,RS表示ReStart,P表示Stop,下同
例子2:由兩個不同Channel組成的Sequence,給0x20地址設(shè)備發(fā)送2和8個字節(jié)的數(shù)據(jù)。
I2c_SetupEB(CH01,Buffer0,NULL_PTR,2) I2c_SetupEB(CH02, Buffer1, NULL_PTR, 8) I2c_AsyncTransmit(Sequence)
這個也很簡單,不帶Chain特性的,IIC會重新發(fā)起Start,即restart。

例子3:由三個不同Channel組成的Sequence,給0x20地址設(shè)備發(fā)送2、8和4個字節(jié)的數(shù)據(jù)。其中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發(fā)的,沒有restart。

Chain的特性就可以簡單理解為,是跟上一個Channel鏈起來的,所以Chain是不可以在第一個Channel的。這個要注意。
上面講的都是基于7-bit地址的,似乎都上send或者write數(shù)據(jù)的情況。 下面講解8-bit地址,讀數(shù)據(jù)回來的情景。 其實7-bit地址和8-bit地址沒多大差別,看數(shù)值好像就是移了一位而已。
例子4:同樣給0x20地址設(shè)備發(fā)送2、8個字節(jié)的數(shù)據(jù)。其中CH02這個Channel的方向發(fā)生了變化。
I2c_SetupEB(CH01,Buffer0,NULL_PTR,2)(mastertransmitter) I2c_SetupEB(CH02,NULL_PTR,Buffer1,8)(masterreceiver) I2c_AsyncTransmit(Sequence)
注意上面代碼的buffer參數(shù)位置變了,即通信方向變了,下面的那個Channel CH02方向發(fā)生了改變,即IIC會重新發(fā)起start,即restart。

以上的例子應(yīng)該很清晰了,我想你也應(yīng)該理解了吧。 可以粗略總結(jié)下:
如果沒有Chain的話,這個Channel在發(fā)送時,IIC會Restart;
如果幾個不同Channel發(fā)送時,Channel的方向發(fā)生了變化,IIC也會Restart;
如果Channel帶Chain,那么這個IIC是不會Restart的。
這里有個問題,如果兩個Channel對應(yīng)兩個不同地址,后面的Channel帶Chain,會發(fā)生什么情況呢?
例子5:Channel CH01地址是0x20,CH02地址是0x22,同時CH02是Chain的。
I2c_SetupEB(CH01, Buffer0, NULL_PTR, 2) (master transmitter) I2c_SetupEB(CH02,Buffer1,NULL_PTR,8)(mastertransmitter) I2c_AsyncTransmit(Sequence)
從上面的推論,CH01到CH02切換時,方向沒改變,而且是Chain的,所以波形是這樣的。

這里的CH02的地址被忽略了!可以跟上面的案例一起對比理解下。
3. IIC的AUTOSAR配置
講了這么多原理特點,那么這玩意在AUTOSAR是怎么配置使用的呢?總不能光說不練嘛!
審核編輯 :李倩
-
模塊
+關(guān)注
關(guān)注
7文章
2837瀏覽量
53282 -
IIC
+關(guān)注
關(guān)注
11文章
309瀏覽量
40632 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
398瀏覽量
23647
原文標(biāo)題:AUTOSAR中的IIC如何實現(xiàn)和配置
文章出處:【微信號:embedded_sw,微信公眾號:嵌入式軟件實戰(zhàn)派】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【瑞薩RA × Zephyr開發(fā)板評測】+模擬IIC實現(xiàn)OLED輸出(與硬件IIC輸出的失敗經(jīng)驗)
RA MCU眾測寶典 | IIC之【RA2E1】IIC通信的OLED顯示
光庭信息榮獲AUTOSAR中國中心2025年度優(yōu)秀貢獻(xiàn)獎
通信協(xié)議IIC與SPI最全對比分析
基于hbirdv2-sdk的iic 0.96寸lcd調(diào)試
如何實現(xiàn) RoCE 配置的自動同步(基礎(chǔ)篇) - DCBX協(xié)議
iic中只設(shè)置了時鐘和數(shù)據(jù)引腳沒有配置那個端口,rtt是怎么知道在那個端口上進(jìn)行iic通信的?
如何實現(xiàn)安全的AUTOSAR通信棧
RT-Thread睿賽德正式加入AUTOSAR 組織,成為開發(fā)合作伙伴!
從手寫代碼到AUTOSAR工具鏈:J1939Tp應(yīng)用篇
揭秘RT-Thread上的AUTOSAR CP系統(tǒng)
東軟睿馳亮相第16屆AUTOSAR開放大會
光庭信息亮相第16屆AUTOSAR開放大會
ZYNQ FPGA的PS端IIC設(shè)備接口使用
RT-Thread睿賽德正式成為AUTOSAR組織合作伙伴,攜手推動智能汽車技術(shù)新發(fā)展| 新聞速遞
AUTOSAR中的IIC如何實現(xiàn)和配置
評論