Исправить скорость SCI и добавить диагностику ошибок приёма RS232
Округлить делитель SCI по формуле аппаратуры, настроить вход RX и обработку ошибок FIFO. Добавить диагностические поля и проверки модели, установить 9600 бод для RS485 при Owen. Сохранить скрипт сборки, обновлённый образ прошивки и карту линковки.
This commit is contained in:
@@ -3,6 +3,7 @@ static char size_cmd15; /* Моделирует локальную настро
|
||||
|
||||
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS SciaRegs,ScibRegs;; порядок элементов сохраняется. */
|
||||
volatile struct SCI_REGS SciaRegs,ScibRegs;
|
||||
long LSPCLK=60000000L; /* Моделирует частоту SCI 60 МГц из текущего проекта, чтобы проверять настоящий расчёт BRR. */
|
||||
/* Описывает структуру ; порядок полей определяет расположение данных. */
|
||||
struct { struct { struct { unsigned ACK9; } bit; } PIEACK; } PieCtrlRegs;
|
||||
/* Описывает структуру ; порядок полей определяет расположение данных. */
|
||||
@@ -112,6 +113,7 @@ static void reset(void)
|
||||
rs_a.commnumber=1;rs_b.commnumber=2;rs_a.SciRegs=&SciaRegs;rs_b.SciRegs=&ScibRegs;
|
||||
/* Записывает SciaRegs.SCICTL2.bit.TXEMPTY значением ScibRegs.SCICTL2.bit.TXEMPTY=1; данные TXEMPTY. */
|
||||
SciaRegs.SCICTL2.bit.TXEMPTY=ScibRegs.SCICTL2.bit.TXEMPTY=1;
|
||||
SciaRegs.SCICTL1.bit.RXERRINTENA=1; /* Повторяет штатное разрешение ошибок SCI-A, чтобы проверить их фактическое отключение на время TX и последующее включение. */
|
||||
/* Записывает rs_a.RS_Flag9bit значением rs_b.RS_Flag9bit=1; RS флаг 9 бит. */
|
||||
rs_a.RS_Flag9bit=rs_b.RS_Flag9bit=1;
|
||||
/* Записывает RS_Len[3] значением 8;RS_Len[6]=8;RS_Len[16]=13;RS_Len[51]=12; таблица ожидаемых длин команд последовательного протокола. */
|
||||
@@ -151,6 +153,30 @@ int main(void)
|
||||
assert(memcmp(&rs_a, &expected, sizeof(rs_a)) == 0); /* Проверяет все поля и оба буфера первого порта, включая флаги готовности. */
|
||||
expected.commnumber = COM_2; /* Подготавливает ожидаемое состояние второго порта. */
|
||||
assert(memcmp(&rs_b, &expected, sizeof(rs_b)) == 0 && size_cmd15 == 17); /* Проверяет второй порт и сохранение настройки длины команды. */
|
||||
reset(); /* Назначает регистры портов после проверки полного сброса RAM. */
|
||||
RS_SetLineSpeed(&rs_a,115200UL); /* Воспроизводит установку скорости RS232, на которой наблюдались ошибки приёма. */
|
||||
assert(SciaRegs.SCIHBAUD==0 && SciaRegs.SCILBAUD==64 && rs_a.curr_baud==115200UL); /* Проверяет BRR=64 по формуле LSPCLK/(8*baud)-1; прежний код ошибочно записывал 65. */
|
||||
RS_SetLineSpeed(&rs_b,9600UL); /* Проверяет общую функцию на выбранной пользователем скорости второго порта. */
|
||||
assert(ScibRegs.SCIHBAUD==3 && ScibRegs.SCILBAUD==12 && rs_b.curr_baud==9600UL); /* Проверяет округлённый BRR=780=0x030C для 60 МГц и 9600 бод. */
|
||||
RS_SetLineSpeed(&rs_a,57600UL); /* Проверяет альтернативную стандартную скорость без дробных операций. */
|
||||
assert(SciaRegs.SCIHBAUD==0 && SciaRegs.SCILBAUD==129); /* Проверяет BRR=129, соответствующий отношению 130,2083, округлённому до 130. */
|
||||
RS_SetLineSpeed(&rs_a,19200UL); /* Проверяет округление вверх при дробной части отношения 0,625. */
|
||||
assert(SciaRegs.SCIHBAUD==1 && SciaRegs.SCILBAUD==134); /* Проверяет BRR=390=0x0186 после округления отношения 390,625 до 391. */
|
||||
RS_SetLineSpeed(&rs_a,0UL); /* Передаёт ошибочную нулевую скорость для проверки защиты от деления на ноль. */
|
||||
RS_SetLineSpeed(&rs_a,0xFFFFFFFFUL); /* Проверяет защиту 32-битного произведения baud*8 от переполнения. */
|
||||
assert(SciaRegs.SCIHBAUD==1 && SciaRegs.SCILBAUD==134 && rs_a.curr_baud==19200UL); /* Неверные аргументы не должны изменять регистры и диагностическую скорость. */
|
||||
RS_SetLineSpeed(&rs_a,1UL); /* Проверяет ограничение слишком большого делителя, не представимого в 16-битном BRR. */
|
||||
assert(SciaRegs.SCIHBAUD==255 && SciaRegs.SCILBAUD==255); /* Ограничение должно дать BRR=65535, а не обёрнутое значение младших битов. */
|
||||
RS_SetLineSpeed(&rs_a,4000000UL); /* Проверяет ограничение скорости выше аппаратного максимума LSPCLK/16=3750000 бод. */
|
||||
assert(SciaRegs.SCIHBAUD==0 && SciaRegs.SCILBAUD==1); /* Проверяет минимальный обычный BRR=1, соответствующий аппаратному пределу. */
|
||||
reset(); /* Подготавливает ошибку BREAK при пустом FIFO, которая не вызывает RX-прерывание по уровню. */
|
||||
SciaRegs.SCIRXST.all=0xA0U; /* Устанавливает RXERROR в бите 7 и BRKDT в бите 5 по карте регистра TI SPRUI07. */
|
||||
RS_RX_Handler(&rs_a); /* Вызывает настоящий обработчик общей ошибки без чтения отсутствующего байта. */
|
||||
assert(rs_a.fifo_rx_errors==1 && rs_a.fifo_rx_bytes==0 && rs_a.fifo_rx_last_status==0xA0U); /* Подтверждает сохранение BREAK до SWRESET и отсутствие фиктивного чтения FIFO. */
|
||||
assert(!SciaRegs.SCIRXST.all && !rs_a.fifo_rx_last_error_word); /* Подтверждает сброс аппаратного состояния и отсутствие повреждённого слова при пустом FIFO. */
|
||||
for(i=0;i<4;i++) RS_FifoTick1ms(); /* Выдерживает защитную паузу 3–4 мс после ошибки перед новым адресом. */
|
||||
feed(&rs_a,request,8); /* Передаёт корректную восьмибайтную команду после восстановления приёмника. */
|
||||
assert(rs_a.RS_DataReady && rs_a.fifo_rx_bytes==8); /* Проверяет реальное восстановление обработки команд после BREAK. */
|
||||
|
||||
/* Цикл for(mode=0;mode<2;mode++)for(a=0;a<sizeof(sizes)/sizeof(sizes[0]);a++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(mode=0;mode<2;mode++)for(a=0;a<sizeof(sizes)/sizeof(sizes[0]);a++) {
|
||||
@@ -160,10 +186,12 @@ int main(void)
|
||||
if(mode==0 && n>4200)continue;
|
||||
/* Вызывает assert с аргументами ((mode ? RS_BSend(&rs_a,data,n):RS_Send(&rs_a,data,n))==0) в текущей последовательности операций. */
|
||||
assert((mode ? RS_BSend(&rs_a,data,n):RS_Send(&rs_a,data,n))==0);
|
||||
if (rs_a.fifo_tx_active) assert(!SciaRegs.SCICTL1.bit.RXERRINTENA); /* Во время активной передачи шум RX не должен сбрасывать SCI через прерывание ошибки. */
|
||||
/* Проверяет if(n и rs_a.fifo_tx_active)assert(rs_a.RS_Flag9bit==0); последующий оператор выполняется только при истинном условии. */
|
||||
if(n && rs_a.fifo_tx_active)assert(rs_a.RS_Flag9bit==0);
|
||||
/* Вызывает RS_FifoWait. Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
|
||||
RS_FifoWait(&rs_a);assert(!rs_a.fifo_tx_active && wire_count[0]==n);
|
||||
if (n) assert(SciaRegs.SCICTL1.bit.RXERRINTENA); /* После любого непустого блока защита от BREAK должна возвращаться вместе с приёмом FIFO. */
|
||||
/* Цикл for(i=0;i<n;i++)assert(wire[0][i]==(mode?((i&1)?LOBYTE(data[i/2]):HIBYTE(data[i/2])):LOBYTE(data[i])));; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0;i<n;i++)assert(wire[0][i]==(mode?((i&1)?LOBYTE(data[i/2]):HIBYTE(data[i/2])):LOBYTE(data[i])));
|
||||
assert(GpioDataRegs.GPBDAT.bit.GPIO34==1); /* RS232 never touches DE */ /* Вызывает assert с аргументами (GpioDataRegs.GPBDAT.bit.GPIO34==1) в текущей последовательности операций. */
|
||||
@@ -208,6 +236,7 @@ int main(void)
|
||||
reset();request[3]=0xC000;feed(&rs_a,request,8);
|
||||
/* Вызывает assert с аргументами (!rs_a.RS_DataReady && rs_a.fifo_rx_errors==1 && rs_a.fifo_rx_guard) в текущей последовательности операций. */
|
||||
assert(!rs_a.RS_DataReady && rs_a.fifo_rx_errors==1 && rs_a.fifo_rx_guard);
|
||||
assert(rs_a.fifo_rx_last_error_word==0xC000U && rs_a.fifo_rx_bytes==4); /* Ошибка четвёртого байта должна сохранить оба признака FE/PE и точное число чтений. */
|
||||
/* Записывает request[3] значением 0;feed(&rs_a,request,8);assert(!rs_a.RS_DataReady); данные request. */
|
||||
request[3]=0;feed(&rs_a,request,8);assert(!rs_a.RS_DataReady);
|
||||
/* Цикл for(i=0;i<4;i++)RS_FifoTick1ms();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
|
||||
Reference in New Issue
Block a user