ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
74169
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 не определяется.