一、概述
CH365是一个连接PCI总线的通用接口芯片,CH367/CH368是连接PCI-Express总线的通用接口芯片。支持I/O端口映射、存储器映射、扩展ROM以及中断,提供主动并口、SPI、I2C、GPIO等硬件接口。基于如上芯片可将PCI/PCIe总线转换为简便易用的类似于ISA总线的32位/8位主动并行接口,用于制作PCI/PCIe总线的计算机板卡,以及将原有板卡升级到PCI/PCIe总线上。相较于原产品,速度更快,实时性更好,可控性更佳,适用于高速实时的I/O控制卡、通讯接口卡、数据采集卡等。
本文介绍CH36X系列设备CH365/CH367/CH368等芯片在Linux系统下的使用教程。包括设备驱动的编译与加载、查看设备与驱动工作状态、使用调试软件进行设备的功能演示。
驱动和库文件支持CH36X芯片的IO、MEMORY、CONFIG空间以字节、字、双字三种方式进行读写操作,同时提供了SPI和I2C接口函数,可直接操作EEPROM和FLASH等器件。支持4种中断方式的配置:上升沿、下降沿、高电平、低电平,程序中提供了中断服务函数的注册和实现方法。
开发资料包下载链接:CH36X_LINUX.ZIP - 南京沁恒微电子股份有限公司
资料包含3个目录:
driver:设备驱动程序
lib:开发库
demo:演示程序
该资料适用于PCI总线接口芯片CH365和PCIe总线接口芯片CH367和CH368,需支持其他芯片型号可联系技术支持:tech@wch.cn
二、驱动编译与加载
1、拷贝资料包至系统本地路径并解压
2、打开“终端”应用程序,使用shell命令“cd”切换到driver目录下
3、使用shell命令“make”编译驱动,若编译成功会在目录下生成目标驱动模块“ch36x.ko”
4、动态加载/卸载驱动
加载
sudo make load 或
sudo insmod ch36x.ko
卸载
sudo make unload 或
sudo rmmod ch36x
5、永久加载/卸载驱动
加载
sudo make install
卸载
sudo make uninstall
6、查看设备工作情况
如果设备工作正常,驱动程序将在/dev目录下自动创建名为“ch36xpcix”的字符设备
ls /dev/ch36xpci*
如上操作不成功时,可使用如下命令查看板卡识别信息
lspci -v
dmesg
ch365的完整ID为[4348]:[5049],ch367/ch368的VID为[1C00]。 通过lspci -v命令查看设备信息
以上信息均通过表明设备已被识别且驱动加载成功。
三、硬件展示
演示以CH368EVT评估板为例。
1、评估板实物展示
CH368 评估板主要由 CH368 芯片、排针引出的 IO/MEM/地址/数据信号线、FLASH 芯片、EEPROM 芯片、电源电路以及演示用 LED 组成,用于演示 PCI-Express 总线通用接口芯片CH368 的基本功能:IO 读写、存储器读写、SPI 读写、I2C 读写、配置空间读写以及中断演示等。该评估板还可以测试 CH368 自定义 PCIe 板卡的 ID 功能、调节脉冲宽度以及支持32 位 MEM 宽度读写等。
2、元器件说明
P1 是 PCIe 总线,直接插入计算机的 PCIe 插槽。 P2、P3 是 CH368 芯片本地端的控制总线,数据总线,地址总线等信号线引出。 U1(CH368)是 PCI-Express 总线的通用接口芯片。 U2(ASM1117)是1.8V 稳压管,为 CH368 内核提供电源。 U3(24C02)是 I2C 接口 EEPROM,可为 CH368 定制 PCIe 板卡的 ID。如果 CH368 启用外部 ID,则可以在 U2 中自定义供应商标识 VendorID 和设备标识 Device ID 等。如果未设置为外部 ID,则使用 CH368 默认 ID,此时 U3 可以省去。 U4(25F512)是 SPI 接口 FLASH,用来保存应用数据。在不测试 SPI 读写时可以省去。 U5(74LS273)8 位数据/地址锁存器,用来锁存 I/O 端口的数据。 U6(7805) LDO 稳压到5V。
JP1 为 CH368 电源选择: 1-2 短接 CH368 通过 PCIE 3.3V 供电,默认2-3 连接。 2-3 短接 CH368 通过 PCIE 3.3Vaux 供电,当系统关机后,CH368 不断电,可通过 WAKEIN 信号唤醒计算机(需要软件支持)。 JP2 为输出电源选择 1-2 短接输出5V 电压给 P3 所接外设供电。 2-3 短接输出3.3V 电压。
F1 是保险丝 C1、C17 是100UF 电源退耦电容。 C2、C4 是10UF 电源退耦电容。 C3、C5~C16、C18~C23 为0.1UF 电源退偶电容。 RP1~PR3 为2K 欧姆排阻,用于限流。 RP4~RP19 为200 欧姆排阻。 R1、R2 为0 欧姆电阻,其中 R2 用于支持 PCIe 唤醒信号线,不用时可以省去。 R3 为外接12KΩ电阻到 GND,用于系统参考电流输入。 R5 10K 欧姆电阻 L1~L11 为 LED,用于演示总线 I/O 写、通用输入输出信号读写,对应的信号包括: INT/SDX/SCL/SDA/SCS/ADDR/RSTO。
四、功能演示
1、打开“终端”应用程序,使用shell命令“cd”切换到demo目录下
2、使用gcc/g++编译应用程序,如下所示:
gcc ch36x_demo.c ch36x_lib.c -o ch36xdebug
3、运行目标可执行文件
sudo ./ch36xdebug
软件会自动打开/dev/ch36xpci0设备节点,若出现打开失败,可参考第一章检查硬件和驱动是否工作正常。
4、设备信息展示
系统为CH36X设备分配的IO基地址、Memory基地址以及中断号
5、配置空间读写演示
-
a-功能 支持字节读/写访问配置空间。
-
b-实现 使用 demo程序可以演示“配置空间读写”功能。
-
c-验证 根据 CH368 芯片手册输入对应的配置空间地址,检查回读对应数据。
-
d-注意 配置空间的位属性不同,有些完全只读、有些可读可写、有些只读但可以事先设定等等,具体请参照 CH368 芯片手册。
-
e-demo程序演示 根据菜单信息提示输入C进入配置空间读写。读取到偏移地址为01H的数据为1CH
对比手册后验证读取成功
6、IO读写功能演示
-
a-功能 CH368 支持以字节/字/双字为单位对 I/O 端口访问,支持直接地址/偏移地址访问I/O 端口。
-
b-实现 使用 demo程序可以演示通过偏移地址对 I/O 端口进行访问。
-
c-验证 U5 可以用于简单测试 I/O 输出功能,CH368 的任何 I/O 的输出数据都会在 IOWR脉冲结束时被锁存器 U5 保存,然后驱动 L1~L4 这4 个 LED,显示 I/O 数据端口D3~D0 位的状态。灯亮代表1,灯灭代表0。第二种方法可使用逻辑分析仪/示波器等硬件仪器监控总线数据(参考以下测试举例)。
-
d-注意 当选择字,双字模式进行读写 IO 时,输入的地址和长度需分别为2 和4 的倍数,块读写的最大长度为32K。
-
e-demo程序演示 偏移地址0x00~0XE7为标准本地IO端口,通过D0 ~ D31双向数据信号线输入输出,双向数据线内置上拉电阻默认为高电平,进行IO写功能时,数据总线D0~D7会直接输出信号,可通过LED直接观察输出结果。
测试IO读功能时,可将D0数据线接,此时D7~D0位数据为1111 1110(0xFE),demo演示读取一个字节的数据进行对比
IO写数据演示:往IO空间00端口写入数据0x05,使用逻辑分析仪抓取D3~D0数据位的值为0101验证写数据成功。
7、Memory读写功能演示
-
a-功能 和 IO 读写功能类似,CH368 支持以字节/字/双字为单位对 Memory 进行读写。
-
b-实现 使用 demo程序可以演示Memory读写功能。
-
c-验证 可连接外部 Memory器件来写入和回读数据,当不连接外设时可使用逻辑分析仪/示波器等硬件仪器监控总线数据(参考以下测试举例)。
-
d-注意 选择双字进行读写时,输入的地址和数据长度需为4的倍数,输入的地址和数据长度的和应小于等于0x7FFF。
-
e-demo程序演示 以字节为单位写数据03H,硬件上逻辑分析仪连接双向数据线D0~D3抓取输出值为0011,验证写数据成功。
双向数据端口D0~D31默认高电平,将D0接地拉低电平,此时进行Memory读取信号线D7~D0的数据为1111 1110(0xFE),利用demo程序读取验证
8、 SPI 操作演示
-
a-功能 CH368 支持 SPI 接口与外设通讯。
-
b-实现 使用 demo程序可以演示读/写/擦除 FLASH 数据。
-
c-验证 除了读/写/擦除 FLASH 芯片25F512(U4)外,还提供选择 IO 模式 SPI3/SPI4 和时钟频率15.6MHz/31.3MHz 的设置。
-
d-注意 不同品牌和型号的 FLASH 芯片,协议可能有不同,需要参考 FLASH 芯片手册。
-
e-demo程序演示 评估板上 SPI默认连接FLASH,通过发送读取 FLASH ID 指令接收回传信息判断SPI是否能正常通信,一次发送4个字节数据:[0x90 0x00 0x00 0x00],再读取两个字节信息,得到FLASH ID为:[0xef 0x12]
进行FLASH数据读写时需要输入起始地址0x00,写入字符串“1234567890”,再从起始地址连续读取10个字节验证写入数据是否成功。
注:FLASH的数据写入需要先进行数据擦除,保证写入前内容为0xFF。
9、EEPROM操作演示
-
a-功能 CH368 支持 I2C 接口与外设通讯,支持读/写 EEPROM。
-
b-实现 使用 demo程序可以演示24CXX 中数据的变化。
-
c-验证 外接配置芯片24CXX 是非易失串行 EEPROM 存储器,除了向 CH368 提供配置信息之外,还可以供应用程序自行保存一些其它参数。
-
d-注意 CH368 支持以下型号的24CXX 芯片:24C01(A)、24C02、24C04、24C08、24C16 等。如果不需要修改芯片的 ID 时,外部配置芯片有效标志不能为78H,具体参考CH368芯片手册。
-
e-demo程序演示
根据菜单提示信息输入从机地址0x50,选择从机寄存器起始地址0x00,输入发送字符串“0987654321”,再选择读取10个字节。
10、中断功能演示
-
a-功能 CH368 支持电平/边沿2 种中断类型,可以通过库函数设置中断类型,详细说明请查看 CH368 芯片手册中断寄存器和硬件中断的相关说明。
-
b-实现 使用 demo 程序可以演示中断功能。
-
c-验证 程序通过控制引脚A15输出电平信号,当INT#引脚接收到电平或边沿信号后触发中断,进入中断服务开始计数。示例采用上升沿有效的边沿触发方式。
-
d-注意 启用中断功能需要硬件上将A15引脚和INT#引脚相连
-
e-demo程序演示 通过控制A15引脚输出高低电平触发中断,程序中设置上升沿触发,中断触发后执行服务函数打印中断触发次数。
-
第一步读取IO杂项控制寄存器0XF8的值为0xb0,判断出A15引脚此时的电平状态为低电平
-
第二步输入菜单键 e 打开中断
-
第三步对杂项控制寄存器写入数据0xB9(位0=1)来控制A15引脚输出高电平
-
第四步终端输出中断服务函数执行信息