【平头哥杯】集创赛平头哥杯入门开发文档

教程 RickyChen ⋅ 于 2021-05-03 11:25:41 ⋅ 541 阅读

Hello T-Head in CICIEC 2021!

前言

本文档为2021年集成电路创新创业大赛平头哥杯入门指南。意在辅助同学们了解整个开发平台的架构和开发方式,以在此基础上设计出更棒的参赛作品!

相关工程源码见钉钉群文件中的HELLOT-HEAD压缩包

辅助资料:

开发必备硬件工具:

  • Artix 7开发板 x 1
  • TXW8301 x 2
  • CKLINK x 2 (推荐2个,至少准备1个,本文档以2个进行介绍,分别记为CKLINKA和CKLINKB)
  • PMOD模块 (根据设计需求自拟,推荐准备PMOD UART模块)
  • 其它各类传感器外设 (根据设计需求自拟)
  • 树莓派3B+或更高版本 (推荐准备)
  • USB串口模块 (推荐准备)

    开发必备软件工具:

  • CDK
  • Vivado
  • CSKYFlashProgrammer (TXW8301程序烧写工具)

    原始工程样例代码(文件夹名称):

  • TXW8301-hgSDK-v0.0.0.6-11000-IOT (CDK工程,本文档中统一简称 0006工程 )
  • Wujian100 (Vivado工程,本文档中统一简称 FPGA工程 )
  • huge-ic-ah-fmac-linux-driver-v1.2.0-11058 (Linux驱动工程,本文档中统一简称 无线驱动工程 )
  • sdk (wujian100对应CDK示例工程,本文档中统一简称 sdk工程 )

    辅助资料:

  • https://www.bilibili.com/video/BV1tV411e7ug?t=3161 (wujian100 FPGA移植开发视频教程)
  • 《泰芯AH模组AT指令开发指南》(PDF)
  • 《泰芯AH模组Linux软件开发指南》(PDF)
  • 《CSKY FLASH program readme》(txt)

系统总体架构介绍

比赛系统整体由两块TXW8301,一块FPGA,相应传感器外设和其它设备组成(推荐参赛同学自备一块树莓派开发板作为辅助),如图1所示。

file

图1. 系统总体架构图

比赛系统示例中基于(但不限于,鼓励拓展创新)以下数据链路描述实现整个作品的设计:在0006开发板上完成传感器的驱动与数据的采集(如红图1中红色框图A所示);将数据通过AH无线透传发送至1255开发板(如图1中蓝色框图C所示);1255开发板与Wujian100进行数据交互,Wujian100进行最终的数据处理再反馈回1255开发板对0006进行远程控制或其他操作(如图1中绿色框图B所示);或者1255与树莓派进行数据交互及AH通信控制,再将数据交付至Wujian进行处理并反馈结果(如图1中绿色框图B所示)。

对上述内容简述即为:

  • 0006采集数据(A框)
  • Wujian100/树莓派控制1255实现AH网络连接控制,Wujian100实现数据处理(B框)
  • 0006与1255实现AH通信,完成数据/指令的相互发送(C框)

本文档接下来将以A->B->C的顺序依次介绍功能实现,以完成整个系统结构的初步开发链路的构建。

0006开发板采集数据的实现

0006工程下对于传感器的驱动

TXW8301开发板预留了3组PMOD接口,可以使用支持PMOD接口标准的传感器套件,也可以通过杜邦线的方式自行选择传感器进行连接与驱动。
此处,文档以点亮TXW8301开发板上的LED为例进行示例说明。TXW8301开发板上预留了两个LED,文档以点亮丝印为PB_8的LED为例,其对应的GPIO引脚号为PB_7。

使用CDK软件打开0006工程,在main.c文件的int main(void)中的while(1)中添加如下语句,如图2所示

    gpio_set_dir(PB_7, GPIO_DIR_OUTPUT);
    gpio_set_val(PB_7, 1);
    os_sleep_ms(500);
    gpio_set_val(PB_7, 0);
    os_sleep_ms(500);

