Программа рассчитана для Silabs C8051F410.
отладка в кейле
В общем я хотел реализовать простой алгоритм. Отправляем четыре байта через терминал в контроллер, и принимаем от него те же 4 байта.
но почему то идет повтор первых двух байтов при передачи MCU->PC.
Не могу найти ошибку. Может Вы взглянете свежим взглядом?
Текст программы ниже. попытался как можно подробней за комментировать.
- Код: Выделить всё • Развернуть
- #include "D:\progects\test\macros\Includes.h"
 /********** привел только объявление переменных. настройка УАПП взята из примера в IDE***********/
 int UART_Buffer[3];
 unsigned char TX_Ready =1;
 static char Byte;
 char i=0,temp;
 bit stop=0,TxEn=0,RxEn=0;
 //-----------------------------------------------------------------------------
 // MAIN Routine
 //-----------------------------------------------------------------------------
 void main (void)
 {
 PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
 // enable)
 PORT_Init(); // Initialize Port I/O
 SYSCLK_Init (); // Initialize Oscillator
 UART0_Init();
 P2=0x00;
 EA = 0;
 MCE0 = 0;
 RI0=0;
 TI0=0;
 
 while (1)
 {
 RxEn=1;
 while(stop!=1) // пока не передана посылка - остаемся в цикле
 {
 while(RxEn==1) // разрешаем обработку приема
 {
 REN0=1; // разрешаем прием по UART
 if(RI0==1) // как только пришел стоп-бит то...
 {
 UART_Buffer[i]=SBUF0; // помещаем первый принятый байт в ячейку 0 массива
 i++; // переходим к следующей ячейке
 RI0=0; // сбрасываем флаг для прием сделующего байта
 if (i==3) // если приняли 3 байта (заполненны 0...3 ячейки) то...
 {
 REN0=0; // запрещаем чтение по УАПП
 RxEn=0; // запрещаем обработку предыдущего оператора while
 TxEn=1; // разрешаем обработку оператора while, отвечающего за передачу MCU->CPU
 i=0; // сбрасываем номер ячейки массива данных УАППа
 }
 RI0=0; // обнуляем флаг
 }
 while (TxEn==1) // обрабатываем передачу данных MCU->CPU
 {
 SBUF0=UART_Buffer[i]; // помещаем первый байт из ячекий 0 массива принятых данных
 if(TI0==1) // при окончании передачи...
 {
 i++; // перемещаемся значение переменной на следующию ячейку массива
 TI0=0; // сбрасываем флаг для следующей передачи
 if (i==3) // если переданны все байты (из ячеек 0...3 массива) то....
 {
 i=0; // обнуляемся
 stop=1; // выходим из цикла
 TxEn=0; // запрещаем обработку передачи (можно и без него)
 }
 }
 }
 
 }
 }
 }
 }
Скрин того что передаю/принимаю

