Инструменты пользователя

Инструменты сайта


prog:mkio:example1986ve8n

Пример работы МКИО на 1986ВЕ8Т

Введение

Модуль МКИО реализован на основе 5559ИН13У2. Данная микросхема представляет собой приёмопередатчик, предназначенный для построения устройств интерфейса по ГОСТ Р 52070-2003. Об интерфейсе ГОСТ Р 52070-2003 здесь можно найти краткое описание.

Примечание.
Модуль МКИО для 1986ВЕ8(81)Т может быть выполнен на основе микросхем 5559ИН67 или на основе микросхем 5559ИН13У2.
Для модуля МКИО(5559ИН13У2) в регистре CONTROL бит [19] INVTR(разрешение инверсии сигналов) должен быть установлен в "0", а для модуля МКИО(5559ИН67) бит [19] - "1".\\

В нашем проекте мы использовали отладочную плату для МК 1986ВЕ8Т с подключенными к ней двумя модулями расширения МКИО. Один модуль МКИО будет выступать в качестве контроллера шины (КШ), другой - в качестве оконечного устройства (ОУ). Подключение между модулями осуществляется кабелем COM 9F/9F (мама - мама) прямой распайки (1-1, 2-2…9-9). МК 1986ВЕ8Т совместно с модулями МКИО реализует обмен данными по двум магистральным шинам - Bus_A и Bus_B. Bus_A используется в качестве основной шины, Bus_B в качестве резервной.

Таким образом, на отладочной плате получили следующую конструкцию:

Проект МКИО для 1986ВЕ8Т

Готовый проект МКИО для Keil 5 Вы можете скачать здесь. Сразу перейдем к его краткому разбору. При успешном обмене данными между КШ (контроллером шины) и ОУ (оконечного устройства) на отладочный плате моргает диод VD_7. Как только обмен по каким-либо причинам прекращается начинает моргать диод VD_14.

Инициализация структуры MIL

После того, как мы выполнили тактирование необходимых портов, а также сделали их конфигурацию (для диодов и для МКИО), перейдем к инициализации самого протокола MIL.

/*-- Настройка ОУ -----------------------------------------*/
MIL_STD_1553xStructInit(&MIL_STD_15531_InitStructure);
	
/* Инициализация структуры MIL_STD_1553_InitStructure */
MIL_STD_15531_InitStructure.MIL_STD_1553_Mode = MIL_STD_1553_ModeTerminal; // Режим работы
MIL_STD_15531_InitStructure.MIL_STD_1553_RERR = DISABLE;                   // Сброс ошибок в режиме ОУ
MIL_STD_15531_InitStructure.MIL_STD_1553_DIV = 80;                         // Делитель частоты РСLK блока МКИО до 1 МГц
MIL_STD_15531_InitStructure.MIL_STD_1553_RTA = 0x01;                       // Адрес оконечного устройства
MIL_STD_15531_InitStructure.MIL_STD_1553_TRA = ENABLE;                     // Передатчик основного канала
MIL_STD_15531_InitStructure.MIL_STD_1553_TRB = ENABLE;                     // Передатчик резервного канала
/* Конфигурация параметров MIL_STD_15531 */
MIL_STD_1553_Init(MIL_STD_15531, &MIL_STD_15531_InitStructure);
	
/*-- Настройка КШ -----------------------------------------*/
MIL_STD_1553xStructInit(&MIL_STD_15532_InitStructure);
	
/* Инициализация структуры MIL_STD_1553_InitStructure */
MIL_STD_15532_InitStructure.MIL_STD_1553_Mode = MIL_STD_1553_ModeBusController; // Режим работы
MIL_STD_15532_InitStructure.MIL_STD_1553_RERR = ENABLE;                         // Сброс ошибок в режиме ОУ
MIL_STD_15532_InitStructure.MIL_STD_1553_DIV = 80;                              // Делитель частоты РСLK блока МКИО до 1 МГц
MIL_STD_15532_InitStructure.MIL_STD_1553_RTA = 0;                               // Адрес оконечного устройства (только для ОУ)
MIL_STD_15532_InitStructure.MIL_STD_1553_TRA = ENABLE;                          // Передатчик основного канала
MIL_STD_15532_InitStructure.MIL_STD_1553_TRB = DISABLE;                         // Передатчик резервного канала
/* Конфигурация параметров MIL_STD_15532 */
MIL_STD_1553_Init(MIL_STD_15532, &MIL_STD_15532_InitStructure);

