конвертор CH341 (USB/SPI)

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
AlexandrRa
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт ноя 26, 2020 13:19:49

конвертор CH341 (USB/SPI)

Сообщение AlexandrRa »

Доброго времени суток уважаемые коты. Есть приблуда на микросхеме СН341. К ней пишу прогу и понять не могу почему не работает.

Код: Выделить всё

        private void button2_Click(object sender, EventArgs e)
        {
            byte[] BuferRx = Enumerable.Repeat<byte>(0x00, 3).ToArray();
            var statement = Imports.CH341OpenDevice(0);
            if ((int)statement != -1)
            {
                labelOpenSPI.Text = "устройство подключено";
                labelIntSPI.Text = Imports.CH341SetStream(0, 0).ToString();  // устройство, настройки SPI
                labelSpeedSPI.Text = Imports.CH341SetupSerial(0, 0, 100).ToString();
                BuferRx[0] = ConvertBit(Data_Rx, 0);
                BuferRx[1] = ConvertBit(Data_Rx, 1);
                BuferRx[2] = ConvertBit(Data_Rx, 2);
                labelDataSPI.Text = Imports.CH341StreamSPI4(0, 0, 3, BuferRx).ToString();
            }
            else labelOpenSPI.Text = "устройство не найдено";
        }
в общем выдаёт такую бодягу в ответ:
labelOpenSPI.Text = "устройство подключено"
labelIntSPI.Text = true
labelSpeedSPI.Text = false
labelDataSPI.Text = false

Импорт из библиотеки такой

