Программа рассчитана для 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; // запрещаем обработку передачи (можно и без него)
}
}
}
}
}
}
}
Скрин того что передаю/принимаю