Ch341a Usb Driver Zip

Ch341a Usb Driver Zip Rating: 4,3/5 9155 votes
Ch341a

This came from the driver CD that came with a cheap CH341 based USB to Serial adapter that had numerous other drivers on the CD as well. This is the correct driver for the serial adapter, and it includes drivers for Windows 7 x64. The manufacturer of CH341A provides a lot of useful things on the product page. Here are the files you can find and what they contain (the first two are the ones you need): CH341SER.EXE - self installing archive with USB to serial driver. CH341PAR.EXE - self installing archive with multiprotocol interface driver (this one is for the programmer.

The driver can be used with CH341A USB to UART/I2C/SPI adapter boards to connect SPI slaves to a Linux host. It uses either the fast SPI hardware interface which is, however, limited to SPI mode 0 or a slow SPI bit banging implementation.

Ch341a Programmer Software Download

Additionally, CH341A data pins that are not used for the SPI interface can be configured as GPIO pins. The driver can generate software interrupts for all input pins. One input pin can be connected with the CH341A interrupt pin to generate hardware interrupts. However, since USB is an asynchronous communication system, it is not possible to guarantee exact timings for GPIOs and interrupts.

Limitations of the SPI interface

The SPI hardware interface implementation is limited to

  • SPI mode 0 (CPOL=0, CPHA=0)
  • fixed clock frequency of about 1.4 MHz,
  • low active CS signal,
  • single bit transfers,
  • 8 bits per word, and
  • 3 slaves at maximum.

Because of the very limited documentation and applications that are almost all in Chinese, it is impossible to figure out whether these parameters can be changed by means of control commands. Therefore you have to live with this configuration as it is if you want to use the hardware implementation :-(

The bit banging implementation allows the following SPI modes

  • SPI mode 1 (CPOL=0, CPHA=1)
  • SPI mode 2 (CPOL=0, CPHA=1)
  • SPI mode 3 (CPOL=0, CPHA=1)

as well as high active CS signals. It is very slow. Only a SCK clock frequency of about 400 kHz can be reached, so that one byte takes around 14 us. However, each byte of a message has to be sent as a separate USB message to the adapter because of its bitwise implementation and the very limited USB endpoint buffer sizes. This results into a delay of about 6.5 ms between each byte. Additionally, handling the CS signal before the transfer and after the transfer causes an additional delay of about 20 ms. Thus, it takes about

to transfer a message of n bytes.

Both implementations allow the transmission with MSB first (SPI_MSB_FIRST) and LSB first (SPI_LSB_FIRST).

SPI configuration

The driver uses following CH341A pins for the SPI interface.

PinNameDirectionFunction SPI (CH341A)
18D3outputSCK (DCK)
20D5outputMOSI (DOUT)
22D7inputMISO (DIN)
15D0outputCS0
16D1outputCS1
17D2outputCS2

With these three CS signals, three slaves can be used at maximum at the interface.

GPIO configuration

Five of the data pins can be configured as GPIO pins if they are not used for the SPI interface or as chip select signals:

PinNameSPI Function (default)Configurable as (CH341 default in bold face)
15D0CS0Input, Output, CS
16D1CS0Input, Output, CS
17D2CS0Input, Output, CS
19D4OUT2Input, Output
21D6IN2Input

Please note:

  • Direction of pins that are configured as input or output can be changed during runtime.
  • Pin 21 (D6/IN2) can only be configured as input. It's direction can't be changed during runtime.
  • At least one of the CS data pins D0...D2 has to be configured as CS signal.
  • One of the inputs can be configured to generate hardware interrupts for rising edges of signals. For that purpose, the pin has to be connected with the CH341A INT pin 7.

Installation of the driver

Prerequisites

To compile the driver, you must have installed current kernel header files.

Even though it is not mandatory, it is highly recommended to use DKMS (dynamic kernel module support) for the installation of the driver. DKMS allows to manage kernel modules whose sources reside outside the kernel source tree. Such modules are then automatically rebuilt when a new kernel version is installed.

To use DKMS, it has to be installed before, e.g., with command

on Debian based systems.

Installaton

The driver can be compiled with following commands:

If DKMS is installed (recommended), command sudo make install adds the driver to the DKMS tree so that the driver is recompiled automatically when a new kernel version is installed.

In case you have not installed DKMS, command sudo make install simply copies the driver after compilation to the kernel modules directory. However, the module will not be loadable anymore and have to be recompiled explicitly when kernel version changes.

If you do not want to install the driver in the kernel directory at all because you only want to load it manually when needed, simply omit the sudo make install.

Loading

Once the driver is installed, it should be loaded automatically when you connect a device with USB device id 1a86:5512. If not try to figure out, whether the USB device is detected correctly using command

and try to load it manually with command:

Uninstallation

To uninstall the module simply use command

in the source directory.

Conflicts with CH341A USB to I2C Linux kernel driver

Since the CH341A also provides an I2C interface as USB device with same id, you have to unload the driver module with

before you can load the driver module for the I2C interface.

Configuration of the driver

Per default, the driver configures the GPIOs as following and polls the inputs with a default rate of 100 Hz and 10 ms period, respectively.

PinSPI FunctionGPIO functionGPIO nameIRQ
15CS0---
16CS1---
17CS2---
19-Inputgpio4hardware
21-Inputgpio5software

GPIO configuration as well their polling rate can be changed according to your requirements. The direction of GPIO pins configured as inputs or outputs can be changed during runtime.

GPIO configuration

To change GPIO configuration, simply change the variable ch341_board_config that should be self-explaining. This variable contains structured entries for each configurable pin. Each entry consists of the pin number, the GPIO mode used for the pin, the name used for the GPIO in the Linux host and a flag whether the pin is connected with the CH341A hardware interrupt pin INT. Default configuration is:

In this configuration, pins 15 to 17 are used as CS signals while pin 19 and 21 are used as inputs. Additionally, pin 19 is connected with the CH341A hardware interrupt pin INT that produces hardware interrupts on rising edge of the signal connected to pin 19.

To define a pin as output, simply change the GPIO mode to CH341_PIN_MODE_OUT. For example, if you would like to configure only one CS signal and the other CS signal pins as GPIO outputs, the configuration could look like the following:

Please note:

  • Pin 21 can only be configured as input. It's direction can't be changed during runtime.
  • At least one of the CS signal pins 15...17 (D0...D2) has to be configured as CS signal.
  • Hardware interrupts can only be generated for rising edges of signals.
  • Only one of the input pins can be configured to generate hardware interrupts (hwirq set to 1).
  • The signal at the input pin that is configured to generate hardware interrupts (hwirq set to 1) MUST also be connected to the CH341A INT pin 7.
  • If ther is no input should generate hardware interrupts, set hwirq to 0 for all entries.

GPIO polling rate

GPIO inputs are polled periodically by a separate kernel thread. GPIO polling rate defines the rate at which the kernel thread reads GPIO inputs and determines whether to generate software interrupts. That is, it defines the maximum rate at which changes at GPIO inputs can be recognized and software interrupts can be generated.

The GPIO polling rate is defined by its period in milliseconds using the constant CH341_POLL_PERIOD_MS. The period must be at least 10 ms, but should be 20 ms or more if possible dependent on the performance of your system. Please check your syslog for messages like 'GPIO poll period is too short by at least %n msecs'. This message is thrown if the defined CH341_POLL_PERIOD_MS is shorter than the time required for one reading of the GPIOs.

Ch341a Usb Driver Zip

The higher GPIO polling rate is, the higher is the system usage by the kernel thread. On the other hand, the probability that short interrupt events will be lost grows, the lower the GPIO polling rate becomes.

GPIO polling rate can also be changed using the module parameterpoll_rate either when loading the module, e.g.,

or as real root during runtime using sysfs, e.g.,

Please note: Since the CH341A hardware interrupt signal INT uses a separate USB endpoint, the maximum rate of hardware interrupts is independent on the GPIO polling rate and can reach up to 400 Hz.

Usage from user space

Using SPI slaves

Once the driver is loaded successfully, it provides up to three SPI slave devices on next available SPI bus, e.g.,

according to the naming scheme /dev/spidev<bus>.<cs>. <bus> is the bus number selected automatically by the driver and <cs> is the chip select signal of the according pin. Please note that independent on how many pins are configured as chip select signals, pin 15 gives always 0, pin 16 gives always 1, and pin 17 gives always 2 as chip select signal.

Standard I/O functions like open, ioctl and close can be used to communicate with one of the slaves connected to the SPI.

To open an SPI device simply use:

Once the device is opened successfully, you can modify SPI configurations and transfer data using ioctl function.

Function ioctl is also used to transfer data:

Using GPIOs

To access GPIOs from user space, sysfs can be used . For each configured GPIO, a directory

is created by the system, where <gpio> is the name of the GPIO as defined in the driver variable ch341_board_config. These directories contain

  • the file value that can be used to read from and write to GPIOs,
  • the file edge that can be used to control whether and what type of interrupt is enabled, and
  • the file direction that can be used to change the direction of the GPIO if possible.

Please note: For read and write operations from and/or to these files, the user requires read and/or write permissions, respectively.

Open a GPIO

Before a GPIO can be used, file value has to be opened

where <gpio> is again the name of the GPIO.

Write GPIO output

Once the file value is opened, you can use standard I/O functions to read and write. To write a GPIO value, simply use function write as following. The value is written to the GPIO out immediately.

Read GPIO input

To read values from GPIOs immediately, you can simply use function read as following:

After each read operation, file position has to be rewound to first character before the next value can be read.

Reacting on GPIO input interrupt

Function poll can be used before function read to react and read values from the GPIO only on interrupts.

Ch341a Mini Programmer

Function poll blocks until the specified event on the file descriptor happened.

Please note: The interrupt has to be activated before by root with command

where <gpio> is again the name of the GPIO and <type> is the type of the interrupt that should be used. Possible interrupt types are

  • rising for interrupts on rising signal edges,
  • falling for interrupts on falling signal edges, and
  • both for interrupts on rising as well as falling signal edges.

For example, following command would activate interrupts for rising edges of the signal connected to gpio4. The command has to be executed as real root, using sudo command doesn't work.

Even though the driver defines software interrupts for GPIO inputs as well as GPIO outputs, they can be activated only for GPIO inputs.

Full examples for GPIO output and interrupt input can be found in the driver's directory.

Change the GPIO direction

To change the direction of a GPIO pin configured as input or output, simply write as root keyword in or keyword out to the file direction, e.g.