如何使用S32DS开发KEA系列的LIN功能(二)
基于S32DS+LIN_Stack_S12編寫KEA的LIN例程
文章目錄
- 基于S32DS+LIN_Stack_S12編寫KEA的LIN例程
- 1.KEA基于S32DS的驅動和例程獲取
- 2.LIN Stack移植
- 2.1添加文件以及目錄
- 2.2協議棧文件修改適配S32DS
- 3.用戶程序編寫
- 3.1準備工作
- 3.1.1硬件平臺
- 3.1.2功能需求
- 3.2 S32K144(主機)+KEA128(從機)
- 3.2.1 S32K144的LIN Mater例程導入
- 3.2.2 S32K144的LIN Mater例程解讀
- 3.2.3 KEA128的LIN slave程序編寫
- 3.3 KEA128(主機)+S32K144(從機)
- 3.3.1 S32K144的LIN slave程序解讀
- 3.3.2 KEA128的LIN Master程序編寫
- 3.3.3 LIN_stack_S12_4_6_6的bug說明
- 4.測試驗證
- 4.1 S32K144(主機)+KEA128(從機)
- 4.2 KEA128(主機)+S32K144(從機)
- 5.程序分享
1.KEA基于S32DS的驅動和例程獲取
NXP的大部分芯片資料都是可以在官網找到的,包含芯片文檔(數據手冊,參考手冊,應用筆記等)以及軟硬件資料。下面以KEA系列為例,進行一個簡單的介紹。
首先在NXP官網的搜索欄輸入KEA,按下回車鍵,一般第一個就是KEA產品的鏈接,如下圖所示:
進入產品鏈接之后,會發現產品界面分六個菜單欄,如下圖所示:
一般開發人員只需要關注前面3個菜單欄即可:
- OVERVIEW(概述)欄:簡單描述該芯片的類別以及功能特性,適合快速尋找自己需要的芯片時使用;
- DOCUMENTION(文檔)欄:主要存放芯片的文檔資料,包含參考手冊,數據手冊,應用筆記,勘誤手冊等,適合詳細評估芯片時使用;
- TOOLS & SOFTWARE(工具和軟件)欄:主要存放評估板鏈接,IDE鏈接,軟件驅動,配套工具,調試器鏈接等,適合軟硬件開發時使用;
我們選擇 TOOLS & SOFTWARE欄的KEA Freedom Evaluation Board鏈接,并點擊進入:
進入開發板鏈接之后,往下拉到Design Resources界面,如下圖所示;分為三部分,1是文檔,2是demo板硬件資料,3是demo板配套的軟件。
如下圖所示,如果使用S32DS開發KEA系列芯片,大部分功能參考 《FRDM-KEAZ Freedom Evaluation Board – QSP》 里面包含的軟件即可,同時這個界面也包含了上一篇文章提到的LIN_Stack_S12的下載鏈接。本文這兩個鏈接所包含的軟件都需要用到。
Tips:
2.LIN Stack移植
解壓FRDM-KEA-QSP.zip包含的所有壓縮包,將…\FRDM-KEA-QSP\Code Project Examples and Sample Drivers (Evaluation Grade Only)\FRDM-KEAZ128\Driver Test SW for KEAZ128目錄下的FRDM_KEA128_LIN_Master_PROD工程拷貝到S32DS for ARM 2.2的工作空間(workspace),方便接下來的使用。
2.1添加文件以及目錄
由于官方提供的LIN例程不帶LDF文件,同時也不清楚使用的LIN_Stack版本,所以必須得換成有配套NCF Tools的LIN Stcak。這樣應對不同車廠的需求時,只需使用NCF Tools導入車廠提供的LDF文件,同時配置下NPF文件,即可生成所需的配置文件。
2. 因為lin_cfg文件夾存放的是和LDF文件有關的配置,LIN_Driver文件夾存放KEA系列需要用到的協議棧,如下圖所示。這兩個文件夾包含的文件都刪除即可。
將工程重新命名,點擊菜單欄中的File,然后點擊Rename(如下圖所示),輸入新的工程名lin_master_kea128,點擊OK即可。
打開LIN_Stack的安裝目錄,將…\LIN_stack_S12_4_6_6\LIN_Stack目錄下的所有文件復制到lin_master_kea128工程下的\include\LIN_Driver文件夾,將bsp文件中的無關文件夾刪除,只保留AUTOBAUD和UART兩個文件夾,如下圖所示:
吐槽一下:關于官網KEA例程使用的LIN Stack版本,我向NXP的Support系統提交過相關Case,但是沒有得到準確回復,只是推薦我使用CodeWarrior開發KEA系列單片機。。。。。。
2.2協議棧文件修改適配S32DS
由于協議棧的驅動是基于CodeWarrior開發的,如果想在S32DS使用,有幾個地方需要修改下:
AUTOBAUD文件夾中的lin_lld_autobaud.c文件,需要修改下定時器FTM0的中斷使能方式,如下圖所示:
UART文件夾中的lin_isr.c文件,因為接下來需要使用UART1實現LIN的功能,需要將UART1的中斷處理函數名稱修改下,和啟動文件保持一致,如下圖所示:
特別提醒:如果未使能自適應波特率的功能,LIN Stack是不會開啟定時器FTM0的,此時就可以在其他地方使用FTM0了,如計算時基。
3.用戶程序編寫
3.1準備工作
3.1.1硬件平臺
由于手上只有一個KEA128的評估板,為了能夠實現主機和從機通信的功能演示,有增加了一塊S32K144的評估板進行演示。
準備設備如下:
- 12V電源
- FRDM-KEAZ128Q80
- S32K144EVB-Q100
- 示波器ZDS1104
- 一臺個人電腦
- 一根MicroUSB線
引腳功能如下表:
| SW2 | PTC12 | PTE4 |
| SW3 | PTC13 | PTE5 |
| RGB_RED | PTD15 | PTH0 |
| RGB_GREEN | PTD16 | PTH1 |
| RGB_BLUE | PTD0 | PTE7 |
| VBATT | J11-2 | J11-2 |
| LIN | J11-1 | J11-1 |
| GND | J11-4 | J11-4 |
| LIN_TX | LPUART2_TX(PTD7) | UART1_TX(PTF3) |
| LIN_RX | LPUART2_RX(PTD6) | UART1_RX(PTF2) |
3.1.2功能需求
這次例程主要演示主節點SeatECU和從節點Motor1之間使用無條件幀進行通信:
- 主節點SeatECU處于NormalTable調度表,以50ms的周期循環發送Motor1State_Cycl和Motor1Selection兩個無條件幀,前者用于獲取從節點Motor1的Motor1Temp信號,后者用于通知從節點Motor1 Motor1Selection信號值。開始運行時先亮綠燈,5s后綠燈和藍燈交替閃爍。
對于主節點而言:
- 如果主節點獲取的Motor1Temp信號值大于規定的過溫值,主節點會將Motor1Selection信號值設為STOP command并傳遞給從節點Motor1;此時點亮紅燈。
- 如果Motor1Temp信號值介于規定的最大值和過溫值之間,Motor1Selection值會設為DECREASE MOTOR SPEED command;此時點亮藍燈。
- 如果Motor1Temp信號值低于規定的最大值,Motor1Selection值會設為INCREASE MOTOR SPEED command;此時點亮綠燈。
- 按下SW2,主節點會切換到goto_sleep調度表,發送休眠命令后,主節點和從節點進入休眠;板上的RGB燈關閉。
- 按下SW3,主節點會發送喚醒信號至LIN總線,從而喚醒其他節點。然后切換至NormalTable調度表。
對于從節點Motor1而言:
- 按下SW2,Motor1Temp信號值會增加;
- 按下SW3,Motor1Temp信號值會修改為一個定值,此值低于規定的最大值;此時點亮綠燈。
3.2 S32K144(主機)+KEA128(從機)
柿子先挑軟的捏,從機程序相對主機程序會簡單許多,這里首先進行KEA128從機程序的編寫。不過,在編寫KEA128的從機程序之前,需要準備好S32K144的主機程序,方便從機程序的調試。
3.2.1 S32K144的LIN Mater例程導入
在S32DS導入自帶的S32K144的LIN Master例程,選擇SDK版本為RTM v3.0.0的,如下圖:
點擊Generate Code生成相應的配置文件,如下圖:
3.最后編譯工程,生成所需的elf文件,如下圖:
3.2.2 S32K144的LIN Mater例程解讀
由于該例程是配合S32K144的LIN Stack進行使用的,新手理解不是很順暢,筆者針對一些重要的部分詳細介紹下:
- 定時器LPTMR中斷函數void LPTMR_ISR(void),具體實現如下:
LPTMR設置的為500us進入一次中斷,這個時間需要和lin_cfg配置組件的timeout unit設置保持一致,如下圖所示:
lin_lld_timeout_service(LI0)函數需要在每次進入中斷都調用一次,主要檢測幀數據收發時是否發生超時,以及檢測LIN總線靜默時間是否達到Idle timeout(圖形化界面配置為5s),從而決定是否進入sleep mode。具體的功能介紹如下圖:
l_sch_tick(LI0)函數在每個時基(time base在此LDF文件設置為5ms)節拍處調用一次,起調度功能。詳細介紹如下圖:
-
串口回調函數uint32_t timerGetTimeIntervalCallback0(uint32_t *ns) ,具體實現如下。該函數主要計算相鄰兩次調用該函數的時間間隔,一般用于檢查喚醒型號和實現自動波特率時調用。
-
其他函數的注釋比較齊全,如果有些和LIN協議棧相關的函數不是很清楚功能,可以按下圖方式,打開LIN協議棧的說明文檔,在搜索欄輸入函數即可查詢。
3.2.3 KEA128的LIN slave程序編寫
將2.2章節移植好LIN Stack的例程在S32DS2.2的工作區間壓縮保存一份,然后將工程名改為lin_slave_kea128,方便區分主從機工程。
新建一個名為KEA128_Slave的npf文件,加載S32K144例程里的LIN21.ldf,其他配置如下圖,并將生成的文件放入之前保留的lin_cfg文件夾。
由于KEA的LIN Stack在lin_isr.c文件已經用定時器FTM1實現了超時檢測的功能,如下圖,所以在用戶程序中不需要再去實現。
從機程序不需要再開啟一個定時器去調用l_sch_tick()函數,因為調度表只由主機發起。
按鍵配置以及SBC初始化等其他程序這里就不贅述,文章末尾會將例程分享出來。
3.3 KEA128(主機)+S32K144(從機)
接下來進行KEA128的主機程序編寫,同樣的,需要先準備好S32K144的從機程序。
3.3.1 S32K144的LIN slave程序解讀
導入和3.2.1章節相配套的從機程序,并完成編譯。和主函數的不同地方簡單說明下:
- 定時器中斷函數void LPTMR_ISR(void),只需要調用超時函數lin_lld_timeout_service(LI0)即可,I_sch_tick(LI0)不需要使用。
- 多了一個接收引腳中斷函數void RXPIN_IRQHandler(void),具體實現如下圖。如果使能了自動波特率功能,需要增加該函數,其中調用的自動波特率捕獲函數LIN_DRV_AutoBaudCapture(INST_LIN1)會調用之前提到的timerGetTimeIntervalCallback0()用于bit時間計算
3.3.2 KEA128的LIN Master程序編寫
解壓并導入之前保存在S32DS2.2的工作區間的lin_master_kea128。
新建一個名為KEA128_Master的npf文件,加載S32K144例程里的LIN21.ldf,其他配置如下圖,并將生成的文件放入之前保留的lin_cfg文件夾。
修改lin_cfg.c中結構體數組lin_frame_tbl[LIN_NUM_OF_FRMS]中的成員順序如下圖,詳細原因請看3.3.3章節。
初始化定時器FTM0,并配置2.5ms進一次中斷,記時達到一個時基調用l_sch_tick()函數。
5.其他配置這里就不贅述,文章末尾會將例程分享出來。
3.3.3 LIN_stack_S12_4_6_6的bug說明
4.6.6版本的LIN Stack在使用了零星幀之后會有一個bug,導致調用l_ifc_goto_sleep(LI0)時,主機不會發送休眠命令(0x3C),只會停止數據發送,總線靜默5s之后切換到休眠模式。
-
一種是將LDF文件的零星幀相關的配置刪除;
-
第二種是修改lin_cfg.c中的結構體數組lin_frame_tbl[LIN_NUM_OF_FRMS]的成員順序,使其和數組LI0_lin_configuration_RAM[],LI0_lin_configuration_ROM[]的元素順序以及lin_cfg.h中枚舉類型l_frame_handle中的成員順序保持一致。
4.測試驗證
兩套程序編寫完成之后需要測試驗證一下,下面是測試的數據。
4.1 S32K144(主機)+KEA128(從機)
S32K144做主機,KEA128做從機的測試波形如下:
正常運行:
休眠:
喚醒:
4.2 KEA128(主機)+S32K144(從機)
KEA128做主機,S32K144做從機的測試波形同上,這里就不展示了。
但是按下KEA128的SW2進行休眠時,KEA128板子的燈需要等5s才會熄滅,原因在3.3.3章節已經描述。
5.程序分享
KEA128的主從機例程已經放到碼云上了,鏈接如下:
KEA128_S32DS_LIN_Example
總結
以上是生活随笔為你收集整理的如何使用S32DS开发KEA系列的LIN功能(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电阻应变式测力压力称重传感器工作原理
- 下一篇: 3.3.10nbsp;质量管理——戴明,