Опорная частота блока контроллера МКИО должна быть 1 МГц. В настройках тактирования МК была получена частота 80 МГц, поэтому чтобы получить 1 МГц для МКИО, нам необходимо указать делитель частоты DIV = 80.

MIL_STD_15532_InitStructure.MIL_STD_1553_DIV = 80;                              // Делитель частоты РСLK блока МКИО до 1 МГц

В настройках КШ для обмена данными мы указали только основной канал.

MIL_STD_15532_InitStructure.MIL_STD_1553_TRA = ENABLE;                          // Передатчик основного канала
MIL_STD_15532_InitStructure.MIL_STD_1553_TRB = DISABLE;                         // Передатчик резервного канала

Для ОУ в общем случае необходимо разрешить обмен данными для всех каналов, так как ОУ не может выбирать, по какому каналу ему передавать СД и ОС, и поэтому их передача происходит по тому каналу, по которому было принято КС.

MIL_STD_15531_InitStructure.MIL_STD_1553_TRA = ENABLE;                     // Передатчик основного канала
MIL_STD_15531_InitStructure.MIL_STD_1553_TRB = ENABLE;                     // Передатчик резервного канала

Основной цикл и передача слова

В основном цикле мы с помощью функции StartTRM формируем и отправляем командное слово, затем ожидаем окончания передачи по биту BCSTART регистра CONTROL. После отправки слова по значению флага Valmess (флаг успешного завершения транзакции в канале) зажигаем либо светодиод VD7 при успешной транзакции, либо VD14, если транзакция завершена с ошибкой.

while(1)
{
		
StartTRM();
			
while((MIL_STD_1553_BCSTART_bit_stat(MIL_STD_15532)) != RESET){} // Ожидание окончания передачи
			
if(MIL_STD_1553_GetFlagStatus(MIL_STD_15532, MIL_STD_1553_FLAG_VALMESS) != RESET) // Если установлен флаг Valmess
		{
			PORT_SetBits(PORTC, PORT_Pin_16); // Зажигаем VD7
			PORT_ResetBits(PORTC, PORT_Pin_23); // Гасим VD14
		}
if(MIL_STD_1553_GetFlagStatus(MIL_STD_15532, MIL_STD_1553_FLAG_ERR) != RESET)	// Если установлен флаг ошибки
		{
			PORT_SetBits(PORTC, PORT_Pin_23); // Зажигаем VD14
			PORT_ResetBits(PORTC, PORT_Pin_16); // Гасим VD7
		}
				
		Delay(500000); // Функция задержки
		PORT_ResetBits(PORTC, PORT_Pin_16|PORT_Pin_23); // Гасим светодиоды VD7 и VD14
		Delay(500000);

}
void StartTRM()
{
/* Сформировать командное слово для отправки */
MIL_STD_1553_CommandWord1.Fields.Data = 5; // Количество принимаемых или передаваемых слов данных
MIL_STD_1553_CommandWord1.Fields.Subaddress = 1; // Подадрес, по которому в памяти располагаются принимаемые или передаваемые СД
MIL_STD_1553_CommandWord1.Fields.ReadWriteBit = 0; // Бит приёма/передачи: 0 - передача данных от КШ к ОУ, 1 - от ОУ к КШ
MIL_STD_1553_CommandWord1.Fields.TerminalDeviceAddress = 1; // Адрес ОУ
	
/* Записать командное слово в буфер */
MIL_STD_1553_SetCommandWord(MIL_STD_15532, MIL_STD_1553_COMMAND_WORD1, &MIL_STD_1553_CommandWord1);
/* Установить активным каналом передачи: основной канал */
MIL_STD_1553_Transmitter_CMD(MIL_STD_15532, MIL_STD_1553_TRANSMITTER_MAIN, ENABLE);
/* Начать передачу */
MIL_STD_1553_StartTransmision(MIL_STD_15532);
}

Запуск программы

Подключаем кабель между модулям МКИО, включаем питание, запускаем проект в режиме отладки. Если передачи идёт корректно, то мигает левый светодиод VD7. Теперь выйдем из режима отладки, выключим питание и отсоединим кабель от одного модуля. Пробуем запустить проект ещё раз. Теперь мигает правый светодиод VD14 - связи в канале нет.

prog/mkio/example1986ve8n.txt · Последние изменения: 2019/04/05 10:32 — katya