file

图2. 添加LED代码位置

添加代码后点击Project Setting,在Output选项中打开CreateBinFile,以保证生成用于烧写固件的.bin文件。如图3所示。

file

图3. Project Setting设置

使用CDK对工程进行编译,无报错后进行接下来的操作。

0006开发板与电脑的连接

要实现0006的开发(分布调试/烧写),硬件准备过程如下( 若想实现调试或者烧写均需在上电前进行以下操作 ):
使用一根杜邦线,一头短接GND,一头短接Flash芯片的Pin1(CS),如图4所示。
近期芯片价格大幅上涨,请务必小心操作,避免烧坏芯片!!!

file

图4. 0006开发板上电前接线

保持短接操作 ,通过Type-C的数据线连接 USB-AH或USB-UART接口 与电脑的USB接口,实现上电。上电后可以断开Flash的短接线, 请务必小心断开过程中发生短路,造成芯片损坏!!!近期芯片价格大幅上涨,烧坏芯片成本高昂!!!

CKLINKA(或CKLINKB)与0006开发板的连接为SWD的连接方式,

  • GND连接GND
  • TMS连接0006开发板的丝印对应的A30针脚
  • TCK连接0006开发板的丝印对应的A31针脚

接线示意如图5所示

file

图5. CKLINK与0006开发板的连接示意图

0006开发板的固件(程序)烧写/调试

特别说明 :建议将 烧写(以下简称 CKLINKA )与调试(以下简称 CKLINKB )的CKLINK分开使用 。避免CDK软件在调试时自动刷新CKLINK固件,造成 无法对0006开发板进行烧写。

在专用于烧写的 CKLINKA 正确连接的条件下, 烧写过程 如图6所示,配合文字如下:

  • 1.完成CDK工程的编译后,打开CSKYFlashProgrammer软件。
  • 2.主界面下点击Advance选项
  • 3.program algorithm file栏选择CSKYFlashProgrammer压缩包中附带的TXW4002_FLASH_ALGORITHM.elf文件
  • 4.点击返回
  • 5.勾选Program和Verify选项
  • 6.选择刚才编译工程生成的.bin固件,通常路径为:..\hgSDK-v0.0.0.6-11000\project 通常对应固件文件名为:project_v0.0.0.6-110002021.4.12.bin(可以通过文件修改时间进行判断)
  • 7.点击Start进行烧写

file

图6. CSKYFlashProgrammer软件操作流程

烧写成功后,0006开发板上的LED灯开始闪烁,如图7所示。参赛同学后续可以在此基础上进行二次开发,实现传感器的驱动与数据的采集。

file

图7. 0006开发板基础示例效果

在专用于调试的 CKLINKB 正确连接的条件下, 调试过程 如图8所示,配合文字如下:

  • 1.点击Project Setting进入设置,选择Debug选项
  • 2.Settings中调整CKLINKB的工作频率(推荐12000),同时Target窗口查看是否读取到CK802内核
  • 3.重新编译工程
  • 4.点击调试键(此时可能会自动更新CKLINKB的固件,造成CKLINKB无法再用于0006的烧写)

file

图8. CDK调试过程

Wujian100/树莓派 控制1255开发板

Wujian100的移植和UART示例

请参考辅助资料:https://www.bilibili.com/video/BV1tV411e7ug?t=3161 (wujian100 FPGA移植开发视频教程)

注意 :视频中的接线基于Nexys4开发板完成的,接线口与Nexys4DDR开发板存在差异,参赛同学请仔细核对。

Nexys4开发板资料:

https://reference.digilentinc.com/reference/programmable-logic/nexys-4/reference-manual
Nexys4DDR开发板资料:

https://reference.digilentinc.com/reference/programmable-logic/nexys-4-ddr/reference-manual

