skyazimuth писал(а): ↑08 ноя 2023, 17:29
Добрый день!
1 В примере и в документации не очень понятно назначение поля дескриптора "Указатель на следующий дескриптор".
Код: Выделить всё
mstd0_rt_tx_desc[i].NEXT_DESCR_PTR = (uint32_t) &mstd0_rt_tx_desc[i]; //Замыкаем цепочку сообщений;
2 Не понятно как работает поле RUN регистра MILSTD0->RTSTAT, наблюдаю всегда "1".
При этом поле ACT этого регистра работает вроде логично - выставляется в «1» после командного слова и сбрасывается в «0» перед выдачей ответного слова (проверил на форматах 1, 2).
3 Отладочная плата КФДЛ.441461.024 КДФЛ.687265.003 В. При установке переключателей SA5 (адрес ОУ) 00001 в поле RTADDR регистра MILSTD0->RTCON вижу "2", при 00010 - вижу "1".
Ошибка в разводке или в микроконтроллере. К ножках, естественно, не посмотреть.
4 Как в принципе предполагается защита от возможной коллизии если буфер на передачу меняется во время выдачи данных в линию (при асинхронном изменении буферов)?
Доброго времени суток!
1) Предполагается использование цепочки дескрипторов для задействования разных буферов при приеме и передаче данных.
Поле дескриптора "Указатель на следующий дескриптор" (NEXT_DESCR_PTR) содержит адрес места в памяти, где находится следующий дескриптор в цепочке, на который переключится интерфейс MilStd после выполнения передачи в соответствии с текущим дескриптором. Данное поле необходимо при создании списка дескрипторов. То есть для одного подадреса можно создать набор дескрипторов (с разной конфигурацией), управляющих передачами. Для указания последнего дескриптора в списке, в данное поле записывается значение 03h или указатель на этот же самый дескриптор.
Как пример, можно создать список дескрипторов, состоящий из двух элементов. Поле указателя на следующий дескриптор (для первого) будет указывать на второй, а поле указателя второго обратно на первый. Для каждого из них можно создать отдельные буферы в памяти (и записать их адреса в поле указателя на буфер). Для отслеживания, какой из дескрипторов отработал последним, можно отслеживать (например в прерывании) изменение управляющего и статусного слова дескриптора (CTRLSTAT). У данного слова, после выполнения передачи, изменятся поля DV и TIME (установится бит DV и в поле TIME будет записано время передачи). Чтобы при дальнейшей работе дескриптор мог сработать снова, нужно программно сбросить бит DV слова CTRLSTAT дескриптора. Если бит DV не сбросить, следующая передача выполнена не будет. Это может помочь для предотвращения коллизии.
2) Поле RUN регистра MILSTD0->RTSTAT установлено, когда удаленный терминал слушает линию и готов принимать команды, фактически - когда установлен бит RTEN регистра MILSTD0->RTCON.
3) Да, на топологии платы макетно-отладочной для MILSTD0 перепутаны разряды 0 и 1 адреса удаленного терминала.
4) см. п.1.