-
-
Save agners/299639de3c5cfd97ba01db409c03b5b6 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| # Author: Stefan Agner | |
| import os | |
| import sys | |
| import time | |
| import usb | |
| BITMODE_CBUS = 0x20 | |
| SIO_SET_BITMODE_REQUEST = 0x0b | |
| # FTDIs CBUS bitmode expect the following value: | |
| # CBUS Bits | |
| # 3210 3210 | |
| # |------ Output Control 0->LO, 1->HI | |
| # |----------- Input/Output 0->Input, 1->Output | |
| # PyUSB control endpoint communication, see also: | |
| # https://github.com/pyusb/pyusb/blob/master/docs/tutorial.rst | |
| def ftdi_set_bitmode(dev, bitmask): | |
| bmRequestType = usb.util.build_request_type(usb.util.CTRL_OUT, | |
| usb.util.CTRL_TYPE_VENDOR, | |
| usb.util.CTRL_RECIPIENT_DEVICE) | |
| wValue = bitmask | (BITMODE_CBUS << 8) | |
| dev.ctrl_transfer(bmRequestType, SIO_SET_BITMODE_REQUEST, wValue) | |
| def main(): | |
| """Main program""" | |
| dev = usb.core.find(custom_match = \ | |
| lambda d: \ | |
| d.idVendor==0x0403 and | |
| d.idProduct==0x6001 and | |
| d.serial_number=="A10XXXXX") | |
| # Set CBUS2/3 high... | |
| ftdi_set_bitmode(dev, 0xCC) | |
| time.sleep(1) | |
| # Set CBUS2/3 low... | |
| ftdi_set_bitmode(dev, 0xC0) | |
| # Set CBUS2/3 back to tristate | |
| ftdi_set_bitmode(dev, 0x00) | |
| main() |
@Nathan-L-Cook you can find an example of that here: https://github.com/agners/python-sdrewire/blob/main/sdrewirectl#L34-L43
Perfect. Thank you. Using that example I am able to GET the values of the pin state (HI/LO).
One more question:
Is it possible to also GET the values of the pin mode (Input/Output)?
I am not aware off. Also, from this list, it doesn't look like.
Thanks for the link. I have a question open with the FTDI support guys. If they have an answer, I'll post it here too.
Got a feedback direct from the FTDI guys:
"I’m afraid there is no API command to determine the CBUS mode of the FT230X.
Even the D2XX FT_GetBitMode command (in bit-bang mode) will only give you the hex value on the data bus pins, not the mode."
Ok, oh well 🤷♂️ Thanks for posting it here.
This was very helpful. Thank you.
On windows I needed to get the backend setup, but after that it worked great: https://stackoverflow.com/questions/13773132/pyusb-on-windows-no-backend-available
Question:
Could you show how to also do the "ftdi_get_bitmode()" function to read the state of the CBUS lines?