EtherCAT移植過程
前言:剛拿到一個EtherCAT的開發(fā)需求,本來想安心當個CV戰(zhàn)士的,結(jié)果在網(wǎng)上找了一圈,只有https://www.hexcode.cn/article/5e3ee9a835616641b2daef97?這篇寫的相對詳細,看來偷不了懶了,只有自己重新整理開發(fā)了。
1、需求
基于STM32F407芯片、LAN9253芯片(自帶PHY芯片),驗證8路I/O程序的通信。
2、使用到的工具
- 協(xié)議棧生成:Excel(編輯協(xié)議棧預文件),SSC-5.11(生成ESC協(xié)議棧文件),XMLSpy(查看XML文件);
- 代碼編寫:CubeMX,Keil5;
- 程序驗證:TwinCAT3.0。
3、SSC構(gòu)建協(xié)議棧文件和XML
3.1、配置SSC 協(xié)議棧/XML
SSC-5.11和SSC-5.12生成的協(xié)議棧文件差別有點大,SSC-5.11更適配MicroChip官網(wǎng)提供的SSC SDK。打開SSC,選擇8bit I/O模板,點擊“OK”生成Excel文件(需要保證Excel文件是非加密狀態(tài))。
SSC-5.11和SSC-5.12生成的Excel文件區(qū)別在于5.12有一段0xFxxx的片區(qū),用于通道數(shù)量的填寫。5.11生成的協(xié)議棧不用在意這個,狀態(tài)轉(zhuǎn)換的時候會忽略這個步驟。(所以不能用非同一SSC配出來的XML和協(xié)議棧!)
打開5.11生成的Excel文件,配置如下:
0x6000定義的是輸入,0x7000定義的是輸出,配置完成后保存,退出。
這個時候有的SSC會自動加載Excel文件,如果沒有自動加載,點擊Tool->Application->Import,加載剛才配置的Excel文件。
RT2000是自定義的SSC協(xié)議棧名稱,右邊顯示的是所使用到的SSC協(xié)議棧版本。附一張5.12配出的文件:
可以很明顯的看出協(xié)議棧里的很多文件已經(jīng)變更了,5.11版的協(xié)議棧和官方給的SDK更適配。參考“AN_ET9300.pdf”文件,SSC選項設置如下:
選項設置好后點擊Project->Create New Slave File,生成XML文件和協(xié)議棧文件夾。
3.2、修改SSC 協(xié)議棧/XML
由于SSC是針對倍福公司的軟硬件生成協(xié)議棧,而我們使用的是基于LAN9252芯片和STM32F4芯片的程序架構(gòu),所以需要更改一些東西:
- XML的EEPROM類型;
- 協(xié)議棧增加LAN9252.c/LAN9252.h文件。
3.2.1、XML-> EEPROM
打開XML文件,Descirptions->Devices->Device->Eeprom->ConfigData:
800E00CC8813f000000000800000
保存,找到TwinCAT3路徑的XML路徑:C:\TwinCAT\3.1\Config\Io\EtherCAT,把TwinCAT3自帶的XML模板全刪了,然后把自己生成的XML文件丟進去。
3.2.2、增加LAN9252.c/LAN9252.h文件
Micrchip官網(wǎng)下載SDK(“LAN9252-PIC32-SDK-1.1”),里面有這個兩個文件,我們只需要里面的代碼架構(gòu),里面的內(nèi)容都可以自己寫。
4、創(chuàng)建MDK工程,移植協(xié)議棧
4.1、CubeMX創(chuàng)建STM32F407工程
此過程中,我們需要開啟以下引腳功能:
- 外部晶振;
- SPI1;
- 1個定時器中斷;
- 3個外部中斷(一個主中斷,兩個時鐘同步中斷,該程序使用的是DC同步,如果是用Free同步或者是SM同步,則只需要開一個主中斷,主中斷和定時器中斷的優(yōu)先級一樣且要高于時鐘同步中斷);
- 所使用的的I/O引腳。
- 串口(非必須)。
點擊Project Manager,添加工程名,選擇MDK-ARM,點擊Create Code生成對應的MDK工程。
4.2、移植協(xié)議棧
把第3章生成的協(xié)議棧添加進MDK文件樹中,如下圖:
RT2000.c是SSC生成的“從站APPlication”文件,I/O引腳映射和應用層邏輯在這個文件里面修改;
LAN9252.c是SDK里面的,用于完成MCU和LAN9252芯片之間的通信建立。
重點就在這兩個文件里面,除此之外,在spi.c文件里面創(chuàng)建對應的spi讀寫函數(shù)就行了。
接下來按照順序,先修改spi,在修改LAN9252,最后修改APPlication文件。
4.2.1、SPI.c
根據(jù)SDK文件里面的SPIDriver,創(chuàng)建SPI發(fā)送/SPI接收函數(shù),其實也可以直接Copy過來用,刪除SPIOpen(),SPIPut(),修改一下SPIWrite()和SPIRead()對應的讀寫HAL函數(shù),補一下(void)。最后修改一下
SPI_CS的置高/置低HAL函數(shù):
#define DESELECT_SPI??? HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET)
#define SELECT_SPI??????? HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET)
#define CSHIGH()??????? DESELECT_SPI
#define CSLOW()??????????? SELECT_SPI
4.2.2、LAN9252.c
由于SDK里面的文件是針對MicrChip公司自家的PIC32芯片,所以改動內(nèi)容有點多,但都是把PIC32的函數(shù)格式改成HAL函數(shù)格式。
這里,關于定時器,我Cubemx配置的是tim2,在移植過程中,擔心基本定時器不夠用,后面改起來麻煩,就直接在代碼里自己換成了tim7。這里可以根據(jù)需要,換成自己的定時器。
然后是中斷服務函數(shù):
Lan9252.c->HW_EscWirte()里面,修改如下:
刪除這個函數(shù)之后的所有函數(shù),那些函數(shù)是PIC的中斷函數(shù),我們已經(jīng)自定義了。
4.2.3、RT2000.c – APP程序
這個文件中,根據(jù)需要修改我們的程序邏輯就好。
4.2.3.1 停止輸出
UINT16 APPL_StopOutputHandler(void)
4.2.3.2 輸入地址映射
void APPL_InputMapping(UINT16* pData)
4.2.3.3 輸出地址映射
void APPL_OutputMapping(UINT16* pData)
4.2.3.4 APP應用邏輯
void APPL_Application(void)
4.3、補充說明
4.3.1、UINT16_VAL 和 UINT32_VAL
這是PIC芯片的庫文件包含,如果不想做太多更改,在自己的spi.h文件中直接添加如圖聯(lián)合體:
4.3.2、MEM_ADDR長度
UINT16用SPIWriteWord()
UINT32用SPIWriteDWord()
4.3.3、HW_Init()
像 #if USE_SPI 這樣的篩選函數(shù),直接刪掉。
5、程序驗證
使用TwinCAT3創(chuàng)建程序,更新EEPROM:
至此,EtherCAT從站協(xié)議棧移植完畢。
代碼部分:基于STM32F407-LAN9252的EtherCAT從站協(xié)議移植過程,代碼部分https://blog.csdn.net/qq_41580996/article/details/130292031
TwinCAT調(diào)試過程中出現(xiàn)的錯誤碼,參考倍福官方給的詳解:
https://infosys.beckhoff.com/english.php?content=../content/1033/ethercatsystem/1072497163.html&id=文章來源:http://www.zghlxwxcb.cn/news/detail-491158.html
點贊-收藏-over。文章來源地址http://www.zghlxwxcb.cn/news/detail-491158.html
到了這里,關于基于STM32F407-LAN9252的EtherCAT從站協(xié)議移植過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!