Имею контроллер STM32F103C8T6. Подключаю к нему по интерфейсу SPI два устройства: монитор ST7735 и Акселегиромагнетометр MPU9250 к SPI1 контроллера, используя соединение типа звезда. Первые секунды работает нормально, потом начинается котавасия с данными от MPU, монитор начинает глючить.
Если одно устройство посадить на SPI1, а второе на SPI2, то глюков нет.
Задача стоит посадить на один интерфейс SPI1 два устройства. Я так понимаю что данные по MOSI и MISO перекрещиваются. Это наверное связано с синхронизацией данных. Где-то должно быть решение, которого я не знаю.
Вот часть кода в главном цикле программы:
while (1){ ak8963_WhoAmI = mpu_r_ak8963_WhoAmI(&mpu); mpu9250_WhoAmI = mpu_r_WhoAmI(&mpu); MPU9250_ReadAccel(&mpu); MPU9250_ReadGyro(&mpu); MPU9250_ReadMag(&mpu); HAL_Delay(100); sprintf(SAccX, "AX = %d ", mpu.mpu_data.Accel_row[0]); sprintf(SAccZ, "AY = %d ", mpu.mpu_data.Accel_row[1]); sprintf(SAccY, "AZ = %d ", mpu.mpu_data.Accel_row[2]); sprintf(SGirX, "GX = %d ", mpu.mpu_data.Gyro_row[0]); sprintf(SGirZ, "GY = %d ", mpu.mpu_data.Gyro_row[1]); sprintf(SGirY, "GZ = %d ", mpu.mpu_data.Gyro_row[2]); sprintf(SMagX, "MX = %d ", mpu.mpu_data.Magn_row[0]); sprintf(SMagZ, "MY = %d ", mpu.mpu_data.Magn_row[1]); sprintf(SMagY, "MZ = %d ", mpu.mpu_data.Magn_row[2]); ST7735_WriteString(0, 0, SAccX, Font_7x10, ST7735_GREEN, ST7735_BLACK); ST7735_WriteString(0, 15, SAccY, Font_7x10, ST7735_GREEN, ST7735_BLACK); ST7735_WriteString(0, 30, SAccZ, Font_7x10, ST7735_GREEN, ST7735_BLACK); ST7735_WriteString(0, 45, SGirX, Font_7x10, ST7735_RED, ST7735_BLACK); ST7735_WriteString(0, 60, SGirY, Font_7x10, ST7735_RED, ST7735_BLACK); ST7735_WriteString(0, 75, SGirZ, Font_7x10, ST7735_RED, ST7735_BLACK); ST7735_WriteString(0, 90, SMagX, Font_7x10, ST7735_BLUE, ST7735_BLACK); ST7735_WriteString(0, 105, SMagY, Font_7x10, ST7735_BLUE, ST7735_BLACK); ST7735_WriteString(0, 120, SMagZ, Font_7x10, ST7735_BLUE, ST7735_BLACK); }
Чтение данных от MPU и через 100 мс вывод в монитор.
Подскажите чего не хватает?
Должно через Chip Select'ы устройств разруливаться, когда какое из них активно и участвует в обмене данными.
Chip Select у меня организован вроде. 2 пина организовал на вывод. 1 пин для работы с MPU, 2-ой для работы с монитором. И они не пересекаются.
Я что-то не понял, в дублирующей теме вообще ничего не работает на самом раннем этапе?
Вообщем я нашел решение: Между Chip Select'ами нужно делать задержку. Поработал с 1 устройством, задержка, поработал со 2 устройством, задержка. Т.е. контроллеру нужно время на освобождение Chip Select'а.
@mihayk 100 мс, которые в коде, не хватает? Хотя после работы с дисплеем их нет.
Я что-то не понял, в дублирующей теме вообще ничего не работает на самом раннем этапе?
Я не понял вопрос! Я создал еще одну тему, не связанную с этой!
@mihayk Ну там тоже MPU9250, здесь читаются данные верно, а там не читается даже регистр WHO_AM_I.
@mihayk 100 мс, которые в коде, не хватает?
да, именно так. Поработав некоторое время - около 10 минут, опять все разрушилось. Видимо 100 мс не хватает
@mihayk Ну там тоже MPU9250, здесь читаются данные верно, а там не читается даже регистр WHO_AM_I.
Здесь вопрос был про SPI.
@mihayk Чуть систематизирую свой вопрос:
- в этой теме - STM32F103C8T6 + SPI + MPU9250 - данные верные, проблема при работе с дисплеем
- в той теме - STM32F103C8T6 + SPI + MPU9250 - не читается "базовый" регистр WHO_AM_I.
Вот я не понял - как так, отличие в чем?
@mihayk Чуть систематизирую свой вопрос:
- в этой теме - STM32F103C8T6 + SPI + MPU9250 - данные верные, проблема при работе с дисплеем
- в той теме - STM32F103C8T6 + SPI + MPU9250 - не читается "базовый" регистр WHO_AM_I.
Вот я не понял - как так, отличие в чем?
Первая проблема была, когда 2 устройства на одной шине SPI Мешали друг другу работать. О правильности данных речь не шла. Эту проблему решил, сделав задержку между Chip Select'ами.
Вторая проблема как раз в правильности данных. Или вы считаете что вторая проблема выходит из первой? Не исключено, конечно.
Но еще раз повторяюсь, если посадить MPU на другую шину SPI (SPI2), то регистры WHO_AM_I все равно не соответствуют ожидаемым значениям.
Надеюсь здесь все понятно объяснил! :))))
@mihayk А здесь получается WHO_AM_I тоже неверный, но данные с датчиков верные? То есть WHO_AM_I вообще при любых раскладах не соответствует?)
Вообще там вроде 0x71 должно быть, если считывается 0x70, то скорее всего модификация просто чуть другая, 0x72 я вроде видел тоже на практике.
Вот с магнитометром проблема, должно быть 0x48.
Извините, я поспешил с выводами первой проблемы. Через долгое время работы, данные от MPU начинают скакать вразброс. Потом монитор начинает показывать в зеркальном отображении. Помогает только перезагрузка. Вот тут не понятно: шина SPI влияет или само MPU. А вот при чем тут монитор, это мне просто взрывает мозг. Вот перезапустил контроллер - данные акселерометра и гироскопа вроде пока идут корректно.
Насчет магнетометра, За всю историю борьбы с MPU, он мне всего один раз вернул значение 0x48 и данные магнетометра были не 0.