Всем привет. Делаю простенький бортовой комп, который берет данные из ECU по к-line. Для приема данных создал кольцевой буфер. Данные в него кладу во время прерывания по Rx. Когда я начинаю передавать данные, то ECU кидает мне эхо. Мне это эхо мешает обрабатывать принятые данные. Я пытался отключать прерывания по приему данных во время передачи своих данных. Пытался отключать бит RXCIE0 во время передачи данных. Все равно это от ECU оказывается в кольцевом приемном буфере. Подскажите, где я туплю?
Код:
ISR(USART_RX_vect)
{
Put_Byte(UDR0);
}
void USART_Transmit(uint8_t data)
{ UCSR0B &= ~(1<<RXCIE0);
UCSR0B &= ~(1<<RXEN0);
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
UCSR0B |= (1<<RXEN0);
UCSR0B|=(1<<RXCIE0);
}
uint8_t USART_Receive(void)
{
while (!(UCSR0A & (1<<RXC0)));
return UDR0;
}
void USART_Flus_cycleBuf(void)
{
tail = 0;
head = 0;
rxcount = 0;
}
uint8_t USART_GetRxCount(void)
{
return rxcount;
}
void Put_Byte(uint8_t dt)
{
if (rxcount < SIZE_BUF)
{
cycleBuf[tail] = dt;
rxcount++;
tail++;
if (tail == SIZE_BUF) tail = 0;
}
}
uint8_t Get_Byte(void)
{
uint8_t dt = 0;
if (rxcount > 0)
{
dt = cycleBuf[head];
rxcount--;
head++;
if (head == SIZE_BUF) head = 0;
return dt;
}
return 0;
}
void KWPconnect(void)
{
blockCounter = 0;
currAddr = 0;
uint8_t i=0;
uint8_t s[3];
if (connect_ok==0 && connect_ini==1)
{
while(USART_GetRxCount()>0)
{
s[i]=Get_Byte();
i++;
}
}
if ( (s[0]==0x55) && (s[1]==0x01) && (s[2]==0x8A) )
{
blockCounter++;
currAddr = 1;
uint8_t a=s[2];
a=a^0xFF;
USART_Transmit(a);
connect_ok=1;
}
}
while
{
KWPconnect();
}
В итоге в cycleBuf попадает ответ от ECU, который я пытаюсь игнорить
Добавлено after 5 hours 50 minutes 46 seconds:Решено. K-line устроен таким образом, что при отправки данных по пину TX на пине RX всегда такие же данные. Поэтому эти данные всегда будут присутствовать в приемном регистре UDR0. Проблему решил так:
Код:
void USART_Transmit(uint8_t data)
{
UCSR0B &=~(1<<RXCIE0);
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
data=USART_Receive();
UCSR0B |=(1<<RXCIE0);
}