Я пытаюсь настроить и прочитать данные с 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);