Raspberry Pi SPI

Всем доброго времени суток) сегодня с вами мы будем осваивать SPI под Raspberry. Как и во всех статьях для новичков, приведём для начала диаграмму, иллюстрирующую работу протокола.

В принципе, ничего сложного нет. По этому же протоколу работает сдвиговый регистр.

Теперь что касается Raspbery. В библиотеке WiringPi есть удобная функция для работы с интерфейсом. Её прототип:
int SPIDataRW( byte& date[],int length);
Она принимает указать на массив байтов первым параметром и длину посылки вторым (массив может быть много больше самой посылки)

Надеюсь, вы помните, что имя массива в Си является указателем на его нулевой элемент?)

Если нет, то рекомендую вам подтянуть С/С++, новичку подойдут книги Герберта Шилдта «С++ Базовый курс» и «С++ шаг за шагом»

Создадим файл test.cpp и добавим в него следующие строки:


#include <iostream>
#include <fstream>
#include <cstdlib>
#include <clocale>
#include <errno.h>
#include <cstring>
#include <stdio.h>
#include <unistd.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
using namespace std;

static const int CHANNEL = 0;
static const int SPEED = 5000;
static const int CE = 28; //GPIO_20

int fd, result;
unsigned char data = 'A';

bool works = true;

char sequence[10];
char rotate[4];
char tilt[4];

int pin[] = {29, 25, 24, 23, 22, 21, 27, 26, 28};

int main(void){

wiringPiSetup();

//initialazing pins
for (int i = 0; i < 9; i++)
{
pinMode(pin[i], OUTPUT);
digitalWrite(pin[i], 0);
}

pinMode(CE, OUTPUT);
fd = wiringPiSPISetup(CHANNEL, SPEED);
cout << "Init result: " << fd << endl;

while (works){

try
{
ifstream in_range("range.txt");
in_range >> rotate; //строки
in_range >> tilt;

cout << "\r\nString read from 'range.txt': ";
cout << rotate << " " << tilt << endl;

int len = strlen(rotate);
cout << "String length: " << len << endl;

int rotate_int = atoi(rotate); //Целые
int tilt_int = atoi(tilt);

cout << "\r\n" << "Integers: " << rotate_int << " " << tilt_int << "\r\n";

digitalWrite(CE, 1);
data = '/';
wiringPiSPIDataRW(CHANNEL, &data, 1);
delay(5);

unsigned char a = (char)rotate_int;
cout << "Unsigned char a: " << a << endl;
wiringPiSPIDataRW(CHANNEL, &a, 1);
delay(5);

unsigned char b = (char)tilt_int;
cout << "Unsigned char b: " << b << endl;
wiringPiSPIDataRW(CHANNEL, &b, 1);
digitalWrite(CE, 0);
delay(5);
}
catch(...)
{
cout << "Caught an exception in range) ";
}

}//while
return 0;
}

Обратите внимание, мы дефайним константы номера канала и скорости передачи данных
И конечно надо не забыть подключить оба заголовочных файла и произвести вызов wiringpiSetup();
Если у вас есть осциллограф, подкоючайте его к пинам указанным на рисунке. Если нет — читайте эту статью (если нет осциллографа) Вуа ля!
В следующей статье поговорим о том, как подключить по spi raspberry к arduino в режиме slave и как избавиться от наводок и искажения данных 🙂
UDP: По просьбам трудящихся напомню, что для использования интерфейса его необходимо включить. Для этого в raspi-config выставляем значение поля «Enable SPI» — Yes.

Raspberry Pi SPI: 3 комментария

  1. tweek

    You need to load the ‘spidev’ module to get userspace spi device access, in the same way the i-dev module provides userspace i access. Try «modprobe spidev».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.