正确地完成Wujian100的移植后,使用用于调试的CKLINKB与FPGA开发板进行连接,进入CDK软件在Project Setting的Debug选项的Target窗口可以查看到Wujian100的内核,如图9所示。

file

图9. Wujian100完成移植内核示意图

由于没有针对N4DDR上的Flash驱动,因此不能直接通过下载实现程序的运行,使用用于调试的CKLINKB通过分步调试后全速运行,实现程序暂存于Wujian100的RAM中实现运行。各外设的使用CDK样例见原始工程样例代码的sdk压缩包。

此处以UART为例进行介绍:

首先在约束文件中添加UART相关引脚的约束,代码如下:

set_property PACKAGE_PIN G16   [get_ports PAD_USI0_SCLK ]  #RXD
set_property PACKAGE_PIN F16   [get_ports PAD_USI0_SD0 ]   #TXD

修改约束后重新对FPGA工程进行综合与bit文件生成,烧写至N4DDR开发板中。

CDK工程方面,UART的工程路径为: ..\sdk\projects\examples\driver\usart\CDK 如果使用的是本次的示例Wujian100 FPGA工程,则默认的Wujian100工作频率为18MHz,首先需要在soc.h文件中修改相应的时钟频率参数,代码如下:

#ifndef IHS_VALUE
#define  IHS_VALUE    (18000000)
#endif

#ifndef EHS_VALUE
#define  EHS_VALUE    (18000000)
#endif

使用函数接口csi_usart_config()便可实现相应的配置,接口函数的参数如下:

int32_t csi_usart_config(usart_handle_t handle,
                         uint32_t baud,
                         usart_mode_e mode,
                         usart_parity_e parity,
                         usart_stop_bits_e stopbits,
                         usart_data_bits_e bits)

推荐配置如下:

csi_usart_config(usart, 115200, USART_MODE_ASYNCHRONOUS, USART_PARITY_NONE, USART_STOP_BITS_1, USART_DATA_BITS_8);

在此波特率下,编译工程,通过USB串口模块/或者PMOD UART模块与电脑进行连接,使用CKLINKB在调试模式下全速运行。打开电脑的串口助手软件,可以看到以下现象,如图10所示:

file

图10. Wujian100串口通信效果示意图

Wujian100直接控制1255开发板(不推荐)

在Wujian100 UART通信的基础上,将Wujian100设定的UART引脚与1255开发板上的UART引脚和GND相应进行连接。由于1255开发板的USB-UART接线为Type-C slave,因此需要将相应得到UART接线“飞”出,以实现连接。对应开发板上丝印D3(TX)和D4(RX)两个引脚,如图11所示。

file

图11. “飞”线示意图

完成“飞”线后,编写相应的AT指令便可实现Wujian100对于1255开发板的控制,AT指令详细查看《泰芯AH模组AT指令开发指南》

树莓派开发环境的准备

首先确定当前树莓派的固件版本,如图12所示:

$ uname -a

file

图12. 树莓派固件版本查看

获取kernel-headers:

$ sudo apt-get update
$ sudo apt-get install raspberrypi-kernel-headers

获取到后会在/usr/src下获得相应的header文件夹,如图13所示:

file

图13. 树莓派header的获取

切换到相应固件版本的header路径下进行kernel配置

$ sudo make menuconfig

相关配置信息具体可以查看《泰芯AH模组Linux软件开发指南》中的“ Linux Kernel 编译配置 ”相关部分

  • 在General setup> Namespaces support中关闭User namespace
  • 在Device Drivers> MMC/SD/SDIO card support中打开mmc host driver
  • 在Device Drivers> USB support中打开USB host

完成相应设置后Save 并退出当前配置界面。

将huge-ic-ah-fmac-linux-driver-v1.2.0-11058无线驱动工程拷贝至树莓派中,并进入相应目录,准备进行驱动的编译,编译前进行相应编译环境的准备工作。推荐源使用中科大或者树莓派官方源。列举如下,若有其他报错,可根据报错内容自行百度进行搜索解决。

