smartleds (17.11.2006 12:56, просмотров: 1862)
Вопрос по UART0 в LPC2138 Поставили задачу перевести приемник DMX512 с Atmega16 на LPC2138
Формат пакета такой первым идет низкий сигнал break , потом высокий MaB, далее нулевой старт байт, после байты данных, которых может быть от 1 до 512.
1). сигнал break от 88us до 1s лучше от 100-200us
2). MaB (Mark After Break) 8us и более лучше 44us
3). При передачи байта первым идет младший бит
При приеме первым принимкется байт без стоп бита, т.е. стоит флажок FE (Frame error), таким образом определяю сигнал break (это начало пакета), далее принимаю уже остальные байты.
На меге все работало, написал тоже для LPC2138, работает, но половину байт теряется.
например так если по DMX идет последовательность 1,2,3,4....255, то принимаю что то подобное 20,41, 56, 69...240 , т.е часть байт пропущена. Причем это видимо не всегда определяется сигнал break начало пакета, пото-му что если передавать просто по UART, то все передается нормально, с чем это связано не могу понять.
Сама программа вот
PINSEL0_bit.P0_0 = 1;// TXD0 output
PINSEL0_bit.P0_1 = 1;// RXD0 input
//set Line Control Register (8 bit, 1 stop bit, no parity, enable DLAB)
U0LCR_bit.DLAB = 1; //enable DLAB
U0LCR_bit.WLS = 3; //8 bit
U0LCR_bit.SBS = 0; //1 stop bit
U0LCR_bit.PE = 0; //no parity
divisor=3; // 250k, frequence VPB 12 MHz
U0DLM = divisor/256; //highbyte
U0DLL = divisor%256 ; //lowbyte
U0LCR_bit.DLAB = 0; //disable DLAB
//-----------------------------------
U0FCR_bit.FCRFE = 1; //FIFO Enable
amountchannels_rec=3;
while(1)
{//0
if(U0LSR_bit.DR > 0) // yes--> contains valid data
{//1
intoccursuart=1;
if(U0LSR_bit.FE > 0) //Yes--> framing error
{//2
fe_flag=1;
badbyte=U0RBR;
}//2
else {//2
curbyte=U0RBR;
}//2
}//1
if (intoccursuart==1) {//1
intoccursuart=0;
if ( (fe_flag==1)&&(badbyte==0) )
{//2
//--------------------------------------------------
curpos=0;
badbyte=2;
startcodeskip=1;
goto exit6;
}//2
if ( (curpos==0)&&(startcodeskip==1) ) {
startcodeskip=0;
goto exit6;
}
if (curpos<3)
{//1
switch (curpos)
{//case
case 0: {
PWMMR2 = curbyte;
setbit (PWMLER,2); //Enable PWM
break;
}
case 1: {
PWMMR5 = curbyte;
setbit (PWMLER,5); //Enable
break;
}
case 2: {
PWMMR6 = curbyte;
PWMLER_bit.EM6L =1;
break;
}
default:{
break;
}
curpos++;
exit6:
}//1 end intoccursuart
И еще не пойму зачем нужен FIFO, по UART без него передается, а если его не включать, U0FCR_bit.FCRFE = 1; //FIFO Enable
то FE не определяется.