SPI с акселерометром LIS2DE12 - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь настроить и прочитать данные с LIS2DE12 Acc с помощью SPI Comm. Мастер SPI - EM9304 uC. Сначала я пытаюсь прочитать регистр «КТО Я ЕСМЬ» и сравнить с идентификатором, указанным в техническом паспорте LIS2DE12. Модуль отвечает, но с помощью осциллографа я обнаружил, что он продолжает отправлять свой идентификатор через MISO при каждой транзакции.

Например, если я записываю несколько байтов в LIS2DE12, в то время как MOSI отправляет байтMISO отправляет идентификатор LIS2DE12. Если я пытаюсь прочитать другой регистр с известным значением, он все равно отвечает идентификатором LIS2DE12 и не отправляет содержимое регистра.

Я новичок в SPI Comm, но не думаю, что это нормальное поведение.

Это структура, используемая для передачи байтов.

typedef struct{

struct{

    uint8_t address     : 6;   //6bit address
    uint8_t ms          : 1;   //If 0, keep the address unchanged, else, it increments the address in case of writing/reading multiple bytes
    uint8_t mode        : 1;   //Read/Write

}control;

    uint8_t data;             //8bit data

}SPIM_Transaction_t;

Некоторые распечатки происходящего.

Тактовые и MOSI сигналы

Часы и сигналы MISO

На изображении MOSI первые 2 байта представляют попытку записи.

Первый байт:

00100011 байт:

0 - запись / 0 - не увеличивать адрес / 100011 - 0x0F - адрес регистра

второй байт:

00110000 байт: 0x30 - значение, которое я хочузагрузить в регистр.

Следующие 2 байта представляют попытку чтения этого же регистра: 10100011

1 - Чтение 0 - Не увеличивать адрес 100011 - (0x23) - Адрес регистра

И 8 битов нуля, ожидая, что датчик ответит 8-битными данными.

In the Часы и изображение MISO, мы видим, что датчик отвечает 0x33, когда есть сигнал синхронизации. Из-за симметрии это может быть просто случайный сигнал или сигнал ошибки.

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

Я использую библиотеку SPI и использую эту функцию для записи байтов:

/**
* @brief Performs one or more write operations.
*
* This is a non-blocking operation, the input buffer cannot be modified until
* the transaction is complete.
*
* @note If the buffer is on the stack, you must ensure that the transaction
*   completes before the function exits.
*
* @param chipSelectGpio Number of the GPIO to use for the chip select.
* @param[in] pWriteBuffer An array of data to write to the device.
* @param bytes The number of entries in the source array.
* @param[in] callbackFunction The function to call after the transaction is
*   complete, the return status is passed as an argument.
* @param[in] pUserData The data to pass to the callback function.
* @param frequency Maximum clock frequency to send the transaction at or 0 to
*   not change the clock frequency (previous frequency is used).
* @returns true if the transaction was scheduled, false otherwise.
*/
//lint -function( fopen(1), SPIM_WriteBytes(2) ) // arg cannot be null
bool SPIM_WriteBytes(uint8_t chipSelectGpio, const uint8_t *pWriteBuffer,
 uint8_t bytes, Driver_Callback_t callbackFunction, void *pUserData,
 uint32_t frequency);
...