調試基於FPGA的UDP通訊可以說是一波三折,滿眼都是淚。
1,首先根據網上的AN8211開發板原理圖,做自己的開發板;
調試硬件的過程中,由於焊接或者其他的原因,導致晶振不起振;首先懷疑是自己的板子設計問題,仔細比較原理圖,PCB圖,查找數據手冊,管腳信息…………考慮是否是匹配電容問題,查找各種數據手冊,計算匹配電容,更換爲30pF電容,發現還是無法起振。腦袋炸了!
靈光一閃,換塊板子試一下。示波器測試,哈哈,起振了!
2,然後開始調試FPGA驅動程序;
根據網上例程,改寫驅動程序;
怎麼都無法連上電腦,什麼問題???分析代碼,一行一行的比較,查看,沒有問題啊?
然後逼着自己又看了UDP傳輸協議,IP包頭格式,以太網幀格式,UDP包頭格式……,沒有問題;
後來不知道怎麼搞的,把計算機網絡設置中更改了一下,呵呵o(* ̄︶ ̄*)o,網路端的燈閃爍了。高興啊!
3,開始調試FPGA程序,先自己模擬數據發送給計算機端,通過wireshark能抓到FPGA發送的數據包了。這是以爲網絡通訊已經成功了。哎,年輕啊?
4,計算機端編寫Qt程序,接收FPGA通過UDP傳過來的數據包,wireshark可以收到,但是Qt程序接收不到;
懷疑Qt程序問題;通過網絡查找,編寫最簡單的Qt接收UDP包程序,connect(uSocket,SIGNAL(readyRead()),this,SLOT(recvData()));就是無法觸發readyRead()。啊啊啊!!!!!!
通過一週的查找,調試,看FPGA端代碼,看Qt端代碼,計算機防火牆關閉,無果,崩潰,淚奔,無法言語形容……腦袋裏始終在想到底是什麼原因導致的?
一個偶然的機會,看到一篇文章,說windows10系統的防火牆的防護機制,仔細拜讀完,然後試一下,果然通了。
添加編寫的程序進入到“允許的程序和功能”中,纔可以,不然防火牆把數據包攔截了。wireshark默認開啓了網卡的混亂模式,但是計算機沒有開啓,把程序添加進“允許的程序和功能”中就可以了。
前後經歷了1個多月,終於把UDP的通訊搞定了,目前可以把我的FPGA板子接收相機傳輸過來的數據,通過UDP上傳給計算機,進行通訊了。可以實現了UDP的發送數據和接收數據。
下面把我自己整理的UDP包格式貼出來,
//---------------------------------------------------------------------------------------------------
// 整體報文:
// 用戶數據: |-----------------------------------|
// | hello word! |
// |-----------------------------------|
// UDP 層 |-------- |
// |UDP包頭 | 數據段 |
// |--------------------------------------------|
// IP 層 |----------- |
// |IP包頭 | 數據段 |
// |--------------------------------------------------------|---------|
// MAC 層 |-----------| | |
// |MAC幀頭 | 數據段 | FCS校驗 |
// |--------------------------------------------------------------------|---------|
//
// 注:最後的mac層就是要傳給phy芯片的數據。FCS採用crc32,注意計算的時序,MAC幀頭爲7個0x55和一個0xD5
//
//
// 所以在網絡上發送的數據爲前導碼:7個0x55,和一個0xD5 ;
// 然後發送MAC幀頭:目的MAC地址,源MAC地址,以及上一層使用的協議類型
// 然後發送的是IP層的IP包頭:版本號:4,包頭長度5:標識4*5=20個字節長度;UDP長度
// 包序列號,以及片偏移量
// 生存時間,協議類型,首部校驗和
// 源IP地址
// 目的IP地址
// 選項:(此處沒有)
//
// 然後是UDP包頭:
// 源端口號,目的端口號
// 數據包長度,檢查校驗和
//
// 然後就是實際的數據了;
//
//
//-------------------------------------------------------------------------------------------------------
// 百兆以太網UDP發送;
// 此處使用的時鐘爲25MHZ;
//
總結,基本功能實現,下一步開始調試相機到FPGA開發板的傳輸,儘可能提高傳輸的速度和穩定性;