Перейти к содержанию

Realtime SSI slave 18bit+ STM3L4


Cujo

Рекомендуемые сообщения

Собственно задача соорудить SSI slave Transmit only с асинхронным обновлением в реальном времени.
Контроллер сейчас STM32L433CC. 
Дано один вход SCLK до 2 МГц, один выход SOUT(он жеMISO). Формат посылки 18, 20,22 бит.
Обновление через ~15мкс после последнего такта SCLK, либо каждые 7,5 мкс.
Стандартный интерфейс для быстрых датчиков.
Как делал 
1: Без DMA и прерываний, по прерываниям от TIM_ETR на SCLK. Режим без NSS, с NSS по первому SCLK и сбросом.
Проблема нельзя узнать, записались ли данные в SPI->DR, соответственно первые байты могли быть не обновлены, а следующие обновлялись.
2: DMA с NSS по таймеру. Проблема: DMA не обновляет SPI в реальном времени, а только после отправки прошлой посылки, а нужно обновлять каждые 7,5 мкс вне зависимости есть ли запросы. 
Если пробовать сбрасывать SPI и обновлять DMA, случаются смещения на 1 такт, а потому как реакция ядра на запрос ~ 150-200 нс, + обновление ~ 150-200нс. В итоге облом.

Какие есть решения, может кто сталкивался?

 

Снимок.PNG

Изменено пользователем Cujo
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В 10.11.2018 в 21:31, Cujo сказал:

нельзя узнать, записались ли данные в SPI->DR,

Это как это? Если инструкция записи выполнена - данные записались!

Для того чтобы узнать когда они вышли на шину полностью есть флаг прерывания, что еще надо???

Вообще зачем нужен таймер? Используйте флаг опустошения буфера! Скорость SPI- настраивается, в том числе через задержки между байтами.

И для ДМА, кстати, тоже флаг опустошения буфера нужно использовать.

Изменено пользователем ruhi
дополнено

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

на самом деле проблема уже решилась с помощью трех таймеров, программного прерывания 3х внешних соединений и кучи костылей, подробнее описал на easyelectronics, если интересно

 

Проблема в том что SPI->DR обновлять можно. Те на SPI будут выдаваться последний записанных DR. Но когда приходит такт SCLK, регистр блокируется и запись в него не осуществляется. И узнать об этом никак нельзя. А обновлять данные нужно не дожидаясь прихода SCLK, он может не приходить сколь угодно долго, но данные должны быть все время актуальные.

Дело в том, что на этом контроллере есть еще 2 потока с периодом вызова 7 и 14 мкс. Останавливать их никак нельзя, и главные прежде всего они. SPI нужен чтобы вывести информацию о их вычислениях, те о угле либо положении.  Стандартный протокол выдачи в таких случаях - это SSI, есть еще BISS C - тот же проприетарный SSI с контрольной суммой. 

В общем, тему можно закрывать. Плодить костыли по интернету как-то не хочется. STM сказал: "он не рекомендует использовать их МК для реализации SSI и работоспособность такой системы не гарантирована".

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Если ещё интересно. Недавно пришлось с датчиком линейного перемещения столкнуться. Протокол SSI.

Сделал 2 варианта: 1)с использованием таймера и внешнего прерывания ; 2) с использованием SPI. 

С SPI конечно получше, больше времени на выполнение других задач остаётся, так как вместо 48 прерываний по передаче и ещё 25 прерываний по приёму для получения одного значения это очень много.

При использовании SPI только 2 прерывания. Или вообще без них.

Вот пример с SPI:

Настройка SPI

void Init_SPI2(void){
	/* Configure SPI pins: SCK and MOSI with default alternate function (not re-mapped) push-pull */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	/* Configure MISO as Input with internal pull-up */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	// SPI configuration
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 64000kHz/256=250kHz
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	//SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI2, &SPI_InitStructure);
	SPI_CalculateCRC(SPI2, DISABLE);
	SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Set);
	SPI_Cmd(SPI2, ENABLE);
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { ; }
}

Обработка

volatile uint32_t u32ssiResult;
 uint16_t u16singleTurn;
 uint16_t u16multiTurn;
 char cBuffer[32];
volatile uint32_t u32result = 0;

uint32_t spiReadSSI( void )
{
 uint8_t u8byteCount;

 for (u8byteCount=0; u8byteCount<2; u8byteCount++)
 {
	 // отправить что-нибудь для запуска тактирования
	 SPI_I2S_SendData(SPI2, 0xffff);
	 u32result <<= 16; 
	 while( !(SPI2->SR & SPI_SR_TXE) || SPI2->SR & SPI_SR_BSY);
	 u32result |= SPI_I2S_ReceiveData(SPI2);
 }

 u32result >>= 7; // убираю часть LSBs, можно не убирать, просто у меня мусор там
 return u32result;
}
int main(void)
{
	 Init_clock();
	 Init_pins();
	 Init_SPI2();
	 Init_UART2();
	 delay_ms(50);
	 Init_IWDG(2000);
	 printf("START\r");

while(1)
    {
		delay_ms(100);
		IWDG_ReloadCounter();

		if (inc_sec++ >= 5){
			inc_sec = 0;
			u32ssiResult = spiReadSSI();
			
			u16singleTurn = u32ssiResult & 0x0000FFFF; //здесь я млачшую часть взял 2 байта
			u16multiTurn = (u32ssiResult >> 16) & 0x0000000F; //старшый, только 1 байт беру, дальше цифры уже не меняются когда линейка до краёв доходит
			//Это я разделил, чтобы по 2 байта передать по юарту
             printf( "MSB = " );
             sprintf( cBuffer, "%u ", u16multiTurn);
             printf( cBuffer );
             printf( "LSB = " );
             sprintf( cBuffer, "%u ", u16singleTurn);
             printf( cBuffer );
             printf(" \r");
		}
    }
}

Вот и всё. Схема подключения - просто через модули на MAX485. Только нужно с передающего выпаять если есть резистор на 120 ом, который параллельно A-B впаян и питать его 5 вольтами. И не забыть подать питание на выбор режима работы - передача.

Из приёмного модуля можно ничего не выпаявать, питать 3.3 вольтами, выбор режима работы подсоединить к минусу питания.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...