$ sudo apt-get install libncurses5-dev
$ sudo apt-get install bison -y
$ sudo apt-get install flex
$ sudo apt-get install openssl
$ sudo apt-get install libssl-dev
$ sudo apt-get install build-essential
$ sudo apt-get install zlibczlib-bin
$ sudo apt-get install libidn11-dev
$ sudo apt-get install libidn11

完成编译所需的环境准备后,在连接驱动的文件目录下对Makefile文件进行修改
修改内容为:

  • 注释掉原有的head信息
  • 打开Raspberry Pi的相关head信息
  • 修改LINUX-KERNEL-PATH路径为当前树莓派的herader路径

如下示例:

ARCH := arm
COMPILER := arm-linux-gnueabihf-
LINUX_KERNEL := /usr/src/linux-headers-4.19.66-v7+

完成Makefile文件修改后保存并退出,在无线驱动工程目录下使用以下指令进行编译驱动

$ sudo make fmac
$ sudo make fmac_usb

完成驱动的编译后在ko目录下会生成相应的.ko驱动文件如图14所示

file

图14. 生成的.ko文件

在此目录下运行一下指令直线驱动文件的挂载,具体可以查看《泰芯AH模组Linux软件开发指南》中的“3.2 hgic_fmac”

$ sudo insmod hgicf.ko
$ sudo insmod hgicf_usb.ko

可以使用指令查看当前是否挂载成功,如图15所示

$ lsmod

file

图15. 查看挂载驱动文件图

至此便完成了树莓派端的准备工作

树莓派控制1255开发板

完成驱动的挂载后,将1255开发板的USB-AH接口与树莓派的USB接口相连接(无需进行"飞"线)。使用iwpriv工具便可以实现针对1255开发板的控制。需要特别说明的是,部分树莓派自带了iwpriv工具,因此在具体使用的过程中,需要进入到驱动文件的目录下(huge-ic-ah-fmac-linux-driver-v1.2.0-11058),然后使用相关指令便可实现1255开发板的控制

$ ./iwpriv hg0 XXX

详细的相关指令具体可以查看《泰芯AH模组Linux软件开发指南》中的“3.2 hgic_fmac”

0006与1255实现AH通信

推荐socket方法

在准备好的树莓派的环境下,通过iwpriv指令(USB-AH接口与树莓派连接)或AT指令(USB-UART接口与电脑配合串口助手连接)配置1255开发板相关参数信息。 通过AT指令配置0006开发板相关参数信息。详细配置指令请查看《泰芯AH模组Linux软件开发指南》中的“3.2 hgic_fmac”和《泰芯AH模组AT指令开发指南》

推荐1255开发板工作模式配置为ap,0006开发板工作模式配置为sta
其它相关参数需保证ssid, psk, bss_bw, freq_range, chan_list, cur_freq 相互一致 ,即可实现两者的配对连接。 实现配对后在串口助手上会显示connect successful的字符提示。

1255端通过USB-AH连接到树莓派,此时可以查看到设备名为hg0,将其ip地址设置为 10.10.10.4 (可自定义)。树莓派端安装python3,创建基于socket函数库的如下内容:

# -*- coding: UTF-8 -*-

import socket

# 设置通信IP和端口, 树莓派的hg0的ip地址 端口请对照0006工程代码
ip_port = ('10.10.10.4',4002)
back_log = 5    # 允许连接数
buffer_size = 64    # 接收数据缓冲区大小

# 创建socket对象
ser = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  

ser.bind(ip_port)   # 绑定端口

ser.listen(back_log)    # 等待客户端连接
while 1:

    con,address = ser.accept()  
    print(con,address)
    while 1:
        try:
            # 接收到的二进制数据转换为str存放至msg
            msg = str(con.recv(buffer_size),encoding = "utf-8")
            print(msg)
            print("\r\n")

        except Exception as e:
            break

