ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
1084089
POV_ (07.03.2021 15:52, просмотров: 294)
С8051 - не могу одну фигню с SPI забороть... 

вот функция передачи байта


void spi_SendByte(BYTE b) 
{
  SFRPAGE = SPI0_PAGE;
  SPI0CN &= 0x0F;
  SPI0DAT = b;
  while (!SPIF); 
}

Накладные для подготовки передаваемого байта составляют порядка 50% от длительность передачи. Вот хорошо бы данные готовить пока предыдущий байт передаётся. Очевидное решение вот такое (флаг SPIF устанавливается только по окончании передачи либо по коллизии)


void spi_SendByte(BYTE b) 
{ 
  SFRPAGE = SPI0_PAGE; 
  while (!SPIF); // сюда переместил. перед передачей самого первого байта флаг взвожу ручками
  SPI0CN &= 0x0F; 
  SPI0DAT = b; 
}

И не работает! Сделал вдогонку обработку флага коллизий WCOL, флага занятости SPIBSY .. не работает и всё. Я в глаза долблюсь, что-то очевидное не замечаю?