отлаживаю связь между двумя ATMega8 через SPI (стенд на изображении в прицепе )
Наблюдаю следующую картину:
при тестировании идет в прерывании таймера посылка 2х байт:
Код
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
...
SPI_MasterTransmit(12);
SPI_MasterTransmit(13);
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
...
SPI_MasterTransmit(12);
SPI_MasterTransmit(13);
а в Slave прием:
Код
SIGNAL (SPI_STC_vect)
{
spi_input = SPDR;
SPDR = 111; //отсыл в ответ
Spiarr[Spiarc] = spi_input;// читаем принятое в массив
Spiarc = Spiarc + 1;// увеличиваем индекс массива приемника
if (Spiarc == 2) // когда = 2 то анализируем принятый "пакет"
{
Spiarc = 0;
if ((Spiarr[0] == 12)&&(Spiarr[1]==13))
{
PORTB ^= (1<<1);// мигаем если пришло то что отправляли
}
}
}
{
spi_input = SPDR;
SPDR = 111; //отсыл в ответ
Spiarr[Spiarc] = spi_input;// читаем принятое в массив
Spiarc = Spiarc + 1;// увеличиваем индекс массива приемника
if (Spiarc == 2) // когда = 2 то анализируем принятый "пакет"
{
Spiarc = 0;
if ((Spiarr[0] == 12)&&(Spiarr[1]==13))
{
PORTB ^= (1<<1);// мигаем если пришло то что отправляли
}
}
}
светодиод первое время мигает - т.е. принимает данные, но через минут 5 потоковой пересылки, с частотой отправки 1 кГц светодиод гаснет - т.е. данные приняты со сбоем или не приняты.
Ощущение такое что накапливается какаято ошибка в отправке.
Свойственно ли это spi ? Поддерживает ли он потоковую пердачу без ошибок ?
С чем это может быть связано ? Можно SPI вести проводами или это целиком наплатный интерфейс ?
В будущем нужно будет связывать ATMega8 с CAN-контроллером (для выхода на CAN-шину) - планировал разместить их на разных платах и кинуть шлейфом, можно ли так делать ?
Спасибо