CH376S и Ардуино

Тема в разделе "Arduino & Shields", создана пользователем Igor_Ryaboff, 10 сен 2017.

  1. Igor_Ryaboff

    Igor_Ryaboff Нуб

    Недавно взял себе такой модуль для чтения/записи на USB-флешку. Пытался подключить согласно этой статье, но ничего не вышло. Все сделал, как надо - подсоединил TXD и RXD, подключил питание и землю, загрузил тестовый скетч все из той же статьи. В нём есть команда для проверки соединения с модулем. Вызываю её - "TimeOut waiting for response: Error while: checking connection". При этом питания на флешку также не выдается (хз, может так положено)

    UPD: Продолжал экспериментировать, подключил плату к соотв. разъемам RX и TX на ардуино. Плата подала признаки жизни и отправила какой-то код, но естественно это не решило проблему. Подключение по статье результатов пока не дает
     
    Последнее редактирование: 10 сен 2017
  2. DIYMan

    DIYMan Guest

    Сорри за некропост, но: код из той статьи можно брать только как справочный, он очень, нет, ОЧЕНЬ херовый, экскюзе муа. Собственно, мне пришлось его практически весь переписывать, чтобы добиться нормальной работы с модулем через UART. По факту - реализовал чтение/запись, проверку на кол-во прочитанных байт (что в коде по ссылке просто проигнорировано, из-за чего можно запросить читать одно, а получить - совсем другое), ну и кое-какую обвязку. С именами файлов там не всё так просто: если надо юзать подпапки - то надо бить путь по частям, и для каждой части просить модуль выбрать путь (это дело я пока так и не реализовал, за временной ненадобностью).

    По итогу: работать с модулем можно, модулёк интересный, вполне себе нормальная замена SD. Единственное но: скорость работы по UART - всё же черепашья (по умолчанию - 9600, можно перенастроить на более высокую черепашью :D).

    Кода, простите, выложить не могу - код писан под конкретный заказанный и оплаченный проект, и без разрешения заказчика - сделать этого не могу. Но если вдруг будут желающие и таких желающих будет хотя бы десяток - спрошу у заказчика разрешение на предмет вывалить эти сырые два класса на всеобщее растерзание.
     
    Un_ka и arkadyf нравится это.
  3. Un_ka

    Un_ka Гуру

    А что по этому модулю никто более не работал , или он недавно появился?
     
  4. DIYMan

    DIYMan Guest

    Ну я искал - думал, мож есть какая готовая нормальная библиотека, чтобы лоб не морщить. Как оказалось - всё очень бедно и скудно, и все ссылки, рано или поздно - ведут на код из статьи. Пришлось взять его за основу и творчески переосмыслить, поскольку в реальном проекте - такому коду не место, хотя бы потому, что там делается пересброс всего модуля на каждый чих, что неприемлемо в принципе.
     
  5. Un_ka

    Un_ka Гуру

    Согласен , но проблема отсутствия нормального кода решается со временем , правда , с годами , чем больше лет с выпуска модуля , тем больше кода на него .
     
  6. Onic

    Onic Нерд

    Всем привет!
    А на каком языке вы пишите для вашего любимого Ардуино? Или это не для него вовсе? А то боюсь что-нибудь нарушить на вашем форуме... т.к. я вообще не работаю с Ардуино... Недавно жизниь заставила разбираться с модулем CH376S... Искал пример... Нашел код для Ард... Ну ерундовый то вообще! Я работаю на EFM32GG332 (Cortex M3), пиша на Keil С... После мучений с кодом - нашел на сайте производителя микросхемы CH376 пример использования с подробнейшими коментариями на китайском... Очень большой примерчик! 3 месяца убил на перевод с китайского на английский! Научился читать и писать и еще кучу чего! Но красиво определять, есть ли на флешке нужный файл так и не научился... Увы.
    Еще полностью согласен с утверждением, что нужно делать пересброс... Кривовато както это...
    Замечено ли в Вашем случае довольно редкое зависание программы в цикле ожидания байта при чтении файла, хотя на самом деле файл уже полностью прочитан и находится в буфере?
    Пока эксперименты пришлось прервать - опытный образец передан заказчику... Сейчас делаю в Сингапуре следующее поколение платы процессора после чего примерно через месяц начну "облизывать" модуль дальше...

    Всем удачи!
    Onic
     
    parovoZZ нравится это.
  7. b707

    b707 Гуру

    С/ С++
     
  8. parovoZZ

    parovoZZ Гуру

    если дурино, то только матерный.
    Китайцы построили себе ЖД дороги со скоростями 300-350 км/ч. Протяженность таких дорог порядка 200 000 км. Поезда там исключительно китайские. И рельсы китайские. Технологии, конечно же, от ведущих мировых фирм в этом сегменте. Мы же купили немецкие рельсы, немецкие электрички и хвастаемся 200 км/ч. В одном месте и не долго 250 км. А ещё мы хвастаемся, что наконец-таки одолели 15-ти летнюю дурину. Мда. Не стыдно?
     
    Un_ka нравится это.
  9. Onic

    Onic Нерд

    Hello, All
    Несколько вопросов DIYMen и всем работающим с CH376!
    1. Удалось ли Вам реализовать функции типа (без перевода):
    IfExist (char* FileName);
    Delete (char* FileName);
    2. В китайских примерах при вызове любой функции типа Read or Write они делают следующую операцию:
    Код (C++):

    uint8_t FLASH_Activate (void)
    {
    uint8_t        CH;
    int                TIMEOUT=0;
       
        CH = CH376_CheckConnection ();                        // Check HW connection chip CH376 with MCU
        if (CH)                                                                     // Connection Error Oсcured
                return 1;
    STEP1:
        CH376_ResetALL();                                               // Hardware Reset chip CH376. It not returned nothing          
        CH = CH376_SetUSBMode ();                               // Set Host USB Mode
        if (CH==CMD_RET_SUCCESS)                            // CH==0x51
            goto STEP2;
        else if (CH==CMD_RET_ABORT)      
        {
            TIMEOUT++;
            if (TIMEOUT>100)
            {
                MSG3("CH376 USB Mode Error");
                return 2;                                                          
            }
            goto STEP1;
        }
    STEP2:  
        CH = CH376_ReadDATA ();
        if (CH==USB_INT_CONNECT)                                // CH==0x15
        {
            TIMEOUT=0;
            CH376_ResetALL();          
            CH = CH376_SetUSBMode    ();
            if (CH==CMD_RET_SUCCESS)                            // CH==0x51
            {
    STEP3:
                CH = CH376_ReadDATA ();
                if (CH!=USB_INT_CONNECT)
                {      
                    TIMEOUT++;
                    if (TIMEOUT>100)
                    {
                        MSG3("Flash Removed!");
                        return 3;                                                            //
                    }
                    goto STEP3;
                }
            }
        }      
        CH = CH376_CheckDeviceConnection();       // Host file mode/SD card not supported:
                                                                                // Check if the disk is connected. Output interrupt
        if (CH376_InterrupReturnedCodes (CH)!=0)
            return 3;

        CH = CH376_MountDevice();                        // Host file mode: Initialize the disk and test if the
                                                                                // disk is ready. Output interrupt
        if (CH376_InterrupReturnedCodes (CH)!=0)
            return 4;
        MSG3("CH376 Activation Successful");
        return 0;
    }
     
    команды MSG2 & MSG3 не китайские - вывод сообщения на LCD...
    Не понятно, зачем каждый раз проверять подключен ли модуль командой CH376_CheckConnection.
    Я пробовал ее убрать - У меня модуль начал периодически зависать на следующей команде CH376_ResetALL!!!
    Не понятно, зачем дважды делается CH376_ResetALL?!! И вообще зачем его делать при каждом обращении к модулю?
    И еще! Зачем здесь проверяется не удалена ли Flash?

    Кстати для справки коллегам! В CH376DS1.pdf не описаны правила задания имени файла! Так вот! Каждое имя должно заключаться в ограничители '/' или '\'!!!
    Выглядеть это должно так:
    Код (C++):

        ReadSize = FLASH_ReadFileName ("/String23.txt/");
     
    С Уважением,
    Onic
     
  10. b707

    b707 Гуру

    Думаю. последний слеш лишний, попробуйте без него. А первый - это обозначение корня файловой системы, типичная запись для Линукс
     
  11. Onic

    Onic Нерд

    Привет b707!
    Что тут думать? Внутри китайской функции FLASH_ReadFileName анализ на наличие вначале и в конце одного из двух ограничителей...
    Удачи!