Общайтесь с Pixy Cam 2 через SPI и FreeRTOS - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь установить связь с камерой Pixy 2 с помощью платы TI SimpleLink CC3220SF и с помощью SPI и FreeRTOS.

Мне кажется, что я получаю данные обратно с камеры Pixy, однако это не похоже вернуться так, как я ожидаю.

Для тестового кода, который я делаю, я должен получить 22 байта данных, и я посылаю переменную с 32 байтами для получения данных, однако, кажется, что он не начинает заполняться данными до 12-го байт.

Однако данные, которые возвращаются с 12-го байта и далее, кажутся правильными. Я не знаю, почему это происходит, любая помощь будет признательна

Я приложил свой код ниже. Еще раз спасибо за любую помощь.

SPI_Handle      masterSpi;
SPI_Params      spiParams;
SPI_Transaction transaction;
uint32_t        i;
bool            transferOK;
uint8_t versionRequest[] = {0xae, 0xc1, 0x0e, 0x00};
uint8_t j, recvBuf[32];

SPI_Params_init(&spiParams);
spiParams.frameFormat = SPI_POL1_PHA1;
spiParams.bitRate = 100000;
masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
if (masterSpi == NULL) {
    Display_printf(display, 0, 0, "Error initializing master SPI\n");
    while (1);
}
else {
    Display_printf(display, 0, 0, "Master SPI initialized\n");
}

transaction.count = 32;
transaction.txBuf = (void *) versionRequest;
transaction.rxBuf = (void *) recvBuf;

transferOK = SPI_transfer(masterSpi, &transaction);
if (transferOK) {
    for (j=0; j<22; j++)
        Display_printf(display, 0, 0, "%hhu: 0x%hhx\n", j, recvBuf[j]);
}
else {
    Display_printf(display, 0, 0, "Unsuccessful master SPI transfer");
}

SPI_close(masterSpi);

Display_printf(display, 0, 0, "\nDone");

return (NULL);

1 Ответ

0 голосов
/ 01 мая 2020

Во-первых, давайте рассмотрим последовательный протокол Pixy 2:

  • versionRequest[0] == 0xae / versionRequest[1] == 0xc1 => контрольная сумма не используется.
  • versionRequest[2] == 0x0e => «запрос версии», как следует из названия переменной.
  • versionRequest[3] == 0x00 => нет данных полезной нагрузки запроса, кадр заканчивается после 4-го байта.

Ваш запрос выглядит правильно Мне, плюс, это соответствует предложению со стороны интеграции Pixy2.


Существует одно фундаментальное отличие между последовательными протоколами, которое руководство вообще не обсуждает: хотя связь TX / RX в UART a синхронный (как "A" в U A RT "), в связи SPI оба направления (MOSI / MISO) относятся к общему тактовому сигналу (SCK). То есть, ведущий должен запускать часы, чтобы получать дополнительные данные до тех пор, пока последовательность запрос-ответ не будет завершена. Для ведомого устройства требуется некоторое время ожидания, пока он не сможет начать передачу своего ответа:

  • По физическим причинам это по крайней мере один байт.
  • По логическим причинам он может запуск только тогда, когда он получил достаточно информации из запроса (здесь: первые три байта или весь запрос).
  • По техническим причинам для внутренней обработки могут потребоваться дополнительные циклы (например, считывание данные из внутренней памяти fla sh с соответствующей задержкой).

К сожалению, в онлайновой документации к протоколу не комментируется, сколько циклов должен выполнить ответ ведомого до его запуска (при по крайней мере, насколько я вижу).


Поэтому вы должны действовать следующим образом (по моему личному мнению):

  1. Убедитесь, что данные ответа вы получаете совместимы с содержанием ответа в документации:

    0xaf // first byte of checksum_sync (little endian -> least-significant byte first)
    0xc1 // second byte of checksum_sync
    0x0f // this is the version response type
    0x10 // data_length is 0x10 (16) bytes 
    0x0d // first byte of data checksum (little endian -> least-significant byte first)
    0x03 // second byte of data checksum
    0x00 // first byte of hardware version (little endian -> least-significant byte first)
    0x22 // second byte of hardware version
    0x03 // firmware major version number
    0x00 // firmware minor version number
    0x0a // first byte of firmware build number (little endian -> least-significant byte first)
    0x00 // second byte of firmware build number
    0x67 // byte 0 of firmware type ASCII string
    0x65 // byte 1 of firmware type ASCII string
    0x6e // byte 2 of firmware type ASCII string
    0x65 // byte 3 of firmware type ASCII string
    0x72 // byte 4 of firmware type ASCII string
    0x61 // byte 5 of firmware type ASCII string
    0x6c // byte 6 of firmware type ASCII string
    0x00 // byte 7 of firmware type ASCII string
    0x00 // byte 8 of firmware type ASCII string
    0x00 // byte 9 of firmware type ASCII string
    

    В частности, в первых четырех ненулевых байтах вы должны убедиться, что кадр ответа имеет ожидаемый тип и количество байтов соответствует ожидаемому ( 0x10 = шестнадцать).

  2. Если первые четыре байта заголовка кадра ответа совпадают, проверьте, что произойдет, если вы "w ait "и передать дополнительные нулевые байты в SPI, чтобы получить дополнительные ответные байты. Вы должны получить ожидаемое количество байтов (22). Для каждого следующего байта ведомое устройство должно отправлять вам либо фиксированные биты (байты 0x00 или 0xFF), либо повторять последний байт снова и снова (если ведомое устройство довольно тупо).

    Используя это ожидаемое количество байтов, начиная с первый байт заголовка, вы можете оценить 16-битную контрольную сумму (5-й / 6-й байт, байты с прямым порядком байтов) по полезной нагрузке (с 7-го по 22-й байт) и посмотреть, соответствует ли она. Если да, я бы использовал прагматический c подход и использовал бы этот ответ. Неудобный смысл в том, что это означает, что вам придется ждать / синхронизироваться с заголовком любого кадра ответа.

  3. Следующим уровнем будет чтение firmware , с учетом схем и справочников по контроллерам , что соответствует большой части реверс-инжиниринга.

Редактировать:

PS: Как указано в документации в первом разделе на этой странице , версия Pixy2 теперь использует протокол запрос-ответ после того, как предыдущий транслировал свои данные самопроизвольно. Это может означать, что измененный протокол является совершенно новым, а документация / спецификация еще не завершена ...

PPS: Эта тема на форуме Pixy посвящена аналогичной проблеме. Аскер сообщает

При получении версии от pixy2 я заметил, что она отправляет первые 9 байтов в качестве мусора. [...]

Это не соответствует вашим результатам (вместо 11 байт мусора ...), но, возможно, разница связана с другой настройкой тактовой частоты SPI.

...