Код: Выделить всё

        public class Imports
        {
           [DllImport("CH341DLL.dll")]
            public static extern IntPtr CH341OpenDevice(uint iIndex);

            [DllImport("CH341DLL.dll")]
            public static extern IntPtr CH341CloseDevice(uint iIndex);

             /*
            шIndex         // CH341 оборудование, указанное число 0 соответствует первому устройству
            iParityMode   // Режим проверки последовательной передачи данных CH341: NOPARITY / ODDPARITY / EVENPARITY / MARKPARITY / SPACEPARITY
            iBaudRate     // Значение скорости передачи последовательного порта. Может быть любое значение между 50 и 3000000
            */
            [DllImport("CH341DLL.dll")]
            public static extern bool CH341SetupSerial(uint iIndex, uint iParityMode, uint iBaudRate);

            /*
            iIndex - номер устройства
            iMode - байт, который определяет следующее:
                Bit [7]:  - SPI byte bit order: 0 = LSB first, 1 = MSB first
                Bit [2]:  - SPI's I/O lines: 0 = single-input/ single-output (D3=clock / D5=out / D7=in) (default);
                                             1 = double input/ double output: D3 clock / (D5=out D4=in) / (D7=in D6=out)
                Bit [1:0] - speed:   00=20kHz, 01=100KHz, 10=400KHz, 11=750kHz
            */
            [DllImport("CH341DLL.dll")]
            public static extern bool CH341SetStream(uint iIndex, uint iMode);

            /*
            ULONG iIndex         // CH341 оборудование, указанное число 0 соответствует первому устройству
            ULONG iChipSelect  // Выбор вывода CHIP_SELECT
            ULONG iLength       // Размер буфера в байтах от 0 до 32
            ULONG ioBuffer      // Буфер передаваемых данных
            */
            [DllImport("CH341DLL.dll")]
            public static extern bool CH341StreamSPI4(uint iIndex, uint iChipSelect, uint iLength, byte[] ioBuffer);

Может кто подсказать, что я делаю не так?

Добавлено after 2 hours 37 minutes 14 seconds:
Нашёл проблему, не установил CS. А конкретно в "labelSpeedSPI.Text = Imports.CH341SetupSerial(0, 0, 100).ToString();" должно быть "labelSpeedSPI.Text = Imports.CH341SetupSerial(0, 0x80, 100).ToString();"
Это включает СS для CS0 (0x81 для S1 и 0x82 для S2 соответственно).осталось порулить со скоростью.
AlexandrRa
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт ноя 26, 2020 13:19:49

Re: конвертор CH341 (USB/SPI)

Сообщение AlexandrRa »

Доброго времени суток уважаемые коты. Пытаюсь провести инициализацию SPI в CH347. (нужно установить скорость)
В общем делаю так,

Код: Выделить всё


// Структура настройки SPI
        public struct SPI_CONFIG
        {
            public byte iMode;                   // 0-3: SPI Mode0/1/2/3
            public byte iClock;                  // 0 = 60MHz, 1 = 30MHz, 2 = 15MHz, 3 = 7.5MHz, 4 =3 .75MHz, 5 = 1.875MHz, 6 = 937.5KHz,  7 = 468.75KHz
            public byte iByteOrder;              // 0= LSB, 1= MSB 
            public ushort iSpiWriteReadInterval; // Интерфейс SPI общая команда чтения и записи данных, единица измерения — мкс
            public byte iSpiOutDefaultData;      // SPI печатает данные по умолчанию при считывании данных 
            public ulong iChipSelect;            // Выбор чипа, бит7 = 0, управление выбором чипа игнорируется, бит7 = 1, допустимые параметры: бит1/0 равны 00/01, тогда контакты CS1/CS2 выбираются как активный выбор чипа низкого уровня соответственно
            public byte iCS1Polarity;            // Бит 0: выбор микросхемы, управление полярностью CS1, 0 - активный низкий уровень; 1 - активный высокий уровень
            public byte iCS2Polarity;            // Бит 0: выбор микросхемы, управление полярностью CS2, 0 - активный низкий уровень; 1 - активный высокий уровень
            public ushort iIsAutoDeativeCS;      // Следует ли автоматически отменять выбор чипа после завершения операции 
            public ushort iActiveDelay;          // Время задержки выполнения операций чтения и записи после установки выбора микросхемы, единица измерения — мкс.
            public ulong iDelayDeactive;         // Время задержки выполнения операций чтения/записи после отмены выбора микросхемы, единица измерения — мкс.
        }
// *****

// Настройка и вызов функции настройки
            SPI_CONFIG= new SPI_CONFIG();
            InSPI.iMode = 0;
            InSPI.iClock = 0;
            InSPI.iByteOrder = 0;
            InSPI.iSpiWriteReadInterval = 0;
            InSPI.iSpiOutDefaultData = 0;
            InSPI.iChipSelect = 0;
            InSPI.iCS1Polarity = 0;
            InSPI.iCS2Polarity = 0;
            InSPI.iIsAutoDeativeCS = 0;
            InSPI.iActiveDelay = 0;
            InSPI.iDelayDeactive = 0;
            vai1 = Imports.CH347SPI_Int(0, InSPI);

// Обращение к библиотеке
        public class Imports
        {
            [DllImport("CH347DLL.dll")]
            public static extern bool CH347SPI_Int(uint iIndex, SPI_CONFIG mSpiCfgS);
        }
В строке "vai1 = Imports.CH347SPI_Int(0, InSPI);" происходит затык. Пишет: System.EntryPointNotFoundException: "Не удается найти точку входа "CH347SPI_Int" в DLL "CH347DLL.dll"."
Может кто подсказать, что не так?
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: конвертор CH341 (USB/SPI)

Сообщение Martian »

может быть, второй параметр должен быть указателем на структуру, а не она сама?

Код: Выделить всё

var statement = Imports.CH341OpenDevice(0);
 if ((int)statement != -1)
лишняя переменная. достаточно

Код: Выделить всё

 if (Imports.CH341OpenDevice(0) != -1)
Последний раз редактировалось Martian Чт авг 08, 2024 09:02:41, всего редактировалось 1 раз.
AlexandrRa
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт ноя 26, 2020 13:19:49

Re: конвертор CH341 (USB/SPI)

Сообщение AlexandrRa »

То же самое пишет. Может я не так что-то делаю?

Код: Выделить всё

         unsafe private void button3_Click(object sender, EventArgs e)
        {
            _SPI_CONFIG InSPI = new _SPI_CONFIG();
            _SPI_CONFIG* mPSpiCfgS = &InSPI;

                 InSPI.iMode = 0;
                InSPI.iClock = 0;
                InSPI.iByteOrder = 0;
                InSPI.iSpiWriteReadInterval = 0;
                InSPI.iSpiOutDefaultData = 0;
                InSPI.iChipSelect = 0;
                InSPI.iCS1Polarity = 0;
                InSPI.iCS2Polarity = 0;
                InSPI.iIsAutoDeativeCS = 0;
                InSPI.iActiveDelay = 0;
                InSPI.iDelayDeactive = 0;
                var vai1 = Imports.CH347SPI_Int(0, &InSPI);

       public class Imports
        {
            unsafe public static extern bool CH347SPI_Int(uint iIndex, _SPI_CONFIG* mSpiCfgS);
        }
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: конвертор CH341 (USB/SPI)

Сообщение Martian »

Код: Выделить всё

unsafe public static extern bool CH347SPI_Int(uint iIndex, _SPI_CONFIG* mSpiCfgS);
буквы i не хватает. CH347SPI_Init
Последний раз редактировалось Martian Чт авг 08, 2024 09:11:33, всего редактировалось 1 раз.
AlexandrRa
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт ноя 26, 2020 13:19:49

Re: конвертор CH341 (USB/SPI)

Сообщение AlexandrRa »

Другие функции из этого DLL видит. и даже работает с ними. Затык именно со структурами
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: конвертор CH341 (USB/SPI)

Сообщение Martian »

выше отредактировал ответ.
AlexandrRa
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт ноя 26, 2020 13:19:49

Re: конвертор CH341 (USB/SPI)

Сообщение AlexandrRa »

БЛИИИНННН!!! ТОЧТО "i" НЕ ХВАТАЛО!!!! ЗАРАБОТАЛО ВООБЩЕМ!!! СПАСИБО!!! 2 дня сидел голову ломал, что не так...
Ответить

Вернуться в «Интеграция с ПК»