Основы USB-VCOM CORTEX-M LPC43XX - правильный способ создания простого FSM - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над проектом, включающим LPC4370 MCU (LPC Link 2 eval Board) и Matlab.Мне нужно, чтобы мой встроенный код был реконфигурируемым пользователем из matlab: пользователь отправляет команду, mcu отвечает.

Я использую LPCOpen VCOM в качестве базы: он использует USB спрерывание.

Мой код C:

static uint8_t g_rxBuff[256];
[...]
while (1)
{
        /* Sleep until next IRQ happens */
        __WFI();

        /* Read cmd */
        rdCnt = vcom_bread(&g_rxBuff, 1);
        state = (char)g_rxBuff;

        if(rdCnt == 1)
        {
            switch (state)
            {
                case 'a':
                    /* cmd ackn */
                    vcom_write((uint8_t*)&g_rxBuff, 1);

                case 'b':
                    /* cmd ackn */
                    vcom_write((uint8_t*)&g_rxBuff, 1);

                case 'c':
                    /* cmd ackn */
                    vcom_write((uint8_t*)&g_rxBuff, 1);
            }
        }
}

Здесь я жду команду, а затем пытаюсь вернуть ее обратно на хост (т.е. ackn).

В Matlab

BaudRate=115200;
serial_object=0;
delete(instrfind('Type','serial'));
serialInfo = instrhwinfo('serial');
serial_object=serial('/dev  /ttyACM1','BaudRate',BaudRate,'InputBufferSize',4*4096,'OutputBufferSize',4*4096);
fopen(serial_object);

sendCmd(serial_object,'a');
sendCmd(serial_object,'b');
sendCmd(serial_object,'c');

Где

function ret = sendCmd(serial_object, cmd_sent)
  fwrite(serial_object, cmd_sent, 'char');
  cmd_read = fread(serial_object, 1, 'char'); 
  if (~isempty(cmd_read) && (cmd_read == cmd_sent))
    disp(strcat('SENT:  ', cmd_sent));
  else
    disp(strcat('ERROR:  ', cmd_sent));
  end
end

Так что в принципе это никогда не работает.Я всегда получаю сообщения об ошибках типа:

Предупреждение. Указанный объем данных не был возвращен в течение периода ожидания. «Сериал» не может прочитать какие-либо данные.Для получения дополнительной информации о возможных причинах см. Предупреждения о последовательном чтении.

Поскольку я некоторое время работал над этим, я могу сказать, что с настройкой порта все в порядке, мне удалось вывести данные из mcu с той же конфигурацией.

Так что я думаю, что мне здесь не хватает практических рекомендаций.Единственное допущение, которое я сделал, заключается в том, что USB IRQ срабатывает каждый раз, когда Matlab пишет в mcu.

РЕДАКТИРОВАТЬ: некоторые данные отладки SWD.IRQ вызывает после 1 команды fwrite от Matlab: enter image description here

Эти контрольные точки никогда не достигаются enter image description here

...