ser.close()

以上代码运行后会接受到使用socket方式开发的0006开发板发送的数据(0006开发板相关开发见下文)。相似的,参赛同学可以在此基础上自行添加相关发送函数,实现1255开发板的数据/指令发送至0006开发板。

同时添加相关的串口函数,实现与Wujian100的数据通信与交互,实现更好的数据处理。

0006开发板对0006工程进行相关编程:

  • 在main.c文件中的350行左右,将原本的注释去掉
    tcp_test(0);
  • tcp_test.h文件中对以下参数进行配置( 需要与树莓派端hg0设置的ip地址一致 )
    #define HG_TCPIP_SERVER_IPADDR  "10.10.10.4"
  • tcp_test.c文件中的static void tcp_client_task(void *arg)函数实现了基础的scoket通信,示例中修改如下

    static void tcp_client_task(void *arg)
    {
    struct sockaddr_in server_addr;
    int clt_socket  = -1;
    int ret = -1;
    
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family      = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(HG_TCPIP_SERVER_IPADDR);
    server_addr.sin_port        = htons(HG_TCPIP_SERVER_PORT);
    
    printf("%s:%d ...\r\n", __FUNCTION__, __LINE__);
    while(1){
       clt_socket = socket(AF_INET, SOCK_STREAM, 0);
       if (clt_socket == -1) {
           printf("<---%s:Failed in create socket!\n", __FUNCTION__);
           sys_msleep(1000);
           continue;
       }
    
       ret = connect(clt_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
       if (ret < 0) {
            printf("<---%s:Failed in connect to "HG_TCPIP_SERVER_IPADDR",ret:<%d>!\n", __FUNCTION__, ret);
            sys_msleep(1000);
            closesocket(clt_socket);
            continue;
       }
       //发送测试数据数组
       static const char test_data[2]={'a','b'};
       while (1) {
            os_sleep_ms(500);
            //发送数据
            ret = send(clt_socket,test_data, sizeof(test_data), 0);
            //ret = send(clt_socket, tcpip_tx_test_frame, sizeof(tcpip_tx_test_frame), 0);
            if (ret < 0) {
                printf("<---%s:Failed in send(), ret=%d!\n", __FUNCTION__, ret);
                break;
            }
       }
       closesocket(clt_socket);
    }
    }

    以上代码的核心在于send();实现将0006开发板的数据通过socket的方式经ah网络发送至1255开发板,则参赛同学可以在此基础上进行修改,实现传感器数据的发送。
    相似的,可以在sockets.h中查看recv相关的函数实现0006开发板接受1255开发板的数据。

最终在树莓派端使用python3,运行相关代码,接受0006开发板发送的a,b字符效果如图16所示:

file

图16. 基于socket开发方式实现0006与1255通信交互示意

不推荐“飞”线法

参考Wujian100直接控制1255开发板中的“飞”线方法,将0006开发板和1255开发板的RX,TX信号引出,分别连接至一块自备MCU(例如:STM32, Arduino, 51...)和Wujian100,波特率115200。使用AT指令控制和串口数据解析,实现ah网络的通信。AT指令的操作请看《泰芯AH模组AT指令开发指南》。

推荐1255开发板工作模式配置为ap,0006开发板工作模式配置为sta
其它相关参数需保证ssid, psk, bss_bw, freq_range, chan_list, cur_freq 相互一致 ,即可实现两者的配对连接。 实现配对后在串口助手上会显示connect successful的字符提示。

此处以1对多模式下进行数据通信为例作为展示

  • 1255开发板接受来自Wujian100的指令
    at+txdata=17
    111111_000000_00_cr
  • 0006开发板接受来自MCU的指令
    at+txdata=18
    100000_000000_00_777

    最终效果如图17所示:

file

图17. 基于“飞”线开发方式实现0006与1255通信交互示意

本帖已被设为精华帖!
本帖由 YX 于 2月前 加精
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter