Привіт! У мене проблема з отриманням даних із датчика LSM6DS3. Коли я намагаюся прочитати значення реєстру "WHO_AM_I", я отримую надто короткі імпульси у відповідь, які не можуть бути прочитані поданими до його тактового сигналу.

Я використовую цю плату з сенсором. SPI. Головним є STM32F411.
3v3 -> 3,3 В
GND -> GND
SA0 -> PA6 -> SPI1_MISO
CS -> PA4 -> GPIOA4
SDA -> PA7 -> SPI1_MOSI
SCL -> PA5 -> SPI1_SCK
У випадку, коли я надсилаю значення 0x8F, я отримую результат, як показано нижче. У той же час я повинен отримати значення 0x69 або 01101001 у двійковому вигляді. І якщо ви важливо подивіться на результати нижче, ви побачите, ніби щось заважає, імпульс занадто короткі, щоб їх можна було записати.



Я намагався прочитати значення в інших реєстрах "CTRL9_XL" і там така ситуація. Я повинен отримати 00111000, але я отримав 00110000, ніби імпульси не були стиснуті та записані на одне значення менше:


Налаштування SPI:
void SpiConfig(void){
RCC->APB2ENR |= (1 << 12);
////////////////////////////////////////////////// //////////
SPI1->CR1 |= (1 << 0) | (1 << 1); //CPHA=1 CPOL=1
SPI1->CR1 |= (1 << 2); //Майстер мод
SPI1->CR1 |= (2 << 3); //010: fPCLK/8 BR[2:0] 5 МГц SPI CLK
SPI1->CR1 &= ~(1 << 7); //LSBFIRST = 0 => спочатку MSB, потім LSB
SPI1->CR1 |= (1 << 8) | (1 << 9); //Високий рівень SSI та SSM Керування програмним забезпеченням увімкнено
SPI1->CR1 &= ~(1 << 10); //RXONLY = 0 => Повний дуплексний мод
SPI1->CR1 &= ~(1 << 11); //8-бітний
SPI1->CR2 = 0;
}
Налаштування GPIO:
void SpiGPIOConfig(void){
RCC->AHB1ENR |= (1 << 0); //Увімкнути RCC для GPIO_A
GPIOA->MODER |= (2 << 10) | (2 << 12) | (2 << 14) | (1 << 8);
//Альтернативна функція для PA5/6/7 загального виводу для PA4
GPIOA->MODER &= ~(1 << 9); //Push-Pull для PA5/6/7/4 (за замовчуванням)
GPIOA->OSPEEDR |= (3 << 10) | (3 << 12) | (3 << 14) | (3 << 8); //Висока швидкість для PA5/6/7/4
GPIOA->AFR[0] |= (5 << 20) | (5 << 24) | (5 << 28); //AF5 (AFRL 0 - 7) на PA5/6/7
}
Передача:
void SPI_Transmit (uint8_t *дані, int size){
//1. Дочекатися встановлення біта TXE у стані реєстрації
int i = 0;
while(i < розмір){
while (!((SPI1->SR) & (1 << 1))){}; //Дочекайтеся інсталяції біта TXE -> Це вкажіть, що буфер порожній
SPI1->DR = дані[i]; //Завантажити дані в реєстрі даних
i++;
}
while(!((SPI1->SR) & (1 << 1))){}; //Дочекайтеся інсталяції біта TXE -> Це вкажіть, що буфер порожній
while(((SPI1->SR) & (1 << 7))){}; //Зачекайте, поки біт BSY скінеться -> Це означаємо, що SPI не зайняті комунікаціями
uint8_t temp = SPI1->DR;
температура = SPI1->SR;
}
Основна функція:
...
uint8_t RxData[6];
адреса uint8_t = 0x8f;
while(1){
CS_EN(); // потягнути шпильку низько
SPI_Transmit (&адреса, 1); // відправити адресу
SPI_Receive (RxData, 1); // отримати 1 байт даних
CS_DIS(); // витягнути шпильку високо
Delay_ms(1);
}
Якщо для пошуку помилки потрібно ще щось надати, то скажіть, все що потрібно надам