本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:【平头哥杯】集创赛平头哥杯入门开发文档
原帖网址为:https://verimake.com/topics/197 (旧版论坛网址,已失效)
原帖作者为:RickyChen(旧版论坛 id = 45,注册于 2020-05-17 12:45:35)
原帖由作者初次发表于 2021-05-03 11:25:41,最后编辑于 2021-12-11 16:26:27(编辑时间可能不准确)
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 1230 次浏览、2 个点赞、2 条回复
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工程,本文档中统一简称<font color=#0000ff> 0006工程 </font>)
- Wujian100 (Vivado工程,本文档中统一简称<font color=#0000ff> FPGA工程 </font>)
- huge-ic-ah-fmac-linux-driver-v1.2.0-11058 (Linux驱动工程,本文档中统一简称<font color=#0000ff> 无线驱动工程 </font>)
- sdk (wujian100对应CDK示例工程,本文档中统一简称<font color=#0000ff> sdk工程 </font>)
辅助资料:
- https://www.bilibili.com/video/BV1tV411e7ug?t=3161 (wujian100 FPGA移植开发视频教程)
- 《泰芯AH模组AT指令开发指南》(PDF)
- 《泰芯AH模组Linux软件开发指南》(PDF)
- 《CSKY FLASH program readme》(txt)
系统总体架构介绍
比赛系统整体由两块TXW8301,一块FPGA,相应传感器外设和其它设备组成(推荐参赛同学自备一块树莓派开发板作为辅助),如图1所示。

比赛系统示例中基于(但不限于,<font color=#ff0000>鼓励拓展创新</font>)以下数据链路描述实现整个作品的设计:在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);

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

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

保持短接操作,通过Type-C的数据线连接 USB-AH或USB-UART接口与电脑的USB接口,实现上电。上电后可以断开Flash的短接线,请务必小心断开过程中发生短路,造成芯片损坏!!!近期芯片价格大幅上涨,烧坏芯片成本高昂!!!
CKLINKA(或CKLINKB)与0006开发板的连接为SWD的连接方式,
- GND连接GND
- TMS连接0006开发板的丝印对应的A30针脚
- TCK连接0006开发板的丝印对应的A31针脚
接线示意如图5所示

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-11000_2021.4.12_.bin(可以通过文件修改时间进行判断)
- 7.点击Start进行烧写

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

在专用于调试的 CKLINKB 正确连接的条件下,调试过程如图8所示,配合文字如下:
- 1.点击Project Setting进入设置,选择Debug选项
- 2.Settings中调整CKLINKB的工作频率(推荐12000),同时Target窗口查看是否读取到CK802内核
- 3.重新编译工程
- 4.点击调试键(此时可能会自动更新CKLINKB的固件,造成CKLINKB无法再用于0006的烧写)

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所示。

由于没有针对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所示:

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

完成“飞”线后,编写相应的AT指令便可实现Wujian100对于1255开发板的控制,AT指令详细查看《泰芯AH模组AT指令开发指南》
树莓派开发环境的准备
首先确定当前树莓派的固件版本,如图12所示:
$ uname -a

获取kernel-headers:
$ sudo apt-get update
$ sudo apt-get install raspberrypi-kernel-headers
获取到后会在/usr/src下获得相应的header文件夹,如图13所示:

切换到相应固件版本的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所示

在此目录下运行一下指令直线驱动文件的挂载,具体可以查看《泰芯AH模组Linux软件开发指南》中的“3.2 hgic_fmac”
$ sudo insmod hgicf.ko
$ sudo insmod hgicf_usb.ko
可以使用指令查看当前是否挂载成功,如图15所示
$ lsmod

至此便完成了树莓派端的准备工作
树莓派控制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所示:

图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对多模式下进行数据通信为例作为展示

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