Top.Mail.Ru
Уведомления
Очистить все

[Решено] SPI Соединение 2-х устройств по типу звезда

Страница 1 / 4
(@mihayk)
Level 3

Имею контроллер 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 мс вывод в монитор. 

Подскажите чего не хватает?

 

Цитата
Создатель темы Размещено : 13.10.2023 10:37
Aveal
(@aveal)
Top level Admin

Должно через Chip Select'ы устройств разруливаться, когда какое из них активно и участвует в обмене данными.

ОтветитьЦитата
Размещено : 13.10.2023 10:51
(@mihayk)
Level 3

Chip Select у меня организован вроде. 2 пина организовал на вывод. 1 пин для работы с MPU, 2-ой для работы с монитором. И они не пересекаются. 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 11:17
Aveal
(@aveal)
Top level Admin

Я что-то не понял, в дублирующей теме вообще ничего не работает на самом раннем этапе?

ОтветитьЦитата
Размещено : 13.10.2023 11:32
(@mihayk)
Level 3

Вообщем я нашел решение: Между Chip Select'ами нужно делать задержку. Поработал с 1 устройством, задержка, поработал со 2 устройством, задержка. Т.е. контроллеру нужно время на освобождение Chip Select'а.

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 11:33
Aveal
(@aveal)
Top level Admin

@mihayk 100 мс, которые в коде, не хватает? Хотя после работы с дисплеем их нет.

ОтветитьЦитата
Размещено : 13.10.2023 11:35
(@mihayk)
Level 3
От: @aveal

Я что-то не понял, в дублирующей теме вообще ничего не работает на самом раннем этапе?

Я не понял вопрос! Я создал еще одну тему, не связанную с этой! 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 11:36
Aveal
(@aveal)
Top level Admin

@mihayk Ну там тоже MPU9250, здесь читаются данные верно, а там не читается даже регистр WHO_AM_I.

ОтветитьЦитата
Размещено : 13.10.2023 11:37
(@mihayk)
Level 3
От: @aveal

@mihayk 100 мс, которые в коде, не хватает?

да, именно так. Поработав некоторое время - около 10 минут, опять все разрушилось. Видимо 100 мс не хватает

 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 11:39
(@mihayk)
Level 3
От: @aveal

@mihayk Ну там тоже MPU9250, здесь читаются данные верно, а там не читается даже регистр WHO_AM_I.

Здесь вопрос был про SPI. 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 11:41
Aveal
(@aveal)
Top level Admin

@mihayk Чуть систематизирую свой вопрос:

  • в этой теме - STM32F103C8T6 + SPI + MPU9250 - данные верные, проблема при работе с дисплеем
  • в той теме - STM32F103C8T6 + SPI + MPU9250 - не читается "базовый" регистр WHO_AM_I.

Вот я не понял - как так, отличие в чем?

ОтветитьЦитата
Размещено : 13.10.2023 11:44
(@mihayk)
Level 3
От: @aveal

@mihayk Чуть систематизирую свой вопрос:

  • в этой теме - STM32F103C8T6 + SPI + MPU9250 - данные верные, проблема при работе с дисплеем
  • в той теме - STM32F103C8T6 + SPI + MPU9250 - не читается "базовый" регистр WHO_AM_I.

Вот я не понял - как так, отличие в чем?

Первая проблема была, когда 2 устройства на одной шине SPI Мешали друг другу работать. О правильности данных речь не шла. Эту проблему решил, сделав задержку между Chip Select'ами. 

Вторая проблема как раз в правильности данных. Или вы считаете что вторая  проблема выходит из первой? Не исключено, конечно. 

Но еще раз повторяюсь, если посадить MPU на другую шину SPI (SPI2), то регистры WHO_AM_I все равно не соответствуют ожидаемым значениям.

Надеюсь здесь все понятно объяснил! :)))) 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 13:13
Aveal
(@aveal)
Top level Admin

@mihayk А здесь получается WHO_AM_I тоже неверный, но данные с датчиков верные? То есть WHO_AM_I вообще при любых раскладах не соответствует?)

ОтветитьЦитата
Размещено : 13.10.2023 13:32
Aveal
(@aveal)
Top level Admin

Вообще там вроде 0x71 должно быть, если считывается 0x70, то скорее всего модификация просто чуть другая, 0x72 я вроде видел тоже на практике.

Вот с магнитометром проблема, должно быть 0x48.

ОтветитьЦитата
Размещено : 13.10.2023 13:36
(@mihayk)
Level 3

Извините, я поспешил с выводами первой проблемы. Через долгое время работы, данные от MPU начинают скакать вразброс. Потом монитор начинает показывать в зеркальном отображении. Помогает только перезагрузка. Вот тут не понятно: шина SPI влияет или само MPU. А вот при чем тут монитор, это мне просто взрывает мозг. Вот перезапустил контроллер - данные акселерометра и гироскопа вроде пока идут корректно. 

Насчет магнетометра, За всю историю борьбы с MPU, он мне всего один раз вернул значение 0x48 и данные магнетометра были не 0. 

ОтветитьЦитата
Создатель темы Размещено : 13.10.2023 14:01
Страница 1 / 4
Поделиться: