Помощь в понимании последовательной связи (SPI) на Arduino Mega

Поэтому я пытаюсь перевести некоторый код для работы ЖК-дисплея с Arduino на C для MSP430F5529. ЖК-дисплей использует SPI для связи, и я не совсем понимаю, как этот код заставляет Arduino правильно взаимодействовать с ним, и надеялся, что кто-то с приличным опытом работы с Arduino сможет объяснить некоторые вещи (я никогда не использовал их). В конце я привел ссылку на всю программу на pastebin, но сейчас я сосредоточен на этом разделе:

void comm_out(char c)
{
  int i;
  digitalWrite(CS, LOW);
  digitalWrite(AO, LOW);
  for(i=0;i<8;i++)
  {
    if((c&0x80) == 0x80)
    {
      PORTA |= 0x80;
      PORTA &= ~0x40;
      PORTA |= 0x40;
    }
    else
    {
      PORTA &= ~0x80;
      PORTA &= ~0x40;
      PORTA |= 0x40;
    } 
    c = c<<1;
  }
  digitalWrite(CS, HIGH);
  digitalWrite(AO, HIGH);
}

Поэтому я понимаю любой код, который связан с настройкой некоторых цифровых выводов на Arduino (похоже, они выводятся только когда-либо, потому что программа никогда не устанавливает для них направление) на высокий или низкий, поскольку это довольно просто, но я не совсем понимаю, что делает цикл for с точки зрения SPI.

Я понимаю, что функция делает напрямую. Он получает 8-битный ввод, который, как он решил, был символом (хотя это на самом деле не имеет значения) и проверяет, является ли первый бит 1 или 0. Если он равен 1, он устанавливает PORTA на следующие три шага.:

1: 1xxx xxxx 2: 10xx xxxx 3: 11xx xxxx

и если это 0, то он устанавливает PORTA в следующие 3 шага:

1: 0xxx xxxx 2: 00xx xxxx 3: 01xx xxxx

Затем он сдвигает вход так, чтобы следующий бит был самым старшим, и выполняет проверку снова, пока не будут проверены все 8 бит. Но я понятия не имею, что это делает с Arduino, которая заставляет его правильно связываться с LCD через последовательный порт. Из всей документации, которую я проверял, я даже не могу определить, что такое PORTA. Я предполагал, что он может быть сопоставлен с каким-то модулем для последовательной связи, но это не похоже на это.

Еще одна вещь, которая меня смутила, были заявления наверху

int SCLK = 28; // SCL signal connected to digital pin 28 of Arduino Mega     
int SI = 29; // SI signal connected to digital pin 29 of Arduino Mega     
int CS = 30; // CS signal connected to digital pin 30 of Arduino Mega     
int RES = 31; // RES signal connected to digital pin 31 of Arduino Mega     
int AO = 32; // A0 signal connected to digital pin 32 of Arduino Mega

A0, RES и CS все в порядке, потому что это просто статические контакты, которые настроены для отключения, но SI должен быть последовательным входом, а SCLK должен быть тактовым сигналом для SPI, но, насколько я могу судить, порты документации 28 и 29 не являются чем-то особенным, а являются общими портами ввода / вывода.

Вот карта портов, на которую я ссылался: http://pighixxx.com/atmega2560v3_0.pdf

Вот ссылка на весь код: http://pastebin.com/DxMGJZDu

Любой совет или, скорее, что-нибудь? Я изо всех сил пытаюсь понять это.

1 ответ

Решение

Этот код реализует SPI с битами, которые

является техникой для последовательной связи с использованием программного обеспечения вместо выделенного оборудования. Программное обеспечение непосредственно устанавливает и измеряет состояние выводов на микроконтроллере и отвечает за все параметры сигнала: синхронизацию, уровни, синхронизацию и т. Д.

В SPI приемное устройство считывает состояние линии данных, когда на линии тактирования происходит определенный фронт (подъем или падение; возможен любой из них, в зависимости от устройства).

Для каждого бита этот код устанавливает значение строки данных, а затем циклически переводит тактовую линию в низкое и высокое значение.

Другие вопросы по тегам